{"id":74421,"date":"2020-03-17T08:43:08","date_gmt":"2020-03-17T05:43:08","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant"},"modified":"2020-03-17T08:43:08","modified_gmt":"2020-03-17T05:43:08","slug":"umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKa\u017ed\u00fd raz, ke\u010f dostanem \u00fa\u010det za elektrinu a vodu, sa \u010dudujem \u2013 naozaj moja rodina spotreb\u00fava to\u013eko? No \u00e1no, v k\u00fape\u013eni je nain\u0161talovan\u00e9 podlahov\u00e9 k\u00farenie a bojler, ale veru nesp\u00e1lia energie neust\u00e1le. Vodu tie\u017e akosi \u0161etr\u00edme (hoci aj v k\u00fape\u013eni si radi zapl\u00e1vame). Pred nieko\u013ek\u00fdmi rokmi som u\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">pripojil vodomery<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">elektriny<\/a><\/noindex> k inteligentnej dom\u00e1cnosti, ale t\u00fdm sa to skon\u010dilo. K anal\u00fdze spotreby som sa dostal a\u017e teraz, o \u010dom vlastne je tento \u010dl\u00e1nok.<\/p>\n<p>Ned\u00e1vno som pre\u0161iel na Home Assistant ako syst\u00e9m inteligentnej dom\u00e1cnosti. Jedn\u00fdm z d\u00f4vodov bola pr\u00e1ve mo\u017enos\u0165 organizova\u0165 zber ve\u013ek\u00e9ho mno\u017estva \u00fadajov s mo\u017enos\u0165ou pohodln\u00e9ho vytv\u00e1rania r\u00f4znych druhov grafov.<\/p>\n<p>Inform\u00e1cie op\u00edsan\u00e9 v tomto \u010dl\u00e1nku nie s\u00fa nov\u00e9, v\u0161etky tieto veci u\u017e boli opisovan\u00e9 na internete pod r\u00f4znymi z\u00e1mienkami. Ale ka\u017ed\u00fd \u010dl\u00e1nok spravidla opisuje iba jeden pr\u00edstup alebo aspekt. Porovna\u0165 v\u0161etky tieto pr\u00edstupy a vybra\u0165 ten najvhodnej\u0161\u00ed som musel s\u00e1m. \u010cl\u00e1nok aj tak ned\u00e1va vy\u010derp\u00e1vaj\u00face inform\u00e1cie o zbieran\u00ed \u00fadajov, ale je ak\u00fdmsi preh\u013eadom toho, ako som to robil ja. Tak\u017ee konstrukt\u00edvna kritika a n\u00e1vrhy na zlep\u0161enie s\u00fa v\u00edtan\u00e9.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Stanovenie \u00falohy<\/h2>\n<p>\nA teda, cie\u013eom dne\u0161n\u00e9ho cvi\u010denia je z\u00edska\u0165 pekn\u00e9 grafy spotreby vody a elektriny:<\/p>\n<ul>\n<li>Hodinov\u00fd za 2 dni<\/li>\n<li>Denn\u00fd za 2 t\u00fd\u017edne<\/li>\n<li>(volite\u013ene) t\u00fd\u017edenn\u00fd a mesa\u010dn\u00fd<\/li>\n<\/ul>\n<p>\nV tom n\u00e1s \u010dakaj\u00fa ist\u00e9 obtia\u017ee:<\/p>\n<ul>\n<li>\u0160tandardn\u00e9 komponenty grafov s\u00fa spravidla pomerne slab\u00e9. V tom najlep\u0161om pr\u00edpade je mo\u017en\u00e9 zostavi\u0165 line\u00e1rny graf pod\u013ea bodov.\n<p>Ak sa dobre h\u013ead\u00e1, d\u00e1 sa n\u00e1js\u0165 aj extern\u00e9 komponenty, ktor\u00e9 roz\u0161iruj\u00fa mo\u017enosti \u0161tandardn\u00e9ho grafu. Pre Home Assistant je v podstate dobr\u00fd a pekn\u00fd komponent <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>, ale aj ten m\u00e1 niektor\u00e9 obmedzenia:<\/p>\n<ul>\n<li>Je \u0165a\u017ek\u00e9 nastavi\u0165 parametre st\u013apcov\u00e9ho grafu na ve\u013ek\u00fdch intervaloch (\u0161\u00edrka st\u013apca sa nastavuje v zlomkoch hodiny, tak\u017ee intervaly dlh\u0161ie ako hodina sa bud\u00fa nastavova\u0165 zlomkov\u00fdmi \u010d\u00edslami)<\/li>\n<li>Nie je mo\u017en\u00e9 na jeden graf prida\u0165 r\u00f4zne entity (napr\u00edklad teplotu a vlhkos\u0165, alebo skombinova\u0165 st\u013apcov\u00fd graf s \u010diarov\u00fdm)<\/li>\n<\/ul>\n<\/li>\n<li>Nielen, \u017ee home assistant predvolene pou\u017e\u00edva najprimit\u00edvnej\u0161iu datab\u00e1zu SQLite (a ja, zru\u010dn\u00fd, som nezvl\u00e1dol in\u0161tal\u00e1ciu MySQL alebo Postgres), ale aj d\u00e1ta s\u00fa ulo\u017een\u00e9 najmenej optim\u00e1lnym sp\u00f4sobom. Napr\u00edklad pri ka\u017edej zmene ka\u017ed\u00e9ho, aj toho najmen\u0161ieho digit\u00e1lneho parametra, sa do datab\u00e1zy zapisuje obrovsk\u00fd json o ve\u013ekosti okolo jedn\u00e9ho kilobajtu.\n<pre><code class=\"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}}}<\/code><\/pre>\n<p>\nM\u00e1m pomerne ve\u013ea senzorov (teplotn\u00e9 senzory v ka\u017edej miestnosti, meracie pr\u00edstroje na vodu a elektrinu), a niektor\u00e9 navy\u0161e generuj\u00fa dos\u0165 ve\u013ea \u00fadajov. Napr\u00edklad iba merac\u00ed pr\u00edstroj elektriny SDM220 generuje pribli\u017ene desiatku hodn\u00f4t ka\u017ed\u00fdch 10-15 sek\u00fand, a tak\u00fdch pr\u00edstrojov by som chcel nain\u0161talova\u0165 asi 8. A e\u0161te je tu cel\u00e1 sada parametrov, ktor\u00e9 s\u00fa po\u010d\u00edtan\u00e9 na z\u00e1klade in\u00fdch senzorov. T\u00fdm p\u00e1dom v\u0161etky tieto hodnoty m\u00f4\u017eu \u013eahko zv\u00e4\u010d\u0161i\u0165 datab\u00e1zu o 100-200 MB denne. Po t\u00fd\u017edni bude syst\u00e9m \u0165a\u017eko fungova\u0165 a po mesiaci sa pam\u00e4\u0165ov\u00e1 karta (v pr\u00edpade typickej in\u0161tal\u00e1cie home assistant na raspberry PI) zhor\u0161\u00ed, a o uchovan\u00ed \u00fadajov po cel\u00fd rok nem\u00f4\u017ee by\u0165 re\u010d.<\/li>\n<li>Ak m\u00e1te \u0161\u0165astie, v\u00e1\u0161 merac\u00ed pr\u00edstroj vie s\u00e1m po\u010d\u00edta\u0165 spotrebu. Kedyko\u013evek sa m\u00f4\u017eete obr\u00e1ti\u0165 na merac\u00ed pr\u00edstroj a op\u00fdta\u0165 sa, ak\u00e1 je nahromaden\u00e1 hodnota spotreby. Zvy\u010dajne v\u0161etky meracie pr\u00edstroje na elektrinu, ktor\u00e9 maj\u00fa digit\u00e1lne rozhranie (RS232\/RS485\/Modbus\/Zigbee), poskytuj\u00fa tak\u00fato mo\u017enos\u0165.\n<p>Hor\u0161ie je, ak zariadenie m\u00f4\u017ee mera\u0165 len nejak\u00fd okam\u017eit\u00fd parameter (napr\u00edklad okam\u017eit\u00fd v\u00fdkon alebo pr\u00fad), alebo jednoducho generova\u0165 impulzy ka\u017ed\u00fdch X watthod\u00edn alebo litrov. Potom je potrebn\u00e9 prem\u00fd\u0161\u013ea\u0165, ako a \u010d\u00edm to integrova\u0165 a kde uchov\u00e1va\u0165 hodnotu. Existuje riziko, \u017ee zme\u0161k\u00e1te \u010fal\u0161iu spr\u00e1vu z ak\u00e9hoko\u013evek d\u00f4vodu a presnos\u0165 syst\u00e9mu ako celku vyvol\u00e1va ot\u00e1zky. M\u00f4\u017eete to samozrejme v\u0161etko zveri\u0165 syst\u00e9mu inteligentnej dom\u00e1cnosti ako je home assistant, ale bod o po\u010dte z\u00e1znamov v datab\u00e1ze nikto nezru\u0161il, a ani dotazovanie senzorov \u010dastej\u0161ie ako raz za sekundu nie je mo\u017en\u00e9 (obmedzenie architekt\u00fary home assistant).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Pr\u00edstup 1<\/h2>\n<p>\nNajprv sa pozrieme, \u010do poskytuje home assistant priamo z krabice. Meranie spotreby za obdobie je ve\u013emi \u017eiadan\u00e1 funkcia. Samozrejme, u\u017e d\u00e1vno ju implementovali vo forme \u0161pecializovanej s\u00fa\u010dasti \u2014 utility_meter. <\/p>\n<p>Podstata s\u00fa\u010dasti spo\u010d\u00edva v tom, \u017ee vo vn\u00fatri udr\u017euje premenn\u00fa aktu\u00e1lne_nakumulovan\u00e9_hodnota a nulov\u00e1 ju po uplynut\u00ed zadan\u00e9ho obdobia (hodina\/t\u00fd\u017ed\u0148\/mesiac). S\u00fa\u010das\u0165 sama monitoruje vstupn\u00fa premenn\u00fa (hodnotu nejak\u00e9ho senzora) a sama sa prihlasuje na zmeny hodnoty \u2014 vy jednoducho dost\u00e1vate hotov\u00fd v\u00fdsledok. T\u00e1to funkcia sa popisuje len nieko\u013ek\u00fdmi riadkami v konfigura\u010dnom s\u00fabore.<\/p>\n<pre><code class=\"python\">utility_meter:\n  water_cold_hour_um:\n    source: sensor.water_meter_cold\n    cycle: hourly\n  water_cold_day_um:\n    source: sensor.water_meter_cold\n    cycle: daily\n<\/code><\/pre>\n<p>\nTu sensor.water_meter_cold je aktu\u00e1lna hodnota mera\u010da v litroch, ktor\u00fa z\u00edskavam <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">priamo z hardv\u00e9ru<\/a><\/noindex> cez mqtt. Kon\u0161trukcia vytv\u00e1ra 2 nov\u00e9 senzory water_cold_hour_um a water_cold_day_um, ktor\u00e9 akumuluj\u00fa hodinov\u00e9 a denn\u00e9 ukazovatele a nuluj\u00fa ich po uplynut\u00ed obdobia. Tu je graf hodinov\u00e9ho akumul\u00e1tora za pol d\u0148a.<\/p>\n<p><img decoding=\"async\" alt=\"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00f3d hodinov\u00fdch a denn\u00fdch grafov pre lovelace-UI vyzer\u00e1 takto:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Hodinov\u00e1 spotreba vody pomocou premenn\u00fdch'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Denn\u00e1 spotreba vody pomocou premenn\u00fdch'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\nProbl\u00e9m tohto pr\u00edstupu spo\u010d\u00edva pr\u00e1ve v tomto algoritmoch. Ako som u\u017e spomenul, pre ka\u017ed\u00fa vstupn\u00fa hodnotu (aktu\u00e1lny \u00fadaj mera\u010da na ka\u017ed\u00fd \u010fal\u0161\u00ed liter) sa generuje 1 kB z\u00e1znamu v datab\u00e1ze. Ka\u017ed\u00fd utility meter tie\u017e generuje nov\u00e9 hodnoty, ktor\u00e9 sa taktie\u017e ukladaj\u00fa do datab\u00e1zy. Ak chcem zbiera\u0165 hodinov\u00e9\/de\u0148n\u00e9\/t\u00fd\u017edenn\u00e9\/mesa\u010dn\u00e9 \u00fadaje, a to pre nieko\u013eko st\u00fapa\u010diek vody, a e\u0161te prida\u0165 nejak\u00e9 elektromery \u2014 to bude ve\u013emi ve\u013ea \u00fadajov. Presnej\u0161ie, t\u00fdch \u00fadajov nebude ve\u013ea, ale preto\u017ee home assistant zapisuje do datab\u00e1zy mno\u017estvo zbyto\u010dn\u00fdch inform\u00e1ci\u00ed, ve\u013ekos\u0165 datab\u00e1zy bude r\u00e1s\u0165 ako po kvasen\u00ed. Boj\u00edm sa aj len odhadova\u0165 ve\u013ekos\u0165 datab\u00e1zy pre t\u00fd\u017edenn\u00e9 a mesa\u010dn\u00e9 grafy.<\/p>\n<p>Okrem toho utility meter s\u00e1m osebe nerie\u0161i dan\u00fa \u00falohu. Graf hodn\u00f4t, ktor\u00e9 utility meter poskytuje, je monot\u00f3nne rast\u00faca funkcia, ktor\u00e1 sa ka\u017ed\u00fa hodinu resetuje na 0. Potrebujeme preh\u013eadn\u00fd graf pre pou\u017e\u00edvate\u013ea, ktor\u00fd ukazuje, ko\u013eko litrov bolo spotrebovan\u00fdch v danom obdob\u00ed. \u0160tandardn\u00e1 s\u00fa\u010das\u0165 history-graph to nedok\u00e1\u017ee, ale s externou s\u00fa\u010das\u0165ou mini-graph-card n\u00e1m m\u00f4\u017ee pom\u00f4c\u0165.<\/p>\n<p>Toto je k\u00f3d karty pre lovelace-UI:<\/p>\n<pre><code class=\"python\">      - aggregate_func: max\n        entities:\n          - color: var(--primary-color)\n            entity: sensor.water_cold_hour_um\n        group_by: hour\n        hours_to_show: 48\n        name: \"Hodinov\u00e1 spotreba vody agregovan\u00e1 pod\u013ea vodomeru\"\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nOkrem \u0161tandardn\u00fdch nastaven\u00ed ako je n\u00e1zov senzora, typ grafu, farba (\u0161tandardn\u00e1 oran\u017eov\u00e1 sa mi nep\u00e1\u010dila), je d\u00f4le\u017eit\u00e9 zd\u00f4razni\u0165 3 nastavenia:<\/p>\n<ul>\n<li>group_by:hour \u2014 graf bude generovan\u00fd so zarovnan\u00edm st\u013apcov na za\u010diatku hodiny<\/li>\n<li>points_per_hour: 1 \u2014 jeden st\u013apec na ka\u017ed\u00fa hodinu<\/li>\n<li>A najd\u00f4le\u017eitej\u0161ie, aggregate_func: max \u2014 z\u00edska\u0165 maxim\u00e1lnu hodnotu v r\u00e1mci ka\u017edej hodiny. Tento parameter premen\u00ed zubato-krivkov\u00fd graf na st\u013apce.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa niektor\u00e9 st\u013apce na\u013eavo si nev\u0161\u00edmajte \u2014 to je \u0161tandardn\u00e9 spr\u00e1vanie komponentu, ak nie s\u00fa \u017eiadne \u00fadaje. A \u00fadajov skuto\u010dne nebolo \u2014 len pred p\u00e1r hodinami som zapol zbieranie \u00fadajov prostredn\u00edctvom utility meter len pre tento \u010dl\u00e1nok (svoj aktu\u00e1lny pr\u00edstup op\u00ed\u0161em o nie\u010do nesk\u00f4r). <\/p>\n<p>Na tomto obr\u00e1zku som chcel uk\u00e1za\u0165, \u017ee niekedy zobrazenie \u00fadajov skuto\u010dne funguje a st\u013apce naozaj odr\u00e1\u017eaj\u00fa spr\u00e1vne hodnoty. Len\u017ee nie v\u0161etky. Vyzdvihnut\u00fd st\u013apec za \u010dasov\u00fd \u00fasek od 11 do 12 hodiny r\u00e1no zobrazuje 19 litrov, hoci na zubatom grafe tro\u0161ku vy\u0161\u0161ie za ten ist\u00fd \u010dasov\u00fd \u00fasek z toho ist\u00e9ho senzora vid\u00edme spotrebu 62 litrov. Bu\u010f chyba, alebo nespr\u00e1vne nastavenia. A zatia\u013e som nepochopil, pre\u010do s\u00fa \u00fadaje na pravej strane zlomen\u00e9 \u2014 spotreba tam bola norm\u00e1lna, \u010do je takisto vidite\u013en\u00e9 na zubatom grafe.<\/p>\n<p>Celkovo sa mi na tomto pr\u00edstupe nepodarilo dosiahnu\u0165 presved\u010divos\u0165 \u2014 graf takmer v\u017edy zobrazuje nie\u010do nespr\u00e1vne.<\/p>\n<p>Analogick\u00fd k\u00f3d pre denn\u00fd senzor. <\/p>\n<pre><code class=\"python\">      - aggregate_func: max\n        entities:\n          - color: var(--primary-color)\n            entity: sensor.water_cold_day_um\n        group_by: interval\n        hours_to_show: 360\n        name: \"Denn\u00e1 spotreba vody agregovan\u00e1 pod\u013ea vodomeru\"\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nV\u0161imnite si, \u017ee parameter group_by je nastaven\u00fd na hodnotu interval, a ovl\u00e1da v\u0161etky parametre points_per_hour. A tu nast\u00e1va \u010fal\u0161\u00ed probl\u00e9m tohto komponentu \u2014 points_per_hour dobre funguje na grafoch za hodinu alebo menej, ale zle na v\u00e4\u010d\u0161\u00edch \u010dasov\u00fdch \u00fasekoch. Tak aby som z\u00edskal jeden st\u013apec za jeden de\u0148, musel som zada\u0165 hodnotu 1\/24=0.04166666. O t\u00fd\u017ed\u0148ov\u00fdch a mesa\u010dn\u00fdch grafoch ani nevrav\u00edm.<\/p>\n<h2>Pr\u00edstup 2<\/h2>\n<p>\nE\u0161te len sa zaober\u00e1m s home assistant a narazil som na toto video:<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"-0HrYFCRH0M\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/-0HrYFCRH0M\/hqdefault.jpg\" alt=\"Prehrajte video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nKamar\u00e1t zbiera \u00fadaje spotreby z viacer\u00fdch typov z\u00e1suviek Xiaomi. Jeho \u00faloha je o \u010dosi jednoduch\u0161ia \u2014 jednoducho zobrazova\u0165 hodnotu spotreby za dnes, v\u010dera a za mesiac. \u017diadne grafy nie s\u00fa potrebn\u00e9. <\/p>\n<p>Nechajme na strane \u00favahy o ru\u010dnom integr\u00e1cii okam\u017eit\u00fdch hodn\u00f4t v\u00fdkonu \u2014 o \"presnosti\" tak\u00e9ho pr\u00edstupu som u\u017e p\u00edsal vy\u0161\u0161ie. Nie je jasn\u00e9, pre\u010do neza\u010dal pou\u017e\u00edva\u0165 akumulovan\u00e9 hodnoty spotreby, ktor\u00e9 s\u00fa u\u017e zhroma\u017e\u010fovan\u00e9 tou istou z\u00e1suvkou. Pod\u013ea m\u00f4jho n\u00e1zoru bude integr\u00e1cia vo vn\u00fatri zariadenia fungova\u0165 lep\u0161ie. <\/p>\n<p>Z videa preberieme n\u00e1pad ru\u010dn\u00e9ho po\u010d\u00edtania spotreby za obdobie. U frajera sa po\u010d\u00edtaj\u00fa len hodnoty za dnes a za v\u010dera, ale my p\u00f4jdeme \u010falej a pok\u00fasime sa nakresli\u0165 graf. Podstata navrhnut\u00e9ho met\u00f3du v mojom pr\u00edpade spo\u010d\u00edva v nasleduj\u00facom.<\/p>\n<p>Zavedeme premenn\u00fa hodnota_na_zaciatku_hodiny, do ktorej zap\u00ed\u0161eme aktu\u00e1lne \u00fadaje mera\u010da<br \/>\nNa konci hodiny (alebo na za\u010diatku nasleduj\u00facej) spo\u010d\u00edtame rozdiel medzi aktu\u00e1lnym zobrazen\u00edm a zapam\u00e4tan\u00fdm na za\u010diatku hodiny. Tento rozdiel bude spotrebou za aktu\u00e1lnu hodinu \u2014 ulo\u017e\u00edme hodnotu do senzora a v bud\u00facnosti budeme na z\u00e1klade tejto hodnoty vytv\u00e1ra\u0165 graf. <br \/>\nTie\u017e je potrebn\u00e9 \"resetova\u0165\" premenn\u00fa hodnota_na_zaciatku_hodiny zap\u00edsan\u00edm aktu\u00e1lnej hodnoty \u010d\u00edta\u010da.<\/p>\n<p>Toto v\u0161etko m\u00f4\u017eete urobi\u0165 cez prostriedky samotn\u00e9ho home assistant. <\/p>\n<p>K\u00f3du bude treba nap\u00edsa\u0165 o \u010dosi viac ako v predch\u00e1dzaj\u00facom pr\u00edstupe. Na za\u010diatok si vytvor\u00edme tieto \"premenn\u00e9\". Z krabice nem\u00e1me entitu \"premenn\u00e1\", ale m\u00f4\u017eeme vyu\u017ei\u0165 slu\u017eby mqtt brokera. Budeme tam posiela\u0165 hodnoty s pr\u00edkazom retain=true \u2014 to ulo\u017e\u00ed hodnotu v brokeroch a bude ju mo\u017en\u00e9 kedyko\u013evek vytiahnu\u0165, aj po re\u0161tarte home assistant. Hne\u010f som vytvoril hodinov\u00e9 a denn\u00e9 po\u010d\u00edtadl\u00e1.<\/p>\n<pre><code class=\"python\">- platform: mqtt\n  state_topic: \"test\/water\/hour\"\n  name: water_hour\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: \"test\/water\/hour_begin\"\n  name: water_hour_begin\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: \"test\/water\/day\"\n  name: water_day\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: \"test\/water\/day_begin\"\n  name: water_day_begin\n  unit_of_measurement: l<\/code><\/pre>\n<p>\nCel\u00e1 m\u00e1gia prebieha v automatiz\u00e1cii, ktor\u00e1 sa sp\u00fa\u0161\u0165a ka\u017ed\u00fd hodinu a ka\u017ed\u00fa noc.<\/p>\n<pre><code class=\"python\">- id: water_new_hour\n  alias: water_new_hour\n  initial_state: true\n  trigger:\n    - platform: time_pattern\n      minutes: 0\n  action:\n    - service: mqtt.publish\n      data:\n        topic: \"test\/water\/hour\"\n        payload_template: &gt;\n          {{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_hour_begin.state|int) }}\n        retain: true\n    - service: mqtt.publish\n      data:\n        topic: \"test\/water\/hour_begin\"\n        payload_template: &gt;\n          {{ states.sensor.water_meter_cold.state }}\n        retain: true\n\n- id: water_new_day\n  alias: water_new_day\n  initial_state: true\n  trigger:\n    - platform: time\n      at: \"00:00:00\"\n  action:\n    - service: mqtt.publish\n      data:\n        topic: \"test\/water\/day\"\n        payload_template: &gt;\n          {{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_day_begin.state|int) }}\n        retain: true\n    - service: mqtt.publish\n      data:\n        topic: \"test\/water\/day_begin\"\n        payload_template: &gt;\n          {{ states.sensor.water_meter_cold.state }}\n        retain: true<\/code><\/pre>\n<p>\nObe automatiz\u00e1cie vykon\u00e1vaj\u00fa 2 \u010diny:<\/p>\n<ul>\n<li>Vypo\u010d\u00edtavaj\u00fa hodnotu za interval ako rozdiel medzi po\u010diato\u010dnou a kone\u010dnou hodnotou<\/li>\n<li>Aktualizuj\u00fa z\u00e1kladn\u00fa hodnotu pre nasleduj\u00faci interval<\/li>\n<\/ul>\n<p>\nVytv\u00e1ranie grafov sa v tomto pr\u00edpade rie\u0161i be\u017en\u00fdm history-graph:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Hodinov\u00e1 spotreba vody pomocou premenn\u00fdch'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Denn\u00e1 spotreba vody pomocou premenn\u00fdch'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nVyzer\u00e1 to takto:<\/p>\n<p><img decoding=\"async\" alt=\"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV podstate je to u\u017e to, \u010do potrebujeme. V\u00fdhodou tejto met\u00f3dy je, \u017ee \u00fadaje sa generuj\u00fa len raz za interval. T.j. celkovo 24 z\u00e1znamov za de\u0148 pre hodinov\u00fd graf. <\/p>\n<p>\u017dia\u013e, tento v\u0161eobecn\u00fd probl\u00e9m rast\u00facej datab\u00e1zy to st\u00e1le nerie\u0161i. Ak chcem mesiacov\u00fd graf spotreby, budem musie\u0165 uchov\u00e1va\u0165 \u00fadaje aspo\u0148 za rok. A ke\u010f\u017ee home assistant poskytuje iba jedno nastavenie trvania uchov\u00e1vania pre cel\u00fa datab\u00e1zu, znamen\u00e1 to, \u017ee V\u0160ETKY \u00fadaje v syst\u00e9me budem musie\u0165 uchov\u00e1va\u0165 cel\u00fd rok. Napr\u00edklad za rok spotrebujem 200 kubick\u00fdch metrov vody, \u010do predstavuje 200000 z\u00e1znamov v datab\u00e1ze. A ak zoh\u013eadn\u00edm aj \u010fal\u0161ie senzory, \u010d\u00edslo sa st\u00e1va naozaj ne\u00famern\u00fdm.<\/p>\n<h2>Pr\u00edstup 3<\/h2>\n<p>\nNa\u0161\u0165astie, m\u00fadri \u013eudia u\u017e tento probl\u00e9m vyrie\u0161ili nap\u00edsan\u00edm datab\u00e1zy InfluxDB. T\u00e1to datab\u00e1za je \u0161peci\u00e1lne optimalizovan\u00e1 na uchov\u00e1vanie d\u00e1t zalo\u017een\u00fdch na \u010dase a ide\u00e1lne sa hod\u00ed na uchov\u00e1vanie hodn\u00f4t r\u00f4znych senzorov. Syst\u00e9m taktie\u017e poskytuje jazyk dotazov podobn\u00fd SQL, ktor\u00fd umo\u017e\u0148uje z\u00edskavanie hodn\u00f4t z datab\u00e1zy a ich agregovanie r\u00f4znymi sp\u00f4sobmi. Nakoniec, r\u00f4zne \u00fadaje m\u00f4\u017eu by\u0165 uchov\u00e1van\u00e9 r\u00f4znu dobu. Napr\u00edklad, \u010dasto sa meniacie hodnoty ako teplota alebo vlhkos\u0165 m\u00f4\u017eu by\u0165 uchov\u00e1van\u00e9 iba p\u00e1r t\u00fd\u017ed\u0148ov, zatia\u013e \u010do denn\u00e9 hodnoty spotreby vody m\u00f4\u017eu by\u0165 uchov\u00e1van\u00e9 cel\u00fd rok.<\/p>\n<p>Okrem InfluxDB m\u00fadri \u013eudia vynalezli aj Grafanu \u2014 syst\u00e9m na kreslenie grafov na z\u00e1klade d\u00e1t z InfluxDB. Grafana dok\u00e1\u017ee kresli\u0165 r\u00f4zne typy grafov, podrobne ich prisp\u00f4sobova\u0165 a, \u010do je najd\u00f4le\u017eitej\u0161ie, tieto grafy je mo\u017en\u00e9 \u201ezasun\u00fa\u0165\u201c do lovelace-UI home assistantu.<\/p>\n<p>In\u0161pirova\u0165 sa <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">tu <\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">tu<\/a><\/noindex>. V \u010dl\u00e1nkoch je podrobne pop\u00edsan\u00fd proces in\u0161tal\u00e1cie a pripojenia InfluxDB a Grafany k home assistantu. Ja sa v\u0161ak zameriam na rie\u0161enie svojej konkr\u00e9tnej \u00falohy.<\/p>\n<p>Tak\u017ee, najsk\u00f4r za\u010dneme uklada\u0165 hodnotu po\u010d\u00edtadla do InfluxDB. K\u00fasok konfigur\u00e1cie home assistantu (v tomto pr\u00edklade sa budem zab\u00e1va\u0165 nielen s chladnou, ale aj teplou vodou):<\/p>\n<pre><code class=\"python\">influxdb:\n  host: localhost\n  max_retries: 3\n  default_measurement: state\n  database: homeassistant\n  include:\n    entities:\n      - sensor.water_meter_hot\n      - sensor.water_meter_cold<\/code><\/pre>\n<p>\nVypneme uchov\u00e1vanie t\u00fdchto ist\u00fdch \u00fadajov v internej datab\u00e1ze home assistant, aby sme ju zbyto\u010dne nenafukovali:<\/p>\n<pre><code class=\"python\">recorder:\n  purge_keep_days: 10\n  purge_interval: 1\n  exclude:\n    entities:\n      - sensor.water_meter_hot\n      - sensor.water_meter_cold<\/code><\/pre>\n<p>\nPrejdime teraz do konzoly InfluxDB a nastavme na\u0161u datab\u00e1zu. Konkr\u00e9tne je potrebn\u00e9 nastavi\u0165, ako dlho bud\u00fa uchov\u00e1van\u00e9 konkr\u00e9tne d\u00e1ta. To sa reguluje tzv. retention policy \u2014 to je podobn\u00e9 datab\u00e1zam v r\u00e1mci hlavnej datab\u00e1zy, pri\u010dom ka\u017ed\u00e1 vn\u00fatorn\u00e1 datab\u00e1za m\u00e1 svoje vlastn\u00e9 nastavenia. Predvolene sa v\u0161etky d\u00e1ta ukladaj\u00fa do retention policy s n\u00e1zvom autogen, tieto d\u00e1ta bud\u00fa uchov\u00e1van\u00e9 t\u00fd\u017ede\u0148. Chcel by som, aby sa hodinov\u00e9 d\u00e1ta uchov\u00e1vali mesiac, t\u00fd\u017edenn\u00e9 \u2014 rok a mesa\u010dn\u00e9 sa nikdy neodstra\u0148ovali. Vytvorme zodpovedaj\u00face retention policy.<\/p>\n<pre><code class=\"sql\">VYTVORTE POLITIKU UCHOV\u00c1VANIA \"month\" NA \"homeassistant\" D\u013a\u017eka 30d REPLIK\u00c1CIA 1\nVYTVORTE POLITIKU UCHOV\u00c1VANIA \"year\" NA \"homeassistant\" D\u013a\u017eka 52w REPLIK\u00c1CIA 1\nVYTVORTE POLITIKU UCHOV\u00c1VANIA \"infinite\" NA \"homeassistant\" D\u013a\u017eka INF REPLIK\u00c1CIA 1<\/code><\/pre>\n<p>\nTeraz, vlastne, hlavn\u00fd trik \u2014 agreg\u00e1cia d\u00e1t pomocou continuous query. Je to mechanizmus, ktor\u00fd automaticky sp\u00fa\u0161\u0165a dotaz v zadan\u00fdch intervaloch, agreguje d\u00e1ta pod\u013ea tohto dotazu a v\u00fdsledok uklad\u00e1 do novej hodnoty. Prejdeme si to na pr\u00edklade (p\u00ed\u0161em do st\u013apca pre lep\u0161iu \u010ditate\u013enos\u0165, ale v skuto\u010dnosti som t\u00fato pr\u00edkaz zad\u00e1val v jednej l\u00ednii).<\/p>\n<pre><code class=\"sql\">CREATE CONTINUOUS QUERY cq_water_hourly ON homeassistant \nBEGIN \n  SELECT max(value) AS value \n  INTO homeassistant.month.water_meter_hour \n  FROM homeassistant.autogen.l \n  GROUP BY time(1h), entity_id fill(previous) \nEND<\/code><\/pre>\n<p>\nTento pr\u00edkaz:<\/p>\n<ul>\n<li>Vytv\u00e1ra continuous query s n\u00e1zvom cq_water_cold_hourly v datab\u00e1ze homeassistant.<\/li>\n<li>Dotaz sa bude vykon\u00e1va\u0165 ka\u017ed\u00fa hodinu (time(1h)).<\/li>\n<li>Dotaz vyber\u00e1 v\u0161etky d\u00e1ta z measurementu homeassistant.autogen.l (litre), vr\u00e1tane ukazovate\u013eov studenej a teplej vody.<\/li>\n<li>Agregovan\u00e9 d\u00e1ta sa bud\u00fa skupinova\u0165 pod\u013ea entity_id, \u010do n\u00e1m vytvor\u00ed samostatn\u00e9 hodnoty pre studen\u00fa a tepl\u00fa vodu.<\/li>\n<li>Ke\u010f\u017ee mera\u010d litrov je monot\u00f3nne rast\u00faca sekvencia, v r\u00e1mci ka\u017ed\u00e9ho zariadenia je potrebn\u00e9 bra\u0165 maxim\u00e1lnu hodnotu, preto sa agreg\u00e1cia vykon\u00e1 funkciou max(value). <\/li>\n<li>Nov\u00e1 hodnota sa zap\u00ed\u0161e do homeassistant.month.water_meter_hour, kde month je n\u00e1zov retention policy so skladovan\u00edm na mesiac. Navy\u0161e, d\u00e1ta o studenej a teplej vode bud\u00fa rozdelen\u00e9 do samostatn\u00fdch z\u00e1znamov s pr\u00edslu\u0161n\u00fdm entity_id a hodnotou v poli value.<\/li>\n<\/ul>\n<p>\nV noci alebo ke\u010f nie je nikto doma, spotreba vody nie je, a teda v homeassistant.autogen.l tie\u017e nie s\u00fa nov\u00e9 z\u00e1znamy. Aby nedoch\u00e1dzalo k pr\u00e1zdnym hodnot\u00e1m v be\u017en\u00fdch dotazoch, m\u00f4\u017eeme pou\u017ei\u0165 fill(previous). To prin\u00fati InfluxDB pou\u017ei\u0165 hodnotu z predch\u00e1dzaj\u00facej hodiny. <\/p>\n<p>\u017dia\u013e, existuje zvl\u00e1\u0161tnos\u0165 v kontinu\u00e1lnych dopytoch: trik fill(previous) nefunguje a z\u00e1znamy sa jednoducho nevytv\u00e1raj\u00fa. Ide o neprekonate\u013en\u00fd probl\u00e9m, ktor\u00fd <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">diskutujeme u\u017e nieko\u013eko rokov.<\/a><\/noindex>S t\u00fdmto probl\u00e9mom sa nesk\u00f4r zaober\u00edme, k\u00fdm nech\u00e1me fill(previous) v kontinu\u00e1lnom dopyte \u2014 neprek\u00e1\u017ea to. <\/p>\n<p>Skontrolujeme, \u010do sme z\u00edskali (samozrejme, mus\u00edme po\u010dka\u0165 p\u00e1r hod\u00edn):<\/p>\n<pre><code class=\"python\">&gt; select * from homeassistant.month.water_meter_hour group by entity_id\n...\nname: water_meter_hour\ntags: entity_id=water_meter_cold\ntime                 value\n----                 -----\n...\n2020-03-08T01:00:00Z 370511\n2020-03-08T02:00:00Z 370513\n2020-03-08T05:00:00Z 370527\n2020-03-08T06:00:00Z 370605\n2020-03-08T07:00:00Z 370635\n2020-03-08T08:00:00Z 370699\n2020-03-08T09:00:00Z 370761\n2020-03-08T10:00:00Z 370767\n2020-03-08T11:00:00Z 370810\n2020-03-08T12:00:00Z 370818\n2020-03-08T13:00:00Z 370827\n2020-03-08T14:00:00Z 370849\n2020-03-08T15:00:00Z 370921\n<\/code><\/pre>\n<p>\nV\u0161imnite si, \u017ee hodnoty v datab\u00e1ze sa ukladaj\u00fa v UTC, tak\u017ee v tomto zozname sa l\u00ed\u0161ia o 3 hodiny \u2014 hodnoty za 7 hod\u00edn r\u00e1no vo v\u00fdstupe InfluxDB zodpovedaj\u00fa hodnot\u00e1m za 10 hod\u00edn r\u00e1no na grafoch vy\u0161\u0161ie. Tie\u017e si v\u0161imnite, \u017ee medzi 2 a 5 hodinou r\u00e1no nie s\u00fa \u017eiadne z\u00e1znamy \u2014 to je t\u00e1 zvl\u00e1\u0161tnos\u0165 kontinu\u00e1lneho dopytu.<\/p>\n<p>Ako vid\u00edte, agregovan\u00e1 hodnota je tie\u017e monot\u00f3nne rast\u00faca sekvencia, len z\u00e1znamy sa vytv\u00e1raj\u00fa menej \u010dasto \u2014 raz za hodinu. Ale to nie je probl\u00e9m \u2014 m\u00f4\u017eeme nap\u00edsa\u0165 \u010fal\u0161\u00ed dopyt, ktor\u00fd z\u00edska spr\u00e1vne \u00fadaje pre graf.<\/p>\n<pre><code class=\"sql\">SELECT difference(max(value)) \nFROM homeassistant.month.water_meter_hour \nWHERE entity_id='water_meter_cold' and time &gt;= now() -24h \nGROUP BY time(1h), entity_id \nfill(previous)<\/code><\/pre>\n<p>\nRozl\u00fa\u0161tim:<\/p>\n<ul>\n<li>Z datab\u00e1zy homeassistant.month.water_meter_hour z\u00edskame \u00fadaje pre entity_id=&#8217;water_meter_cold&#8217; za posledn\u00fdch 24 hod\u00edn (time &gt;= now() -24h). <\/li>\n<li>Ako som u\u017e spomenul, v sekvencii homeassistant.month.water_meter_hour m\u00f4\u017eu ch\u00fdba\u0165 niektor\u00e9 z\u00e1znamy. Tieto \u00fadaje znovu vygenerujeme spusten\u00edm dopytu s GROUP BY time(1h). Tentokr\u00e1t fill(previous) bude fungova\u0165 ako sa patr\u00ed a vygeneruje ch\u00fdbaj\u00face \u00fadaje (funkcia vezme predch\u00e1dzaj\u00facu hodnotu).<\/li>\n<li>Najd\u00f4le\u017eitej\u0161ia \u010das\u0165 tohoto dopytu je funkcia difference, ktor\u00e1 spo\u010d\u00edta rozdiel medzi hodinov\u00fdmi \u010dasov\u00fdmi zna\u010dkami. Sama o sebe nefunguje a potrebuj\u00fa agreguj\u00facu funkciu. Nech je to max() pou\u017eit\u00e1 predt\u00fdm.<\/li>\n<\/ul>\n<p>\nV\u00fdsledok vykonania vyzer\u00e1 takto:<\/p>\n<pre><code class=\"python\">name: water_meter_hour\ntags: entity_id=water_meter_cold\ntime                 difference\n----                 ----------\n...\n2020-03-08T02:00:00Z 2\n2020-03-08T03:00:00Z 0\n2020-03-08T04:00:00Z 0\n2020-03-08T05:00:00Z 14\n2020-03-08T06:00:00Z 78\n2020-03-08T07:00:00Z 30\n2020-03-08T08:00:00Z 64\n2020-03-08T09:00:00Z 62\n2020-03-08T10:00:00Z 6\n2020-03-08T11:00:00Z 43\n2020-03-08T12:00:00Z 8\n2020-03-08T13:00:00Z 9\n2020-03-08T14:00:00Z 22\n2020-03-08T15:00:00Z 72<\/code><\/pre>\n<p>\nOd 2 do 5 r\u00e1no (UTC) nebolo \u017eiadne spotreba. Napriek tomu sa po\u017eiadavka vr\u00e1ti s rovnakou hodnotou spotreby v\u010faka fill(previous), a funkcia difference t\u00fato hodnotu od\u010d\u00edta sama od seba, tak\u017ee na v\u00fdstupe z\u00edskame 0, \u010do vlastne potrebujeme.<\/p>\n<p>Zost\u00e1va u\u017e len mal\u00e1 vec \u2014 postavi\u0165 graf. Na to otvor\u00edme Grafanu, otvor\u00edme nejak\u00fd existuj\u00faci (alebo vytvor\u00edme nov\u00fd) dashboard, a vytvor\u00edme nov\u00fa panely. Nastavenia grafov bud\u00fa tak\u00e9to.<\/p>\n<p><img decoding=\"async\" alt=\"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBudeme zobrazova\u0165 d\u00e1ta o studenej a teplej vode na jednom grafe. Dotaz je presne tak\u00fd, ako som op\u00edsal vy\u0161\u0161ie. <\/p>\n<p>Parametre zobrazenia sa nastavuj\u00fa takto. U m\u0148a to bude graf s \u010diarami (lines), ktor\u00fd ide stup\u0148ovito (stairs). Parameter Stack vysvetl\u00edm o chv\u00ed\u013eu. Ni\u017e\u0161ie s\u00fa e\u0161te \u010fal\u0161ie dva parametre zobrazenia, ale nie s\u00fa tak zauj\u00edmav\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAby sme pridali z\u00edskan\u00fd graf do dom\u00e1cich asistentov, potrebujeme:<\/p>\n<ul>\n<li>vyst\u00fapi\u0165 z re\u017eimu \u00faprav grafu. Z nejak\u00e9ho d\u00f4vodu sa spr\u00e1vne nastavenia zdie\u013eania grafov pon\u00fakaj\u00fa iba zo str\u00e1nky dashboardu.<\/li>\n<li>Klikn\u00fa\u0165 na trojuholn\u00edk ved\u013ea n\u00e1zvu grafu, v menu vybra\u0165 share.<\/li>\n<li>V otvorenom okne prejs\u0165 na kartu embed.<\/li>\n<li>Odstr\u00e1ni\u0165 za\u0161krtnutie current time range \u2014 \u010dasov\u00fd rozsah budeme zad\u00e1va\u0165 cez URL. <\/li>\n<li>Vybra\u0165 potrebn\u00fa t\u00e9mu. V mojom pr\u00edpade je to light.<\/li>\n<li>Skop\u00edrova\u0165 z\u00edskan\u00fd URL do karty nastaven\u00ed lovelace-UI.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"python\">      - type: iframe\n        id: graf_water_hourly\n        url: \"http:\/\/192.168.10.200:3000\/d-solo\/rZARemQWk\/water?orgId=1&amp;panelId=2&amp;from=now-2d&amp;to=now&amp;theme=light\"\n<\/code><\/pre>\n<p>\nV\u0161imnite si, \u017ee \u010dasov\u00fd rozsah (posledn\u00e9 2 dni) sa nastavuje pr\u00e1ve tu, a nie v nastaveniach dashboardu. <\/p>\n<p>Graf vyzer\u00e1 takto. Tepl\u00fa vodu som za posledn\u00e9 2 dni nepou\u017e\u00edval, preto sa vykres\u013euje len graf studenej vody.<\/p>\n<p><img decoding=\"async\" alt=\"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTak som si nie \u00faplne vyjasnil, ktor\u00fd graf sa mi viac p\u00e1\u010di, \u010di stup\u0148ov\u00fd, alebo skuto\u010dn\u00e9 st\u013apce. Preto jednoducho uvediem pr\u00edklad denn\u00e9ho grafu spotreby, len tentoraz so st\u013apcami. Dotazy sa zostavuj\u00fa podobne ako vy\u0161\u0161ie uveden\u00e9. Parametre zobrazenia s\u00fa tak\u00e9to:<\/p>\n<p><img decoding=\"async\" alt=\"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTento graf vyzer\u00e1 takto:<\/p>\n<p><img decoding=\"async\" alt=\"Inteligentn\u00fd dom: Staviame grafy spotreby vody a elektriny v Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTakto k parametru Stack. V tomto grafe je st\u013apec studenej vody vykreslen\u00fd nad st\u013apcom teplej vody. Celkov\u00e1 v\u00fd\u0161ka zodpoved\u00e1 s\u00fahrnnej spotrebe studenej a teplej vody za dan\u00e9 obdobie. <\/p>\n<p>V\u0161etky zobrazen\u00e9 grafy s\u00fa dynamick\u00e9. M\u00f4\u017eete na ne necha\u0165 kurzor nad z\u00e1ujmov\u00fdm bodom a pozrie\u0165 sa na detaily a hodnotu v konkr\u00e9tnom bode. <\/p>\n<p>Bohu\u017eia\u013e, bez p\u00e1r ly\u017ei\u010diek dechtu sa to nezaobi\u0161lo. Na st\u013apcovom grafe (na rozdiel od grafu s krokov\u00fdmi \u010diarami) sa stred st\u013apca nenach\u00e1dza uprostred d\u0148a, ale v 00:00. T.j. \u013eav\u00e1 polovica st\u013apca je zakreslen\u00e1 na mieste predch\u00e1dzaj\u00faceho d\u0148a. Tak\u017ee grafy za sobotu a nede\u013eu s\u00fa zakreslen\u00e9 trocha viac do\u013eava ako modrast\u00e1 z\u00f3na. Zatia\u013e som nevymyslel, ako to prekona\u0165. <\/p>\n<p>\u010eal\u0161\u00edm probl\u00e9mom je nemo\u017enos\u0165 spr\u00e1vne pracova\u0165 s mesa\u010dn\u00fdmi intervalmi. Faktom je, \u017ee d\u013a\u017eka hodiny\/de\u0148a\/t\u00fd\u017ed\u0148a je fixn\u00e1, ale d\u013a\u017eka mesiaca je zaka\u017ed\u00fdm in\u00e1. InfluxDB dok\u00e1\u017ee pracova\u0165 iba s rovnak\u00fdmi intervalmi. Zatia\u013e mi sta\u010dili mozgov\u00e9 kapacity na to, aby som nastavil fixn\u00fd interval na 30 dn\u00ed. \u00c1no, graf sa v priebehu roka trocha posunie a st\u013apce nebud\u00fa presne zodpoveda\u0165 mesiacom. Ale preto\u017ee ma t\u00e1to vec zauj\u00edma len ako ukazovate\u013e, tak mi to neprek\u00e1\u017ea. <\/p>\n<p>Rie\u0161en\u00ed vid\u00edm aspo\u0148 dve:<\/p>\n<ul>\n<li>Ignorova\u0165 mesa\u010dn\u00e9 grafy a obmedzi\u0165 sa na t\u00fd\u017edenn\u00e9. 52 t\u00fd\u017edenn\u00fdch st\u013apcov za rok vyzer\u00e1 celkom dobre.<\/li>\n<li>Samotn\u00fa mesa\u010dn\u00fa spotrebu po\u010d\u00edta\u0165 sp\u00f4sobom \u010d. 2 a Grafanu pou\u017e\u00edva\u0165 len na pekn\u00e9 grafy. Vyjde n\u00e1m celkom presn\u00e9 rie\u0161enie. M\u00f4\u017eeme dokonca superponova\u0165 grafy za minul\u00fd rok na porovnanie \u2014 Grafana to tie\u017e zvl\u00e1da.<\/li>\n<\/ul>\n<h2>Z\u00e1ver<\/h2>\n<p>\nNeviem pre\u010do, ale \u0165ah\u00e1 ma to k tak\u00fdmto grafom. Ukazuj\u00fa, \u017ee \u017eivot sa hem\u017e\u00ed a v\u0161etko sa men\u00ed. V\u010dera bolo ve\u013ea, dnes m\u00e1lo, zajtra to bude akosi inak. E\u0161te treba pracova\u0165 s dom\u00e1cimi oh\u013eadom spotreby. Ale aj pri s\u00fa\u010dasn\u00fdch apet\u00edtach sa z ve\u013ek\u00e9ho a nejasn\u00e9ho \u010d\u00edsla na fakt\u00fare st\u00e1va celkom zrozumite\u013en\u00fd obraz spotreby.<\/p>\n<p>Napriek takmer 20-ro\u010dnej kari\u00e9re program\u00e1tora som sa s datab\u00e1zami prakticky nestretol. Preto sa mi in\u0161tal\u00e1cia externej datab\u00e1zy zdala ako nie\u010do zlo\u017eit\u00e1 a nepochopite\u013en\u00e9. V\u0161etko zmenila <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">vy\u0161\u0161ie uveden\u00e1 \u010dl\u00e1nok<\/a><\/noindex> \u2014 uk\u00e1zalo sa, \u017ee pripojenie vhodn\u00e9ho n\u00e1stroja sa rob\u00ed v p\u00e1r kliknutiach, a so \u0161pecializovan\u00fdm n\u00e1strojom je \u00faloha budovania grafov o nie\u010do jednoduch\u0161ia.<\/p>\n<p>V nadpise som spomenul spotrebu elektriny. \u017dia\u013e, moment\u00e1lne nem\u00e1m k dispoz\u00edcii \u017eiadny graf. Jeden merac\u00ed pr\u00edstroj SDM120 mi prestal fungova\u0165 a druh\u00fd m\u00e1 probl\u00e9my pri pr\u00edstupe cez Modbus. Na t\u00e9mu tohto \u010dl\u00e1nku to v\u0161ak nijako nem\u00e1 vplyv \u2014 grafy sa bud\u00fa vytv\u00e1ra\u0165 rovnak\u00fdm sp\u00f4sobom ako pre vodu.<\/p>\n<p>V tomto \u010dl\u00e1nku som uviedol pr\u00edstupy, ktor\u00e9 som s\u00e1m vysk\u00fa\u0161al. Ur\u010dite existuj\u00fa aj in\u00e9 sp\u00f4soby organiz\u00e1cie zberu a vizualiz\u00e1cie d\u00e1t, o ktor\u00fdch neviem. Povedzte mi o tom v koment\u00e1roch, ve\u013emi ma to zauj\u00edma. Budem r\u00e1d za kon\u0161trukt\u00edvnu kritiku a nov\u00e9 n\u00e1pady. D\u00fafam, \u017ee vypracovan\u00fd materi\u00e1l tie\u017e niekomu pom\u00f4\u017ee.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492314\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u043f\u043b\u0430\u0442\u0435\u0436\u043a\u0443 \u0437\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0432\u043e\u0434\u0443 \u044f \u0443\u0434\u0438\u0432\u043b\u044f\u044e\u0441\u044c \u2014 \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043c\u043e\u044f \u0441\u0435\u043c\u044c\u044f \u0441\u0442\u043e\u043e\u043e\u043e\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442? \u041d\u0443 \u0434\u0430, \u0432 \u0432\u0430\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0442\u0435\u043f\u043b\u044b\u0439 \u043f\u043e\u043b \u0438 \u0431\u043e\u0439\u043b\u0435\u0440, \u043d\u043e \u0432\u0435\u0434\u044c \u043e\u043d\u0438 \u0436\u0435 \u043d\u0435 \u043a\u043e\u0447\u0435\u0433\u0430\u0440\u044f\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e. \u0412\u043e\u0434\u0443 \u0442\u043e\u0436\u0435 \u0432\u0440\u043e\u0434\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c (\u0445\u043e\u0442\u044f \u043f\u043e\u043f\u043b\u0435\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0436\u0435 \u043b\u044e\u0431\u0438\u043c). \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0432\u043e\u0434\u044b \u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a \u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74422,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74421","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u043c\u043d\u044b\u0439 \u0434\u043e\u043c: \u0421\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0434\u044b \u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432 Home Assistant | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-17T05:43:08+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-17T05:43:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Inteligentn\u00fd dom: Vytv\u00e1rame grafy spotreby vody a elektriny v Home Assistant | ProHoster","description":"Ka\u017ed\u00fd raz.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u043c\u043d\u044b\u0439 \u0434\u043e\u043c: \u0421\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0434\u044b \u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432 Home Assistant | ProHoster","og:description":"\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-17T05:43:08+00:00","article:modified_time":"2020-03-17T05:43:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74421","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:15:28","updated":"2022-09-27 16:07:45","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}