{"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\/et\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI am always surprised when I receive the bill for electricity and water \u2014 does my family really use that much? Sure, the bathroom has underfloor heating and a boiler, but they're not working all the time. We seem to save water too (though we do enjoy splashing around in the bath). A few years ago, I already <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">installed water meters<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">electricity<\/a><\/noindex> to the smart home system, but I just got stuck on that. I\u2019ve only now gotten around to analyzing consumption, which is basically what this article is about.<\/p>\n<p>Recently, I switched to Home Assistant as my smart home system. One reason was the ability to collect a lot of data with a convenient way to create various graphs.<\/p>\n<p>The information described in this article is not new; all these things have already been discussed online in various forms. However, each article usually covers only one approach or aspect. I had to compare all these methods and choose the most suitable one myself. The article still doesn\u2019t provide exhaustive information on data collection but serves as a summary of how I did it. Therefore, constructive criticism and suggestions for improvement are welcome.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u00dclesande seadmine<\/h2>\n<p>\nSo, the goal of today\u2019s exercise is to get nice graphs of water and electricity consumption:<\/p>\n<ul>\n<li>Hourly for 2 days<\/li>\n<li>Daily for 2 weeks<\/li>\n<li>(optionally) weekly and monthly<\/li>\n<\/ul>\n<p>\nIn this process, we face some challenges:<\/p>\n<ul>\n<li>Standard graph components are usually rather limited. At best, you can create a line graph based on points.\n<p>If you search well, you can find third-party components that expand the capabilities of the standard graph. For Home Assistant, the component <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>is quite decent and visually appealing, but it also has some limitations:<\/p>\n<ul>\n<li>It\u2019s difficult to set parameters for bar graphs over large intervals (the bar width is set in fractions of an hour, which means intervals longer than an hour need fractional numbers)<\/li>\n<li>You cannot add different entities to one graph (for example, combining temperature and humidity, or merging a bar graph with a line graph)<\/li>\n<\/ul>\n<\/li>\n<li>Not to mention that Home Assistant, by default, uses the most primitive SQLite database (and I, unfortunately, didn\u2019t manage to install MySQL or Postgres), so the data is not stored in the most optimal way. For instance, every time even the smallest digital parameter changes, a large JSON payload of about a kilobyte is recorded in the database.\n<pre><code class=\"json\">{&quot;entity_id&quot;: &quot;sensor.water_cold_hourly&quot;, &quot;old_state&quot;: {&quot;entity_id&quot;: &quot;sensor.water_cold_hourly&quot;, &quot;state&quot;: &quot;3&quot;, &quot;attributes&quot;: {&quot;source&quot;: &quot;sensor.water_meter_cold&quot;, &quot;status&quot;: &quot;collecting&quot;, &quot;last_period&quot;: &quot;29&quot;, &quot;last_reset&quot;: &quot;2020-02-23T21:00:00.022246+02:00&quot;, &quot;meter_period&quot;: &quot;hourly&quot;, &quot;unit_of_measurement&quot;: &quot;l&quot;, &quot;friendly_name&quot;: &quot;water_cold_hourly&quot;, &quot;icon&quot;: &quot;mdi:counter&quot;}, &quot;last_changed&quot;: &quot;2020-02-23T19:05:06.897604+00:00&quot;, &quot;last_updated&quot;: &quot;2020-02-23T19:05:06.897604+00:00&quot;, &quot;context&quot;: {&quot;id&quot;: &quot;aafc8ca305ba4e49ad4c97f0eddd8893&quot;, &quot;parent_id&quot;: null, &quot;user_id&quot;: null}}, &quot;new_state&quot;: {&quot;entity_id&quot;: &quot;sensor.water_cold_hourly&quot;, &quot;state&quot;: &quot;4&quot;, &quot;attributes&quot;: {&quot;source&quot;: &quot;sensor.water_meter_cold&quot;, &quot;status&quot;: &quot;collecting&quot;, &quot;last_period&quot;: &quot;29&quot;, &quot;last_reset&quot;: &quot;2020-02-23T21:00:00.022246+02:00&quot;, &quot;meter_period&quot;: &quot;hourly&quot;, &quot;unit_of_measurement&quot;: &quot;l&quot;, &quot;friendly_name&quot;: &quot;water_cold_hourly&quot;, &quot;icon&quot;: &quot;mdi:counter&quot;}, &quot;last_changed&quot;: &quot;2020-02-23T19:11:11.251545+00:00&quot;, &quot;last_updated&quot;: &quot;2020-02-23T19:11:11.251545+00:00&quot;, &quot;context&quot;: {&quot;id&quot;: &quot;0de64b8af6f14bb9a419dcf3b200ef56&quot;, &quot;parent_id&quot;: null, &quot;user_id&quot;: null}}}<\/code><\/pre>\n<p>\nI have quite a few sensors (temperature sensors in each room, water and electricity meters), and some even generate a lot of data. For instance, the SDM220 electricity meter generates about a dozen values every 10-15 seconds, and I would like to install about 8 of these meters. Moreover, there\u2019s a whole bunch of parameters calculated based on other sensors. Thus, all these values could easily inflate the database by 100-200 MB daily. After a week, the system will be sluggish, and after a month, the flash drive will die (in a typical Home Assistant installation on a Raspberry Pi), and storing data for an entire year is out of the question.<\/li>\n<li>If you\u2019re lucky, your meter can count consumption by itself. You can inquire at any time and ask the meter for the accumulated consumption value. Generally, all electricity meters that have a digital interface (RS232\/RS485\/Modbus\/Zigbee) offer this capability.\n<p>Halvem, kui seade suudab lihtsalt m\u00f5\u00f5ta mingit hetkeparameetrit (n\u00e4iteks hetke v\u00f5imsust v\u00f5i voolu), v\u00f5i lihtsalt genereerida impulsse iga X vat-tunni v\u00f5i liitri kohta. Siis tuleb m\u00f5elda, kuidas ja millega seda integreerida ning kus v\u00e4\u00e4rtust koguda. On oht, et j\u00e4\u00e4b j\u00e4rgmine aruanne mingil p\u00f5hjusel saamata, ja kogu s\u00fcsteemi t\u00e4psus tekitab k\u00fcsimusi. Muidugi v\u00f5ib selle k\u00f5ik usaldada nutika kodu s\u00fcsteemile, nagu home assistant, kuid andmebaasi salvestuste arvu punkt ei ole kehtetuks muutunud, ja andurite k\u00fcsitlemine tihedamini kui kord sekundis pole v\u00f5imalik (home assistant'i arhitektuuri piirang).<\/li>\n<\/ul>\n<p><\/p>\n<h2>L\u00e4henemine 1<\/h2>\n<p>\nAlustame vaatamisest, mida home assistant v\u00e4idetavalt pakub. Tarbimise m\u00f5\u00f5tmine ajavahemiku jooksul on v\u00e4ga n\u00f5utud funktsionaalsus. Loomulikult on see juba ammu rakendatud spetsialiseeritud komponendina - utility_meter. <\/p>\n<p>Komponendi olemus seisneb selles, et see loob muutuja current_accumulated_value, ja nulleb seda m\u00e4\u00e4ratud ajaperioodi (tund\/n\u00e4dal\/kuu) l\u00f5ppedes. Komponent j\u00e4lgib sissetulevat muutujat (n\u00e4iteks mingi anduri v\u00e4\u00e4rtus) ja registreerib muutused - te lihtsalt saate valmis tulemuse. Selle seadistamine vajab vaid m\u00f5ningaid ridasid konfiguratsioonifailis.<\/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>\nSiin on sensor.water_meter_cold, mis on hetke v\u00e4\u00e4rtus, mida ma saan <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">otse seadme<\/a><\/noindex> kaudul mqtt. Konstruktsioon loob 2 uut andurit water_cold_hour_um ja water_cold_day_um, mis koguvad tunni ja p\u00e4evas n\u00e4itajaid, nulledes need ajaperioodi l\u00f5ppedes. Siin on tunni akumulaatori graafik poole p\u00e4eva jooksul.<\/p>\n<p><img decoding=\"async\" alt=\"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTunni ja p\u00e4evagraafikute kood lovelace-UI jaoks on j\u00e4rgmine:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Tunni veetarbimine muutuja p\u00f5hjal'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'P\u00e4eva veetarbimine muutuja p\u00f5hjal'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\nTegelikult peitub probleem sellises l\u00e4henemises selle algoritmi sees. Nagu ma juba mainisin, genereeritakse iga sissetuleva v\u00e4\u00e4rtuse (hetke n\u00e4itaja iga j\u00e4rgmise liitri jaoks) puhul 1 kB andmebaasi kirjeid. Iga utility meter genereerib samuti uue v\u00e4\u00e4rtuse, mis minnes andmebaasi. Kui ma tahan koguda tunni\/p\u00e4eva\/n\u00e4dala\/kuu n\u00e4itajaid, ja samaaegselt mitmest veepunktist, pluss veel hulga elektriarvestite lisada - siis on see v\u00e4ga palju andmeid. No, t\u00e4psemalt \u00f6eldes pole andmeid palju, kuid kuna home assistant kirjutab andmebaasi hunniku liigset teavet, siis andmebaasi suurus kasvab nagu p\u00e4rmitaigen. Pelgalt n\u00e4dalate ja kuude graafikute suuruse arvutamine on jube.<\/p>\n<p>Lisaks sellele ei lahenda utility meter ise seatud \u00fclesannet. Utility meter'i v\u00e4lja andev graafik on monotoniliselt kasvava funktsiooni graafik, mis nulledakse iga tunni l\u00f5pus. Me vajame kasutajale arusaadavat tarbimise graafikut, et n\u00e4ha, kui palju liitreid on ajavahemiku jooksul tarbitud. Tavaline history-graph komponent seda teha ei oska, kuid me saame kasutada v\u00e4list komponenti mini-graph-card.<\/p>\n<p>See on kood tehiskaardile lovelace-UI jaoks:<\/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: &quot;Tundlik vee tarbimine tunniti kokkuv\u00f5tlikult&quot;\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nLisaks tavalistele seadistustele, nagu anduri nimi, graafiku t\u00fc\u00fcp, v\u00e4rv (tavaline oran\u017e ei meeldinud), on oluline m\u00e4rkida 3 seadistust:<\/p>\n<ul>\n<li>group_by:hour \u2014 graafik genereeritakse tundide alguse j\u00e4rgi<\/li>\n<li>points_per_hour: 1 \u2014 \u00fcks graafik iga tunni kohta<\/li>\n<li>Ja k\u00f5ige olulisem, aggregate_func: max \u2014 v\u00f5tke maksimaalne v\u00e4\u00e4rtus igas tunnis. Just see parameeter muudab hammasratta graafiku tulpadeks.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVasaku \u00e4\u00e4re rida tulpade puhul \u00e4rge p\u00f6\u00f6rake t\u00e4helepanu - see on komponendi standardne k\u00e4itumine, kui andmeid pole. Ja andmeid polnudki - ma l\u00fclitasin utility meter andmete kogumise sisse alles paar tundi tagasi ainult selle artikli jaoks (oma praeguse l\u00e4henemise tutvustan allpool). <\/p>\n<p>Sellel pildil soovisin n\u00e4idata, et m\u00f5nikord toimib andmete kuvamine, ja tulbad peegeldavad t\u00f5esti \u00f5igeid v\u00e4\u00e4rtusi. Ainult et mitte k\u00f5ik. M\u00e4rgitud tulbi ajavahemikus 11-12 hommikul n\u00e4itab kahjuks 19 liitrit, kuigi hammastega graafikul n\u00e4eme, et sellelt samalt andurilt on sel perioodil tarbimine 62 liitrit. Olgu see siis bug v\u00f5i vale. Ja miks andmed paremal poole katkestusid, pole ma veel aru saanud - seal oli tarbimine normaalne, nagu samuti on n\u00e4ha hammastega graafikust.<\/p>\n<p>\u00dcldiselt ei saanud ma selle l\u00e4henemise usaldusv\u00e4\u00e4rsuse saavutada - graafik n\u00e4itab peaaegu alati mingit jama.<\/p>\n<p>Sarnane kood p\u00e4evase anduri jaoks. <\/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: &quot;Igap\u00e4evane vee tarbimine kokkuv\u00f5tlikult&quot;\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nPange t\u00e4hele, et rippmen\u00fc\u00fc parameeter group_by on seatud v\u00e4\u00e4rtuseks interval, ja k\u00f5ik s\u00f5ltub parameetrist points_per_hour. See on ka teine probleem, millega see komponent silmitsi seisab \u2014 points_per_hour t\u00f6\u00f6tab h\u00e4sti tunnigraafikute korral, kuid kehvasti pikemate ajavahemike puhul. Seet\u00f5ttu, et saada \u00fcks veerg \u00fche p\u00e4eva kohta, pidin kirjutama v\u00e4\u00e4rtuse 1\/24=0.04166666. Ma r\u00e4\u00e4gin juba n\u00e4dalaste ja kuiste graafikute kohta.<\/p>\n<h2>L\u00e4henemine 2<\/h2>\n<p>\nVeel uurides home assistanti, sattusin sellele videole:<\/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=\"Vaata videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nS\u00f5ber kogub andmeid mitmesuguste Xiaomi pistikute tarbimise kohta. Tema \u00fclesanne on lihtsam \u2014 lihtsalt kuvada tarbimise v\u00e4\u00e4rtused t\u00e4na, eile ja kuu jooksul. Graafikuid ei n\u00f5uta. <\/p>\n<p>J\u00e4tame k\u00f5rvale arutlused, mis puudutavad hetkev\u00f5imsuse k\u00e4sitsi integreerimist \u2014 selle l\u00e4henemise \u201et\u00e4psusest\u201d olen juba eespool kirjutanud. Pole selge, miks ta ei kasuta kogunenud tarbimise v\u00e4\u00e4rtusi, mis on juba sama pistiku poolt kogutud. Minu arvates t\u00f6\u00f6taks integreerimine seadme sees paremini. <\/p>\n<p>Videost v\u00f5tame idee tarbimise k\u00e4sitsi arvestamisest ajavahemiku jooksul. Mees arvutab ainult t\u00e4na ja eile saadud v\u00e4\u00e4rtusi, kuid me liigume edasi ja proovime joonistada graafiku. Pakutud meetodi sisu minu puhul seisneb j\u00e4rgnevates etappides.<\/p>\n<p>Loome muutuja v\u00e4\u00e4rtus_alguses_tunnis, kuhu salvestame arvesti praegused n\u00e4idud.<br \/>\nKellaaegade jooksul (v\u00f5i j\u00e4rgmise tunni alguses) arvutame erinevuse praeguste n\u00e4itude ja alguses salvestatud n\u00e4itude vahel. See erinevus on hetketarbimine \u2014 salvestame selle v\u00e4\u00e4rtuse sensorisse ja tulevikus kasutame selle abil graafiku koostamiseks. <br \/>\nPeame ka \u201enullima\u201d muutuja v\u00e4\u00e4rtus_alguses_tunnis, salvestades sinna arvesti praeguse v\u00e4\u00e4rtuse.<\/p>\n<p>K\u00f5ike seda saab teha l\u00e4bi... home assistant'i enda vahendite. <\/p>\n<p>Koodi tuleb kirjutada veidi rohkem, kui eelnevas l\u00e4henemises. Esiteks, loome need \u201emuutujad\u201d. Vaikimisi meil ei ole \u201dmuutuja\u201d olemust, kuid v\u00f5ime kasutada mqtt brokki teenuseid. Saame sinna saata v\u00e4\u00e4rtusi, kinnitades retain=true \u2014 see hoiab v\u00e4\u00e4rtuse brokkis ning saame seda igal ajal sealt k\u00e4tte, isegi home assistanti taask\u00e4ivitamisel. Tehtud on kohe tunnised ja p\u00e4evased arvestid.<\/p>\n<pre><code class=\"python\">- platform: mqtt\n  state_topic: &quot;test\/water\/hour&quot;\n  name: water_hour\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: &quot;test\/water\/hour_begin&quot;\n  name: water_hour_begin\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: &quot;test\/water\/day&quot;\n  name: water_day\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: &quot;test\/water\/day_begin&quot;\n  name: water_day_begin\n  unit_of_measurement: l<\/code><\/pre>\n<p>\nK\u00f5ik maagia toimub automatiseerimises, mis k\u00e4ivitatakse iga tunni ja iga \u00f6\u00f6.<\/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: &quot;test\/water\/hour&quot;\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: &quot;test\/water\/hour_begin&quot;\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: &quot;00:00:00&quot;\n  action:\n    - service: mqtt.publish\n      data:\n        topic: &quot;test\/water\/day&quot;\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: &quot;test\/water\/day_begin&quot;\n        payload_template: &gt;\n          {{ states.sensor.water_meter_cold.state }}\n        retain: true<\/code><\/pre>\n<p>\nM\u00f5lemad automatiseerimised teevad 2 toimingut:<\/p>\n<ul>\n<li>Arvutavad vahemaa v\u00e4\u00e4rtuse intervalli alguse ja l\u00f5ppv\u00e4\u00e4rtuse vahel<\/li>\n<li>Uuendavad p\u00f5hiv\u00e4\u00e4rtuse j\u00e4rgmise intervalli jaoks<\/li>\n<\/ul>\n<p>\nGraafikute koostamine toimub tavaliselt history-graph: i kaudu:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Tunni veetarbimine muutuja p\u00f5hjal'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'P\u00e4eva veetarbimine muutuja p\u00f5hjal'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nN\u00e4eb v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00f5him\u00f5tteliselt on see juba see, mis on vajalik. Selle meetodi eelis on see, et andmed genereeritakse ainult \u00fche korra intervalli jooksul. T. e. kokku 24 kirjet \u00f6\u00f6p\u00e4evas tunnigraafiku jaoks. <\/p>\n<p>Kahjuks ei lahenda see siiski probleemi kasvava andmebaasi osas. Kui soovin kuu tarbimise graafikut, pean andmeid salvestama v\u00e4hemalt aasta. Ja kuna home assistant pakub ainult \u00fchte s\u00e4ilitamise seadistust kogu andmebaasi jaoks, t\u00e4hendab see, et K\u00d5IK andmed s\u00fcsteemis tuleb hoida terve aasta. N\u00e4iteks, kui aastas tarbin 200 kuupsentimeetrit vett, t\u00e4hendab see 200000 kirjet andmebaasis. Ja kui arvestada ka teisi sensoreid, muutub number \u00fcldiselt t\u00e4iesti sobimatuks.<\/p>\n<h2>L\u00e4henemine 3<\/h2>\n<p>\n\u00d5nneks on nutikad inimesed juba selle probleemi lahendanud, luues InfluxDB andmebaasi. See andmebaas on spetsiaalselt optimeeritud ajap\u00f5histe andmete salvestamiseks ja sobib ideaalselt erinevate sensorite v\u00e4\u00e4rtuste hoidmiseks. S\u00fcsteem pakub ka SQL-laadset p\u00e4ringukeelt, mis v\u00f5imaldab andmebaasist v\u00e4\u00e4rtusi v\u00e4lja noppida ja seej\u00e4rel neid mitmel viisil agregatsioonida. L\u00f5puks on erinevad andmed v\u00f5imalik salvestada erineva aja jooksul. N\u00e4iteks kiiresti muutuvad n\u00e4idud, nagu temperatuur v\u00f5i niiskus, saab hoida ainult paar n\u00e4dalat, samas kui p\u00e4evased vee tarbimise n\u00e4idud saavad p\u00fcsida aasta.<\/p>\n<p>Lisaks InfluxDB-le on nutikad inimesed v\u00e4lja loonud ka Grafana - s\u00fcsteemi, mis v\u00f5imaldab graafikute joonistamist InfluxDB-st p\u00e4rit andmetest. Grafana suudab joonistada erinevaid graafikute t\u00fc\u00fcpe, neid detailideni kohandada ning mis k\u00f5ige t\u00e4htsam, neid graafikuid saab \"paigaldada\" lovelace-UI home assistant\u2019isse.<\/p>\n<p>Inspireerima <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">siin <\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">siin<\/a><\/noindex>. Artiklites on detailselt kirjeldatud InfluxDB ja Grafana installimise ja \u00fchendamise protsessi home assistant\u2019iga. Mina keskendun oma konkreetse \u00fclesande lahendamisele.<\/p>\n<p>Nii et esmalt hakkame salvestama arvesti v\u00e4\u00e4rtust InfluxDB-sse. Juhend home assistandi konfiguratsiooni (selles n\u00e4ites l\u00e4hen ma m\u00e4ngima mitte ainult k\u00fclma, vaid ka sooja veega):<\/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>\nK\u00e4ivitame sama andmete salvestamise home assistandi sisemisesse andmebaasi, et mitte seda tarbetult paisutada:<\/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>\nLiigume n\u00fc\u00fcd InfluxDB konsooli ja seadistame oma andmebaasi. Eelk\u00f5ige tuleb m\u00e4\u00e4rata, kui kaua teatud andmeid hoitakse. Seda reguleerib nn retention policy - see on sarnane andmebaasidele p\u00f5hjaandmebaasi sees, kus igal sisemisel andmebaasil on oma seaded. Vaikimisi salvestatakse k\u00f5ik andmed retention policy alla nimega autogen, mis hoiustatakse n\u00e4dal. Soovin, et tunnised andmed s\u00e4ilitaksid kuu, n\u00e4dalased - aasta, ja kuuandmed ei kustutataks kunagi. Loome vastavad retention policy.<\/p>\n<pre><code class=\"sql\">LOO RETENTSIOONIPOLIITIKA &quot;kuu&quot; KANDIDATIS &quot;homeassistant&quot; KESTUS 30d KORDUSTE ARV 1\nLOO RETENTSIOONIPOLIITIKA &quot;aasta&quot; KANDIDATIS &quot;homeassistant&quot; KESTUS 52w KORDUSTE ARV 1\nLOO RETENTSIOONIPOLIITIKA &quot;piiramatu&quot; KANDIDATIS &quot;homeassistant&quot; KESTUS INF KORDUSTE ARV 1<\/code><\/pre>\n<p>\nN\u00fc\u00fcd, p\u00f5him\u00f5tteliselt, peamine nipp - andmete agregatsioon continuous query abil. See on mehhanism, mis k\u00e4ivitab p\u00e4ringu automaatselt teatud ajavahemike j\u00e4rel, agregatsioonandmed selle p\u00e4ringu p\u00f5hjal ja salvestab tulemuse uue v\u00e4\u00e4rtusena. Vaatame n\u00e4idet (kirjutan veeru kaupa parema loetavuse nimel, kuid tegelikult pidi ma selle k\u00e4su sisestama \u00fches reas).<\/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>\nSee k\u00e4sk:<\/p>\n<ul>\n<li>Loob continuous query nimega cq_water_cold_hourly andmebaasis homeassistant<\/li>\n<li>P\u00e4ringut teostatakse iga tunni j\u00e4rel (time(1h))<\/li>\n<li>P\u00e4ring toob k\u00f5ik andmed homeassistant.autogen.l (liitrid) m\u00f5\u00f5tmisest, sealhulgas k\u00fclma ja sooja vee n\u00e4idud.<\/li>\n<li>Agregeeritud andmed r\u00fchmitatakse entity_id j\u00e4rgi, luues meile eraldi v\u00e4\u00e4rtused k\u00fclma ja sooja vee jaoks.<\/li>\n<li>Kuna liitri arvesti on monotoonselt kasvav j\u00e4rjestus, tuleb iga tunni jooksul v\u00f5tta maksimaalne v\u00e4\u00e4rtus, mist\u00f5ttu aggregatsioon viiakse l\u00e4bi funktsiooni max(value) abil. <\/li>\n<li>Uus v\u00e4\u00e4rtus salvestatakse homeassistant.month.water_meter_hour, kus month on retention policy nimi kuu pikkuse s\u00e4ilitamise tasuta. K\u00fclma ja sooja vee andmed jagunevad erinevatesse kirjetesse vastava entity_id ja v\u00e4\u00e4rtusega v\u00e4ljal value.<\/li>\n<\/ul>\n<p>\n\u00d6\u00f6sel v\u00f5i kui kedagi kodus ei ole, ei ole vee tarbimist, seega ei teki uusi kirjeid homeassistant.autogen.l. Et v\u00e4ltida v\u00e4\u00e4rtuste kadumist tavap\u00e4rastes p\u00e4ringutes, v\u00f5ib kasutada fill(previous). See sunnib InfluxDB-d kasutama eelmise tunni v\u00e4\u00e4rtust. <\/p>\n<p>Kahjuks on continuous query-l \u00fcks erip\u00e4ra: fill(previous) nipp ei t\u00f6\u00f6ta ja kirjed ei luge. See on mingi \u00fcletamatu probleem, mis <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">on juba aastaid arutlusel<\/a><\/noindex>. Selle probleemiga tegeleme hiljem, kuid fill(previous) continuous query-s j\u00e4tku j\u00e4\u00e4b \u2013 see ei h\u00e4iri. <\/p>\n<p>Kontrollime, mis v\u00e4lja tuli (loomulikult tuleb oodata paar tundi):<\/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>\nPange t\u00e4hele, et v\u00e4\u00e4rtused andmebaasis salvestatakse UTC-s, seega erinevad need nimekirjas kolme tunni v\u00f5rra \u2014 kell 7 hommikul InfluxDB-s kuvatud v\u00e4\u00e4rtused vastavad kell 10 hommikul \u00fclaltoodud graafikutele. Samuti pange t\u00e4hele, et kella 2 ja 5 vahel pole kirjeid \u2014 see on see, mis iseloomustab continuous query'd.<\/p>\n<p>Nagu n\u00e4ete, on koondatud v\u00e4\u00e4rtus samuti monotoniliselt kasvav j\u00e4rjestus, kuid kirjed on harvem \u2014 korra tunni kohta. Kuid see pole probleem \u2014 saame kirjutada veel \u00fche k\u00fcsimuse, mis toob \u00f5iged andmed graafikule.<\/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>\nSelgitan:<\/p>\n<ul>\n<li>Haarame andmed homeassistant.month.water_meter_hour andmestikust entity_id=&#8217;water_meter_cold&#8217; viimase 24 tunni jooksul (time &gt;= now() -24h). <\/li>\n<li>Kuna olen juba maininud, et homeassistant.month.water_meter_hour j\u00e4rjestuses v\u00f5ivad m\u00f5ned kirjed puududa. Need andmed genereerime uuesti, k\u00e4ivitades p\u00e4ringu GROUP BY time(1h). Seekord fill(previous) t\u00f6\u00f6tab nii nagu peab, genereerides puuduvad andmed (funktsioon v\u00f5tab eelmise v\u00e4\u00e4rtuse).<\/li>\n<li>Selle p\u00e4ringu k\u00f5ige olulisem osa on funktsioon difference, mis arvutab tunni markide vahelise erinevuse. \u00dcksinda ei toimi see ja vajab agregatsioonifunktsiooni. Olgu selleks max(), mida oleme varem kasutanud.<\/li>\n<\/ul>\n<p>\nTulemuse t\u00e4itmine n\u00e4eb v\u00e4lja selline<\/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>\nKella 2 ja 5 vahel (UTC) ei olnud tarbimist. Siiski tagastab p\u00e4ring sama tarbimise v\u00e4\u00e4rtuse t\u00e4nu fill(previous), ja funktsioon difference lahutab selle iseendast, mille tulemusena saame 0, mis tegelikult on vajalik.<\/p>\n<p>J\u00f5uame viimase sammuni \u2014 graafiku joonistamine. Selleks avame Grafana, avame m\u00f5ne olemasoleva (v\u00f5i loome uue) armatuurlaua, loome uue paneeli. Graafiku seaded on j\u00e4rgmised.<\/p>\n<p><img decoding=\"async\" alt=\"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKavatsen kuvada andmeid k\u00fclma ja sooja vee kohta \u00fchel graafikul. P\u00e4ring on t\u00e4pselt selline, nagu ma eespool kirjeldasin. <\/p>\n<p>Kuvamise parameetrid on seadistatud nii. Mul on see joon graafikuna (lines), mis kulgeb astmeliselt (stairs). Parameeter Stack, selgitan natuke hiljem. Seal on veel m\u00f5ni kuvamise parameeter, kuid need pole nii huvitavad.<\/p>\n<p><img decoding=\"async\" alt=\"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuidas lisada saadud graafik home assistant'i:<\/p>\n<ul>\n<li>v\u00e4lja minna graafiku redigeerimisre\u017eiimist. Mikski p\u00e4rast pakutakse \u00f5iged graafikute jagamise seaded ainult armatuurlaua lehelt.<\/li>\n<li>Kl\u00f5psake kolmnurgale graafiku nime k\u00f5rval, valige men\u00fc\u00fcst jagada.<\/li>\n<li>Avalt avanevas aknas minge sakkile embed.<\/li>\n<li>T\u00fchjendage ruut current time range \u2014 ajavahemiku m\u00e4\u00e4rame URL-i kaudu. <\/li>\n<li>Valige vajalik teema. Minu puhul on see light.<\/li>\n<li>Kopeerige saadud URL lovelace-UI seadete kaardile.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"python\">      - type: iframe\n        id: graf_water_hourly\n        url: &quot;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&quot;\n<\/code><\/pre>\n<p>\nPange t\u00e4hele, et ajavahemik (viimased 2 p\u00e4eva) m\u00e4\u00e4ratakse just siin, mitte armatuurlauda seadetes. <\/p>\n<p>Graafik n\u00e4eb v\u00e4lja nii. Sooja vett ma viimase kahe p\u00e4eva jooksul ei kasutanud, seet\u00f5ttu joonistatakse ainult k\u00fclma vee graafik.<\/p>\n<p><img decoding=\"async\" alt=\"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii et ei suutnud ma otsustada, milline graafik mulle rohkem meeldib, astmelise joonega v\u00f5i p\u00e4ris tulpadega. Seet\u00f5ttu toome lihtsalt n\u00e4ite p\u00e4evagraafikust, seekord ainult tulpadega. P\u00e4ringud tehakse sarnasel viisil nagu eespool kirjeldatud. Kuvamise parameetrid on sellised:<\/p>\n<p><img decoding=\"async\" alt=\"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee graafik n\u00e4eb v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"Nutika kodu: Joonistame vee ja elektri tarbimise graafikud Home Assistantis\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii et r\u00e4\u00e4kides parameetrist Stack. Sellel graafikul joonistatakse k\u00fclma vee tulp sooja vee tulba peale. \u00dcldine k\u00f5rgus vastab k\u00fclma ja sooja vee tarbimise kogusummale ajavahemikul. <\/p>\n<p>K\u00f5ik n\u00e4idatud graafikud on d\u00fcnaamilised. Saate hiirega huvipakkuva punkti peale liikuda ja vaadata \u00fcksikasju ja v\u00e4\u00e4rtust konkreetses punktis. <\/p>\n<p>Kahjuks ei ole ilma paarikese t\u00f5rva. Tulpade graafikul (erinevalt astmelisest joonegraafikust) on tulba keskmine punkt mitte keskp\u00e4eval, vaid kell 00:00. St tulba vasak pool joonistatakse eelmise p\u00e4eva kohale. Nii et laup\u00e4eva ja p\u00fchap\u00e4eva graafikud on joonistatud veidi vasakule sinise ala suhtes. Praeguseks ei ole mul veel lahendust. <\/p>\n<p>Teine probleem seisneb selles, et kuu intervallidega on keeruline \u00f5igesti t\u00f6\u00f6tada. Asi on selles, et tunni\/p\u00e4eva\/n\u00e4dala pikkus on fikseeritud, kuid kuu pikkus on iga kord erinev. InfluxDB saab t\u00f6\u00f6tada ainult \u00fchtsete intervallidega. Seni on mu m\u00f5tlemine piirdunud fikseeritud 30-p\u00e4evase intervalliga. Jah, graafik aastate l\u00f5ikes veidi moonutab ja baarid ei \u00fchti t\u00e4iesti t\u00e4pselt kuudega. Kuid kuna see asi huvitab mind lihtsalt n\u00e4itajana, siis ma lepin sellega. <\/p>\n<p>N\u00e4en v\u00e4hemalt kahte lahendust:<\/p>\n<ul>\n<li>J\u00e4tta kuu graafikud k\u00f5rvale ja piirduda n\u00e4dalastega. 52 n\u00e4dalast baari aastas n\u00e4eb t\u00e4iesti hea v\u00e4lja.<\/li>\n<li>Kuu tarbimist arvestada teise meetodina ja Grafanat kasutada vaid ilusate graafikute jaoks. See osutub t\u00e4iesti t\u00e4pseks lahenduseks. V\u00f5ib isegi eelmisel aastal graafikud katsetada \u2014 Grafana oskab ka seda.<\/li>\n<\/ul>\n<h2>Kokkuv\u00f5te<\/h2>\n<p>\nEi tea, miks, aga ma naudin sellist t\u00fc\u00fcpi graafikuid. Need n\u00e4itavad, et elu pulbitseb ja k\u00f5ik muutub. Eile oli palju, t\u00e4na v\u00e4he, homme on kuidagi veel. Peab veel pereliikmetega tarbimise teemal r\u00e4\u00e4kima. Kuid isegi praeguste isudega muutub lihtsalt suur ja arusaamatu number arvel piisavalt arusaadavaks tarbimise pildiks.<\/p>\n<p>Hoolimata pea 20-aastasest programmeerimise karj\u00e4\u00e4rist ei ole ma andmebaasidega praktiliselt kokku puutunud. Seet\u00f5ttu tundus v\u00e4lise andmebaasi seadistamine millegi sellise, mis on keeruline ja arusaamatu. K\u00f5ik muutis <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">\u00fclespool mainitud artikkel<\/a><\/noindex> \u2014 selgus, et sobiva t\u00f6\u00f6riista \u00fchendamine toimub paaris kl\u00f5psus, ja spetsialiseeritud t\u00f6\u00f6riistaga muutub graafikute loomise \u00fclesanne veidi lihtsamaks.<\/p>\n<p>Pealkirjas mainisin elektritarbimist. Kahjuks ei saa ma hetkel esitada \u00fchtegi graafikut. \u00dcks SDM120 m\u00f5\u00f5tur on mul l\u00e4bi kukkunud, ja teine jamab Modbusi kaudu \u00fchenduse v\u00f5ttes. Kuid see ei m\u00f5juta kuidagi selle artikli sisu \u2014 graafikud ehitatakse samamoodi, nagu veega.<\/p>\n<p>Selles artiklis olen l\u00e4bi viinud need l\u00e4henemisviisid, mida olen ise proovinud. Kindlasti on veel mingeid andmete kogumise ja visualiseerimise organiseerimise viise, millest ma ei tea. R\u00e4\u00e4kige mulle sellest kommentaarides, see oleks mulle v\u00e4ga huvitav. Olen avatud konstruktiivsele kriitikale ja uutele ideedele. Loodan, et esitatud materjal aitab ka kedagi.<br \/>\n<br \/>Allikas: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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,\" \/>\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\/et\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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 \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,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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\udd47Nutika kodu: Loome vee ja elektri tarbimise graafikud Home Assistantis | ProHoster","description":"Iga kord, kui saan elektri ja vee arve, imestan \u2014 kas minu pere t\u00f5esti tarbib nii palju? Jah, vannitoas on soe p\u00f5rand ja boiler, kuid nad ei k\u00e4i ju pidevalt. Vett p\u00fc\u00fcame ka kokku hoida (kuigi vannis meeldib ka aega veeta). M\u00f5ned aastat tagasi \u00fchendasin juba vee ja elektri m\u00f5\u00f5turid nutika kodu s\u00fcsteemi.","canonical_url":"https:\/\/prohoster.info\/et\/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":"et_EE","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 \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,","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}