Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz

Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz
Har safar elektr va suv uchun to‘lov olganimda hayron qolaman – mening oilam haqiqatan ham shuncha ko‘p iste’mol qiladimi? Xo'sh, ha, hammomda issiq zamin va qozon bor, lekin ular doimo olov yoqmaydi. Biz ham suvni tejashga o'xshaymiz (garchi biz hammomda chayqalishni yaxshi ko'ramiz). Bir necha yil oldin men allaqachon ulangan suv hisoblagichlari и elektr energiyasi aqlli uyga, lekin bu erda narsalar tiqilib qoldi. Biz endigina iste'molni tahlil qilishga kirishdik, bu maqola aslida nima haqida.

Men yaqinda aqlli uy tizimi sifatida Home Assistant-ga o'tdim. Buning sabablaridan biri har xil turdagi grafiklarni qulay tarzda qurish qobiliyatiga ega bo'lgan katta hajmdagi ma'lumotlarni to'plashni tashkil qilish imkoniyati edi.

Ushbu maqolada tasvirlangan ma'lumotlar yangi emas, bularning barchasi turli xil soslar ostida Internetda allaqachon tasvirlangan. Lekin har bir maqola odatda faqat bitta yondashuv yoki jihatni tasvirlaydi. Men ushbu yondashuvlarning barchasini taqqoslab, o'zimga eng mosini tanlashim kerak edi. Maqolada hali ham ma'lumotlar to'plash bo'yicha to'liq ma'lumot berilmagan, lekin men buni qanday qilganimning bir turi. Shuning uchun konstruktiv tanqid va takomillashtirish bo'yicha takliflar qabul qilinadi.

Muammoni shakllantirish

Shunday qilib, bugungi mashg'ulotning maqsadi suv va elektr energiyasini iste'mol qilishning chiroyli grafiklarini olishdir:

  • 2 kun davomida soatiga
  • 2 hafta davomida har kuni
  • (ixtiyoriy) haftalik va oylik

Buning uchun ba'zi qiyinchiliklar mavjud:

  • Standart diagramma komponentlari odatda juda yomon. Eng yaxshi holatda, siz nuqta-nuqta chiziqli grafik yaratishingiz mumkin.

    Agar siz etarlicha qarasangiz, standart diagrammaning imkoniyatlarini kengaytiradigan uchinchi tomon komponentlarini topishingiz mumkin. Uy yordamchisi uchun, qoida tariqasida, bu yaxshi va chiroyli komponent mini grafik karta, lekin u ham biroz cheklangan:

    • Chiziqli diagrammaning parametrlarini katta oraliqlarga o'rnatish qiyin (barning kengligi soatning kasrlarida o'rnatiladi, ya'ni bir soatdan uzunroq intervallar kasr sonlarida o'rnatiladi)
    • Bitta grafikga turli ob'ektlarni qo'sha olmaysiz (masalan, harorat va namlik yoki chiziqli chiziq bilan birlashtiring)
  • Uy yordamchisi sukut bo'yicha nafaqat eng ibtidoiy SQLite ma'lumotlar bazasidan foydalanadi (va men usta, MySQL yoki Postgres-ni o'rnatishni bajara olmadim), lekin ma'lumotlar eng maqbul tarzda saqlanmaydi. Shunday qilib, masalan, har safar parametrning eng kichik raqamli parametrini o'zgartirganingizda, ma'lumotlar bazasiga taxminan bir kilobayt o'lchamdagi ulkan json yoziladi.
    {"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}}}

    Menda juda ko'p sensorlar mavjud (har bir xonada harorat sensori, suv va elektr hisoblagichlari), ba'zilari esa juda ko'p ma'lumotlarni ishlab chiqaradi. Misol uchun, SDM220 elektr hisoblagichining o'zi har 10-15 soniyada o'nga yaqin qiymatlarni ishlab chiqaradi va men 8 taga yaqin bunday hisoblagichlarni o'rnatmoqchiman.Shuningdek, boshqa sensorlar asosida hisoblangan ko'plab parametrlar mavjud. Bu. bu qiymatlarning barchasi ma'lumotlar bazasini kuniga 100-200 MB ga osongina to'ldirishi mumkin. Bir hafta ichida tizim zo'rg'a harakat qiladi va bir oy ichida flesh-disk o'ladi (odatda Raspberry PI-da uy yordamchisi o'rnatilganda) va ma'lumotlarni bir yil davomida saqlash haqida gap bo'lmaydi.

  • Agar omadingiz bo'lsa, hisoblagichingiz iste'molni o'zi hisoblashi mumkin. Siz istalgan vaqtda hisoblagichga murojaat qilishingiz va to'plangan iste'mol qiymati qancha vaqt ekanligini so'rashingiz mumkin. Qoida tariqasida, raqamli interfeysga ega bo'lgan barcha elektr hisoblagichlari (RS232/RS485/Modbus/Zigbee) bu imkoniyatni ta'minlaydi.

    Agar qurilma oddiygina bir lahzali parametrni (masalan, bir lahzali quvvat yoki oqim) o'lchashi mumkin bo'lsa yoki shunchaki har X vatt-soat yoki litrda impulslar hosil qilsa, bundan ham yomoni. Keyin uni qanday va nima bilan birlashtirish va qayerda qiymat to'plash haqida o'ylashingiz kerak. Har qanday sababga ko'ra keyingi hisobotni o'tkazib yuborish xavfi mavjud va umuman tizimning aniqligi savollar tug'diradi. Siz, albatta, bularning barchasini uy yordamchisi kabi aqlli uy tizimiga topshirishingiz mumkin, ammo hech kim ma'lumotlar bazasidagi yozuvlar soni haqidagi fikrni bekor qilmagan va sensorlarni soniyada bir martadan ko'proq so'rash mumkin bo'lmaydi (a uy yordamchisi arxitekturasining cheklanishi).

Yondashuv 1

Birinchidan, uy yordamchisi qutidan nimani taqdim etishini ko'rib chiqaylik. Bir muddat davomida iste'molni o'lchash juda talab qilinadigan funksiyadir. Albatta, u uzoq vaqt oldin maxsus komponent - utility_meter shaklida amalga oshirilgan.

Komponentning mohiyati shundan iboratki, u ichki ravishda joriy_to'plangan_qiymat o'zgaruvchisini yaratadi va ma'lum vaqtdan keyin (soat/hafta/oy) uni qayta o'rnatadi. Komponentning o'zi kirish o'zgaruvchisini (ba'zi sensorlarning qiymatini) kuzatadi, qiymatdagi o'zgarishlarga obuna bo'ladi - siz shunchaki tayyor natijaga erishasiz. Bu narsa konfiguratsiya faylida bir necha satrda tasvirlangan

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

Bu erda sensor.water_meter_cold - bu men qabul qiladigan litrdagi joriy hisoblagich qiymati to'g'ridan-to'g'ri temir bo'lagidan mqtt tomonidan. Dizayn ikkita yangi water_cold_hour_um va water_cold_day_um sensorlarini yaratadi, ular soatlik va kunlik ko'rsatkichlarni to'playdi va muddat tugagandan keyin ularni nolga qaytaradi. Mana yarim kunlik batareyaning soatlik grafigi.

Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz

Lovelace-UI uchun soatlik va kunlik grafiklar uchun kod quyidagicha ko'rinadi:

      - 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

Aslida, ushbu yondashuv bilan bog'liq muammo ushbu algoritmda yotadi. Yuqorida aytib o'tganimdek, har bir kirish qiymati uchun (har bir keyingi litr uchun joriy hisoblagich ko'rsatkichi) ma'lumotlar bazasida 1 kb yozuvlar yaratiladi. Har bir kommunal hisoblagich ham yangi qiymatni yaratadi, u ham bazaga qo'shiladi. Agar men soatlik / kunlik / haftalik / oylik ko'rsatkichlarni va bir nechta suv ko'targichlarini yig'ishni va elektr hisoblagichlarini qo'shishni istasam, bu juda ko'p ma'lumotlar bo'ladi. Aniqrog'i, ma'lumotlar juda ko'p emas, lekin uy yordamchisi ma'lumotlar bazasiga bir nechta keraksiz ma'lumotlarni yozganligi sababli, ma'lumotlar bazasi hajmi keskin o'sadi. Men haftalik va oylik jadvallar uchun bazaning hajmini taxmin qilishdan ham qo'rqaman.

Bundan tashqari, kommunal hisoblagich o'z-o'zidan muammoni hal qilmaydi. Foydali hisoblagich tomonidan ishlab chiqarilgan qiymatlar grafigi har soatda 0 ga tiklanadigan monoton ravishda o'sib boruvchi funktsiyadir. Bizga foydalanuvchi uchun tushunarli bo'lgan iste'mol jadvali kerak, bu davrda qancha litr iste'mol qilinganligini ko'rsatadi. Standart tarix-grafik komponenti buni qila olmaydi, lekin mini-grafik-karta tashqi komponenti bizga yordam berishi mumkin.

Bu lovelace-UI uchun karta kodi:

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

Sensor nomi, grafik turi, rangi (menga standart apelsin yoqmadi) kabi standart sozlamalarga qo'shimcha ravishda 3 ta parametrga e'tibor qaratish lozim:

  • group_by:hour — grafik soat boshiga toʻgʻrilangan chiziqlar bilan hosil boʻladi
  • ball_per_hour: 1 - har soat uchun bir bar
  • Va eng muhimi, aggregate_func: max - har bir soat ichida maksimal qiymatni oling. Aynan shu parametr arra tishlari grafigini barga aylantiradi

Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz

Chapdagi ustunlar qatoriga e'tibor bermang - agar ma'lumot bo'lmasa, bu komponentning standart harakati. Ammo hech qanday ma'lumot yo'q edi - men ushbu maqola uchun faqat bir necha soat oldin kommunal hisoblagich ma'lumotlarini yig'ishni yoqdim (hozirgi yondashuvimni quyida tasvirlab beraman).

Ushbu rasmda men ba'zida ma'lumotlar displeyi ishlashini va barlar aslida to'g'ri qiymatlarni aks ettirishini ko'rsatmoqchi edim. Lekin bu hammasi emas. Ba'zi sabablarga ko'ra, soat 11 dan 12 gacha bo'lgan davrda tanlangan ustun 19 litrni ko'rsatadi, garchi tishli grafikda xuddi shu sensordan xuddi shu davr uchun bir oz yuqoriroq bo'lsa-da, biz 62 litr iste'molni ko'ramiz. Yo xato bor yoki qo'llar qiyshiq. Ammo o'ng tarafdagi ma'lumotlar nima uchun buzilganligini hali ham tushunmayapman - u erda iste'mol normal edi, bu tishli grafikdan ham ko'rinadi.

Umuman olganda, men bu yondashuvning ishonchliligiga erisha olmadim - grafik deyarli har doim qandaydir bid'atni ko'rsatadi.

Kunduzgi sensor uchun o'xshash kod.

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

E'tibor bering, group_by parametri intervalga o'rnatilgan va ball_per_hoot parametri hamma narsani boshqaradi. Va bu komponent bilan bog'liq yana bir muammo yotadi - point_per_hour bir soat yoki undan kamroq diagrammalarda yaxshi ishlaydi, lekin u kattaroq intervallarni o'zlashtiradi. Shunday qilib, bir kunda bitta ustunni olish uchun men 1/24=0.04166666 qiymatini kiritishim kerak edi. Men hatto haftalik va oylik jadvallar haqida gapirmayapman.

Yondashuv 2

Hali ham uy yordamchisini tushunib, men ushbu videoga duch keldim:


Do'stingiz bir nechta turdagi Xiaomi rozetkalaridan iste'mol ma'lumotlarini to'playdi. Uning vazifasi biroz sodda - bugungi, kechagi va oy uchun iste'mol qiymatini ko'rsatish kifoya. Jadval talab qilinmaydi.

Bir lahzali quvvat qiymatlarini qo'lda integratsiya qilish haqida munozaralarni chetga surib qo'yamiz - men ushbu yondashuvning "aniqligi" haqida yuqorida yozganman. Xuddi shu savdo nuqtasida yig'ilgan iste'mol qiymatlarini nima uchun ishlatmaganligi aniq emas. Menimcha, apparat ichidagi integratsiya yaxshiroq ishlaydi.

Videodan biz iste'molni bir muddat davomida qo'lda hisoblash g'oyasini olamiz. Yigit faqat bugungi va kechagi qiymatlarni hisoblaydi, lekin biz oldinga boramiz va grafik chizishga harakat qilamiz. Mening ishimda taklif qilingan usulning mohiyati quyidagicha.

Keling, o'zgarmaydigan qiymatni yarataylik_soat_boshida, unga joriy hisoblagich ko'rsatkichlarini yozamiz
Taymerdan foydalanib, soat oxirida (yoki keyingi boshida) biz joriy o'qish va soat boshida saqlangan o'rtasidagi farqni hisoblaymiz. Bu farq joriy soat uchun iste'mol bo'ladi - biz qiymatni sensorga saqlaymiz va kelajakda biz ushbu qiymat asosida grafik tuzamiz.
Shuningdek, u yerda joriy hisoblagich qiymatini yozib, qiymat_at_beginning_of_hour o'zgaruvchisini "qayta tiklash" kerak.

Bularning barchasi uy yordamchisining o'zi orqali amalga oshirilishi mumkin.

Oldingi yondashuvga qaraganda bir oz ko'proq kod yozishingiz kerak bo'ladi. Birinchidan, keling, xuddi shu "o'zgaruvchilar" ni yarataylik. Bizda "o'zgaruvchan" ob'ekt yo'q, lekin biz mqtt brokerining xizmatlaridan foydalanishimiz mumkin. Biz u yerga qiymatlarni retain=true bayrog'i bilan yuboramiz - bu broker ichidagi qiymatni saqlaydi va uni istalgan vaqtda, hatto uy yordamchisi qayta ishga tushirilganda ham olib tashlash mumkin. Men bir vaqtning o'zida soatlik va kunlik hisoblagichlarni yasadim.

- 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

Barcha sehrlar mos ravishda har soat va har kecha ishlaydigan avtomatlashtirishda sodir bo'ladi.

- 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

Ikkala avtomatlashtirish ham 2 ta amalni bajaradi:

  • Intervalning qiymatini boshlang'ich va yakuniy qiymatlar orasidagi farq sifatida hisoblang
  • Keyingi interval uchun asosiy qiymatni yangilang

Bu holda grafiklarni qurish odatiy tarix-grafik bilan hal qilinadi:

      - 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

Bu shunday ko'rinadi:

Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz

Aslida, bu allaqachon kerak bo'lgan narsa. Ushbu usulning afzalligi shundaki, ma'lumotlar har bir intervalda bir marta hosil bo'ladi. Bular. soatlik grafik uchun kuniga atigi 24 ta yozuv.

Afsuski, bu hali ham o'sib borayotgan bazaning umumiy muammosini hal qilmaydi. Agar men oylik iste'mol grafigini xohlasam, kamida bir yil davomida ma'lumotlarni saqlashim kerak. Va uy yordamchisi butun ma'lumotlar bazasi uchun faqat bitta saqlash muddatini ta'minlaganligi sababli, bu tizimdagi HAMMA ma'lumotlar butun yil davomida saqlanishi kerakligini anglatadi. Misol uchun, men bir yilda 200 kub metr suv iste'mol qilaman, bu ma'lumotlar bazasiga 200000 XNUMX yozuvni bildiradi. Va agar siz boshqa sensorlarni hisobga olsangiz, unda bu raqam odatda nomaqbul bo'ladi.

Yondashuv 3

Yaxshiyamki, aqlli odamlar InfluxDB ma'lumotlar bazasini yozish orqali allaqachon bu muammoni hal qilishgan. Ushbu ma'lumotlar bazasi vaqtga asoslangan ma'lumotlarni saqlash uchun maxsus optimallashtirilgan va turli sensorlarning qiymatlarini saqlash uchun idealdir. Tizim shuningdek, ma'lumotlar bazasidan qiymatlarni ajratib olish va ularni turli usullar bilan jamlash imkonini beruvchi SQL-ga o'xshash so'rovlar tilini taqdim etadi. Nihoyat, turli ma'lumotlar turli vaqtlarda saqlanishi mumkin. Misol uchun, harorat yoki namlik kabi tez-tez o'zgarib turadigan ko'rsatkichlar bir necha hafta davomida saqlanishi mumkin, kunlik suv iste'moli ko'rsatkichlari esa butun yil davomida saqlanishi mumkin.

InfluxDB-dan tashqari, aqlli odamlar InfluxDB ma'lumotlari asosida grafiklar chizish uchun Grafana tizimini ham ixtiro qilishdi. Grafana har xil turdagi grafiklarni chizishi, ularni batafsil sozlashi mumkin va eng muhimi, bu grafiklarni lovelace-UI uy yordamchisiga “ulash” mumkin.

Ilhom oling shu yerda и shu yerda. Maqolalar InfluxDB va Grafana-ni uy yordamchisiga o'rnatish va ulash jarayonini batafsil tavsiflaydi. Men o'z muammomni hal qilishga e'tibor qarataman.

Shunday qilib, birinchi navbatda, influxDB-ga hisoblagich qiymatini qo'shishni boshlaylik. Uy yordamchisi konfiguratsiyasining bir qismi (ushbu misolda men nafaqat sovuq, balki issiq suv bilan ham zavqlanaman):

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

Keling, yana shishib ketmaslik uchun xuddi shu ma'lumotlarni ichki uy yordamchisi ma'lumotlar bazasiga saqlashni o'chirib qo'yaylik:

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

Keling, InfluxDB konsoliga o'tamiz va ma'lumotlar bazasini sozlaymiz. Xususan, ma'lum ma'lumotlar qancha vaqt saqlanishini sozlashingiz kerak. Bu deb atalmish tomonidan tartibga solinadi. saqlash siyosati - bu asosiy ma'lumotlar bazasidagi ma'lumotlar bazalariga o'xshaydi, har bir ichki ma'lumotlar bazasi o'z sozlamalariga ega. Odatiy bo'lib, barcha ma'lumotlar autogen deb nomlangan saqlash siyosatida saqlanadi; bu ma'lumotlar bir hafta davomida saqlanadi. Men soatlik ma'lumotlarning bir oy davomida saqlanishini, haftalik ma'lumotlarning bir yil davomida saqlanishini va oylik ma'lumotlarning hech qachon o'chirilmasligini xohlayman. Keling, tegishli saqlash siyosatini yarataylik

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

Endi, aslida, asosiy hiyla - doimiy so'rovlar yordamida ma'lumotlarni yig'ish. Bu so'rovni belgilangan vaqt oralig'ida avtomatik ravishda bajaradigan, ushbu so'rov uchun ma'lumotlarni jamlaydigan va natijani yangi qiymatga qo'shadigan mexanizm. Keling, misolni ko'rib chiqaylik (men o'qish uchun ustunga yozaman, lekin aslida men bu buyruqni bitta qatorga kiritishim kerak edi)

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

Bu buyruq:

  • Homeassistant ma'lumotlar bazasida cq_water_cold_hourly nomli doimiy so'rovni yaratadi
  • So'rov har soatda bajariladi (vaqt (1 soat))
  • So'rov homeassistant.autogen.l (litr) o'lchovidagi barcha ma'lumotlarni, shu jumladan sovuq va issiq suv ko'rsatkichlarini o'chiradi.
  • Yig'ilgan ma'lumotlar entity_id bo'yicha guruhlanadi, bu bizga sovuq va issiq suv uchun alohida qiymatlarni beradi
  • Litr hisoblagichi har soatda monoton ravishda ortib borayotgan ketma-ketlik bo'lganligi sababli, maksimal qiymatni olish kerak bo'ladi, shuning uchun yig'ish max(qiymat) funktsiyasi tomonidan amalga oshiriladi.
  • Yangi qiymat homeassistant.month.water_meter_hour manziliga yoziladi, bu erda oy bir oylik saqlash muddati bilan saqlash siyosatining nomidir. Bundan tashqari, sovuq va issiq suv haqidagi ma'lumotlar tegishli entity_id va qiymat maydonidagi qiymat bilan alohida yozuvlarga tarqaladi.

Kechasi yoki uyda hech kim yo'q bo'lganda, suv iste'moli bo'lmaydi va shuning uchun homeassistant.autogen.l saytida yangi yozuvlar mavjud emas. Oddiy so'rovlarda qiymatlarni yo'qotmaslik uchun siz to'ldirishdan (oldingi) foydalanishingiz mumkin. Bu InfluxDB ni oxirgi soat qiymatidan foydalanishga majbur qiladi.

Afsuski, uzluksiz so'rovning o'ziga xos xususiyati bor: to'ldirish (oldingi) hiylasi ishlamaydi va yozuvlar yaratilmaydi. Bundan tashqari, bu qandaydir hal qilib bo'lmaydigan muammo bir necha yillardan beri muhokama qilinmoqda. Biz bu muammoni keyinroq hal qilamiz, lekin to'ldirish(oldingi) doimiy so'rovda bo'lsin - bu xalaqit bermaydi.

Keling, nima bo'lganini tekshiramiz (albatta, siz bir necha soat kutishingiz kerak):

> 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

E'tibor bering, ma'lumotlar bazasidagi qiymatlar UTCda saqlanadi, shuning uchun bu ro'yxat 3 soatga farq qiladi - InfluxDB chiqishidagi 7am qiymatlari yuqoridagi grafiklardagi 10am qiymatlariga mos keladi. Shuni ham yodda tutingki, soat 2 dan 5 gacha hech qanday yozuvlar yo'q - bu doimiy so'rovning bir xil xususiyati.

Ko'rib turganingizdek, yig'ilgan qiymat ham monoton ravishda ortib borayotgan ketma-ketlikdir, faqat yozuvlar kamroq uchraydi - soatiga bir marta. Ammo bu muammo emas - biz grafik uchun to'g'ri ma'lumotlarni oladigan boshqa so'rovni yozishimiz mumkin.

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)

Men hal qilaman:

  • homeassistant.month.water_meter_hour ma'lumotlar bazasidan biz oxirgi kun uchun entity_id='water_meter_cold' ma'lumotlarini chiqaramiz (vaqt >= hozir() -24h).
  • Yuqorida aytib o'tganimdek, homeassistant.month.water_meter_hour ketma-ketligida ba'zi yozuvlar etishmayotgan bo'lishi mumkin. GROUP BY vaqti (1h) bilan soʻrovni bajarish orqali bu maʼlumotlarni qayta tiklaymiz. Bu vaqtni to'ldirish (oldingi) kutilganidek ishlaydi, etishmayotgan ma'lumotlarni yaratadi (funktsiya oldingi qiymatni oladi)
  • Ushbu so'rovdagi eng muhim narsa soat belgilari orasidagi farqni hisoblab chiqadigan farq funktsiyasidir. U o'z-o'zidan ishlamaydi va yig'ish funktsiyasini talab qiladi. Bu avval ishlatilgan max() bo'lsin.

Amalga oshirish natijasi shunday ko'rinadi

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

Soat 2 dan 5 gacha (UTC) iste'mol bo'lmadi. Shunga qaramay, so'rov to'ldirish (oldingi) tufayli bir xil iste'mol qiymatini qaytaradi va farq funktsiyasi bu qiymatni o'zidan olib tashlaydi va chiqish 0 bo'ladi, bu aynan talab qilinadigan narsadir.

Faqat grafik yaratish qoladi. Buning uchun Grafana-ni oching, mavjud (yoki yangi) boshqaruv panelini oching va yangi panel yarating. Diagramma sozlamalari shunday bo'ladi.

Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz

Xuddi shu grafikda sovuq va issiq suv ma'lumotlarini ko'rsataman. So'rov yuqorida aytib o'tganim bilan bir xil.

Displey parametrlari quyidagicha o'rnatiladi. Men uchun bu bosqichlar (zinapoyalar) bo'ylab ketadigan chiziqlar bilan grafik bo'ladi. Quyida Stack parametrini tushuntirib beraman. Quyida yana bir nechta displey variantlari mavjud, ammo ular unchalik qiziq emas.

Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz

Olingan jadvalni uy yordamchisiga qo'shish uchun sizga kerak:

  • diagrammani tahrirlash rejimidan chiqing. Ba'zi sabablarga ko'ra, to'g'ri diagramma almashish sozlamalari faqat asboblar paneli sahifasidan taklif etiladi
  • Grafik nomi yonidagi uchburchakni bosing va menyudan almashish-ni tanlang
  • Ochilgan oynada joylashtirish yorlig'iga o'ting
  • Joriy vaqt oralig'i belgisini olib tashlang - biz URL orqali vaqt oralig'ini o'rnatamiz
  • Kerakli mavzuni tanlang. Mening holatimda u engil
  • Olingan URL manzilini lovelace-UI sozlamalari kartasiga nusxalang

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

E'tibor bering, vaqt oralig'i (oxirgi 2 kun) asboblar paneli sozlamalarida emas, balki bu erda o'rnatiladi.

Grafik shunday ko'rinadi. Men oxirgi 2 kun ichida issiq suvdan foydalanmadim, shuning uchun faqat sovuq suv grafigi chiziladi.

Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz

Men hali o'zim uchun qaysi grafik menga ko'proq yoqishini hal qilmadim, chiziqli qadam yoki haqiqiy barlar. Shuning uchun, men oddiygina kundalik iste'mol jadvaliga misol keltiraman, faqat bu safar barlarda. So'rovlar yuqorida tavsiflanganlarga o'xshash tarzda tuzilgan. Ko'rsatish imkoniyatlari quyidagilardir:

Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz

Ushbu grafik quyidagicha ko'rinadi:

Aqlli uy: Biz Home Assistant-da suv va elektr iste'moli grafiklarini yaratamiz

Shunday qilib, Stack parametri haqida. Ushbu grafikda issiq suv ustunining ustiga sovuq suv ustuni chizilgan. Umumiy balandlik davr uchun sovuq va issiq suvning umumiy iste'moliga to'g'ri keladi.

Ko'rsatilgan barcha grafikalar dinamikdir. Siz sichqonchani qiziqtirgan nuqta ustiga olib borib, ma'lum bir nuqtada tafsilotlar va qiymatni ko'rishingiz mumkin.

Afsuski, malhamda bir-ikkita pashsha bor edi. Chiziqli diagrammada (qadam chiziqlari bo'lgan diagrammadan farqli o'laroq) chiziqning o'rtasi kunning o'rtasida emas, balki soat 00:00 da. Bular. ustunning chap yarmi oldingi kun o'rniga chiziladi. Shunday qilib, shanba va yakshanba uchun grafiklar mavimsi zonaning bir oz chap tomoniga chizilgan. Men uni qanday yengishimni tushunmagunimcha.

Yana bir muammo - oylik oraliqda to'g'ri ishlay olmaslik. Gap shundaki, soat/kun/haftaning uzunligi belgilangan, lekin oyning uzunligi har safar har xil. InfluxDB faqat teng oraliqlarda ishlashi mumkin. Hozirgacha mening miyam 30 kunlik belgilangan intervalni belgilash uchun etarli edi. Ha, grafik yil davomida bir oz suzadi va barlar oylarga to'liq mos kelmaydi. Ammo men bu narsaga shunchaki displey hisoblagichi sifatida qiziqqanim sababli, men bunga roziman.

Men kamida ikkita yechimni ko'raman:

  • Oylik jadvallardan voz keching va o'zingizni haftalik jadvallar bilan cheklang. Yil uchun 52 haftalik bar juda yaxshi ko'rinadi
  • Oylik iste'molning o'zini 2-usul sifatida ko'rib chiqing va grafana faqat chiroyli grafikalar uchun foydalaning. Bu juda aniq yechim bo'ladi. Taqqoslash uchun siz o'tgan yil uchun grafiklarni ham qo'yishingiz mumkin - grafana buni ham qila oladi.

xulosa

Nima uchunligini bilmayman, lekin men bunday grafiklarga berilib ketdim. Ular hayotning qizg'in pallada ekanligini va hamma narsa o'zgarayotganini ko'rsatadi. Kecha ko'p edi, bugun oz, ertaga boshqa narsa bo'ladi. Faqat uy xo'jaligi a'zolari bilan iste'mol mavzusida ishlash qoladi. Ammo hozirgi ishtaha bilan ham, to'lov varaqasidagi katta va tushunarsiz raqam allaqachon iste'molning tushunarli rasmiga aylanmoqda.

Deyarli 20 yillik dasturchi faoliyatimga qaramay, men ma'lumotlar bazalari bilan deyarli aloqa qilmadim. Shuning uchun, tashqi ma'lumotlar bazasini o'rnatish juda mavhum va tushunarsiz narsaga o'xshardi. Hammasini o'zgartirdi yuqoridagi maqola — ma'lum bo'lishicha, mos vositani biriktirish bir necha marta bosish bilan amalga oshiriladi va ixtisoslashtirilgan vosita yordamida diagrammalarni tuzish vazifasi biroz osonroq bo'ladi.

Sarlavhada men elektr energiyasini iste'mol qilishni eslatib o'tdim. Afsuski, hozircha men hech qanday grafiklarni taqdim eta olmayman. Bitta SDM120 metr men uchun o'ldi, ikkinchisi esa Modbus orqali kirganda glitches. Biroq, bu maqolaning mavzusiga hech qanday ta'sir ko'rsatmaydi - grafikalar suv bilan bir xil tarzda tuziladi.

Ushbu maqolada men o'zim sinab ko'rgan yondashuvlarni taqdim etdim. Albatta, men bilmagan ma'lumotlarni yig'ish va vizualizatsiya qilishni tashkil qilishning boshqa usullari mavjud. Bu haqda menga izohlarda ayting, men juda qiziqaman. Men konstruktiv tanqid va yangi g'oyalardan xursand bo'laman. Umid qilamanki, taqdim etilgan material ham kimgadir yordam beradi.

Manba: www.habr.com

a Izoh qo'shish