Ақылды үй: Home Assistant қолданбасындағы су мен электр қуатын тұтыну кестесі

Ақылды үй: 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) береді.

    Сорақысы, егер құрылғы қандай да бір лездік параметрді (мысалы, лездік қуат немесе ток) өлшей алса немесе жай ғана әрбір Х ватт-сағат немесе литр импульстарды шығарса. Содан кейін оны қалай және немен біріктіру керек және құндылықты қайда жинау керектігі туралы ойлану керек. Кез келген себеппен келесі есепті жіберіп алу қаупі бар және тұтастай алғанда жүйенің дәлдігі сұрақтар тудырады. Сіз, әрине, мұның бәрін үй көмекшісі сияқты смарт үй жүйесіне сеніп тапсыра аласыз, бірақ дерекқордағы жазбалар саны туралы мәселені ешкім жойған жоқ, ал дауыс беру сенсорлары секундына бір реттен көп жұмыс істемейді (үй көмекшісінің архитектурасының шектеуі).

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

Мұнда сенсор.water_meter_cold - бұл мен алатын метрдің литрдегі ағымдағы мәні тікелей темірден mqtt бойынша. Дизайн 2 жаңа water_cold_hour_um және water_cold_day_um датчиктерін жасайды, олар сағаттық және күнделікті көрсеткіштерді жинақтап, оларды кезеңнен кейін нөлге дейін қалпына келтіреді. Мұнда жарты күндегі сағаттық батареяның графигі берілген.

Ақылды үй: 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 параметрі интервалға орнатылғанын және point_per_home параметрі бәрін басқаратынын ескеріңіз. Және бұл құрамдастағы тағы бір мәселе - сағатына_бір сағатқа ұпайлар бір сағат немесе одан аз диаграммаларда жақсы жұмыс істейді, бірақ үлкен аралықтарда жиіркенішті. Сондықтан бір күнде бір баған алу үшін 1/24=0.04166666 мәнін енгізуім керек болды. Мен апталық және айлық диаграммалар туралы айтып отырған жоқпын.

2-тәсіл

Үй көмекшісін ойлап жатқанда мен мына бейнеге тап болдым:


Жолдас Xiaomi розеткаларының бірнеше түрінен тұтыну деректерін жинайды. Оның міндеті біршама қарапайым - тек бүгінгі, кешегі және айдағы тұтыну құнын көрсетіңіз. Диаграммалар қажет емес.

Лездік қуат мәндерін қолмен біріктіру туралы аргументтерді қалдырайық - мен бұл тәсілдің «дәлдігі» туралы жоғарыда жазғанмын. Қазірдің өзінде сол сауда нүктесінен жиналған жинақталған тұтыну құндылықтарын неге пайдаланбағаны түсініксіз. Менің ойымша, темір бөлігінің ішіндегі интеграция жақсы жұмыс істейді.

Бейнеден біз тұтынуды белгілі бір кезеңге қолмен санау идеясын аламыз. Ер адам үшін тек бүгінгі және кешегі құндылықтар қарастырылады, бірақ біз әрі қарай жүріп, графикті сызуға тырысамыз. Менің жағдайымда ұсынылған әдістің мәні келесідей.

Біз айнымалы мәнді_сағаттық_басында жасаймыз, онда ағымдағы есептегіш көрсеткіштерін жазамыз
Сағаттың соңындағы (немесе келесінің басындағы) таймерге сәйкес біз ағымдағы көрсеткіш пен сағаттың басында сақталған арасындағы айырмашылықты есептейміз. Бұл айырмашылық ағымдағы сағаттың тұтынуы болады - біз сенсорға мәнді сақтаймыз және болашақта осы мәнге негізделген графикті құрастырамыз.
Сондай-ақ, санауыштың ағымдағы мәнін сол жерге жазу арқылы value_at_beginning_of_hour айнымалы мәнін «қалпына келтіру» керек.

Мұның бәрін үй көмекшісінің көмегімен жақсы ... жасауға болады.

Алдыңғы тәсілге қарағанда сәл көбірек код жазуға тура келеді. Осы «айнымалылардан» бастайық. Қораптан тыс бізде «айнымалы» нысан жоқ, бірақ сіз 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 XNUMX жазбаны білдіреді. Егер сіз басқа сенсорларды ескерсеңіз, онда бұл көрсеткіш әдетте әдепсіз болады.

3-тәсіл

Бақытымызға орай, ақылды адамдар InfluxDB дерекқорын жазу арқылы бұл мәселені шешіп қойған. Бұл дерекқор уақытқа негізделген деректерді сақтау үшін арнайы оңтайландырылған және әртүрлі сенсорлардың мәндерін сақтау үшін өте қолайлы. Жүйе сонымен қатар дерекқордан мәндерді шығарып, содан кейін оларды әртүрлі тәсілдермен біріктіруге мүмкіндік беретін SQL тәрізді сұрау тілін ұсынады. Соңында, әртүрлі деректер әртүрлі уақыттарда сақталуы мүмкін. Мысалы, температура немесе ылғалдылық сияқты жиі өзгеретін көрсеткіштерді тек екі апта ғана сақтауға болады, ал суды тұтынудың күнделікті көрсеткіштерін бір жыл бойы сақтауға болады.

InfluxDB-тен басқа, ақылды адамдар InfluxDB деректерінен графиктер салуға арналған Grafana жүйесін де ойлап тапты. 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 консоліне өтіп, дерекқорымызды орнатайық. Атап айтқанда, белгілі бір деректердің қанша уақыт сақталатынын конфигурациялау қажет. Бұл деп аталатын реттеледі. сақтау саясаты - бұл негізгі дерекқордың ішіндегі дерекқорларға ұқсас, әрбір ішкі дерекқордың өз параметрлері бар. Әдепкі бойынша, барлық деректер автоген деп аталатын сақтау саясатына қосылады, бұл деректер бір апта бойы сақталады. Мен сағаттық деректердің бір ай бойы сақталуын, бір жыл бойы апталық деректердің және айлық деректердің мүлдем жойылмауын қалаймын. Біз тиісті сақтау саясатын жасаймыз

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

Бұл пәрмен:

  • Homeassistant дерекқорында cq_water_cold_hourly деп аталатын үздіксіз сұрау жасайды
  • Сұрау әр сағат сайын орындалады (уақыт (1 сағ))
  • Сұрау homeassistant.autogen.l (литр) ішінен барлық деректерді, соның ішінде суық және ыстық су көрсеткіштерін алып тастайды.
  • Жиынтық деректер entity_id бойынша топтастырылады, ол суық және ыстық су үшін бөлек мәндерді жасайды.
  • Литрлердің есептегіші әр сағат ішінде монотонды түрде өсетін тізбек болғандықтан, сіз максималды мәнді алуыңыз керек, сондықтан жинақтау max(value) функциясы арқылы орындалады.
  • Жаңа мән 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-ден XNUMX-ке дейін ешқандай жазбалар жоқ екенін ескеріңіз - бұл үздіксіз сұраудың ерекшелігі.

Көріп отырғаныңыздай, жинақталған мән де монотонды түрде өсетін дәйектілік болып табылады, тек жазбалар азырақ - сағатына бір рет. Бірақ бұл мәселе емес - біз диаграмма үшін дұрыс деректерді шығаратын басқа сұрауды жаза аламыз.

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сағ).
  • Мен айтып өткенімдей, homeassistant.month.water_meter_hour реттілігінде кейбір жазбалар жоқ болуы мүмкін. Біз бұл деректерді 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 әдіс ретінде қарастырыңыз және графананы тек әдемі графиктер үшін пайдаланыңыз. Бұл өте дәл шешім. Салыстыру үшін өткен жылдың диаграммаларын тіпті қабаттастыруға болады - графана мұны істей алады.

қорытынды

Неге екенін білмеймін, бірақ мен мұндай диаграммаларды жақсы көремін. Олар өмірдің қайнап жатқанын және бәрі өзгеретінін көрсетеді. Кеше көп болды, бүгін аз, ертең басқа болады. Тұтыну тақырыбы бойынша үй шаруашылықтарымен жұмыс істеу қалады. Бірақ қазіргі аппетитпен де, заң жобасындағы үлкен және түсініксіз фигура қазірдің өзінде тұтынудың түсінікті суретіне айналады.

Бағдарламашы ретіндегі 20 жылға жуық мансабыма қарамастан, мен дерекқорлармен іс жүзінде қиылыспадым. Сондықтан сыртқы дерекқорды орнату соншалықты түсініксіз және түсініксіз нәрсе сияқты көрінді. Барлығы өзгерді жоғарыдағы мақала - сәйкес құралды бұрау бір-екі рет басу арқылы орындалатыны белгілі болды, ал арнайы құралдың көмегімен сызу міндеті біршама жеңілдейді.

Тақырыпта мен электр энергиясын тұтынуды айттым. Өкінішке орай, қазіргі уақытта мен ешқандай график бере алмаймын. Бір SDM120 есептегіші өлді, ал екіншісі Modbus арқылы қол жеткізу кезінде қате. Дегенмен, бұл мақаланың тақырыбына ешқандай әсер етпейді - графиктер суға арналған сияқты салынады.

Бұл мақалада мен өзім сынап көрген әдістерді бердім. Әрине, мен білмейтін деректерді жинау мен визуализациялауды ұйымдастырудың басқа жолдары бар. Бұл туралы түсініктемелерде айтыңыз, мен өте қызықты боламын. Мен сындарлы сын мен жаңа идеяларға қуаныштымын. Жоғарыдағы материал да біреуге көмектеседі деп үміттенемін.

Ақпарат көзі: www.habr.com

пікір қалдыру