{"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\/ro\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDe fiecare dat\u0103 c\u00e2nd primesc factura pentru electricitate \u0219i ap\u0103, m\u0103 mir \u2014 oare familia mea consum\u0103 at\u00e2t de mult? Da, \u00een baie am instalat un sistem de \u00eenc\u0103lzire prin pardoseal\u0103 \u0219i un boiler, dar acestea nu func\u021bioneaz\u0103 constant. Se pare c\u0103 \u0219i economisim ap\u0103 (de\u0219i ne plac b\u0103ile relaxante). Acum c\u00e2\u021biva ani, am <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">conectat contoarele de ap\u0103<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">electricitate<\/a><\/noindex> la casa inteligent\u0103, dar de atunci nu am avansat mai departe. Analiza consumului mi-a venit \u00een minte abia acum, ceea ce reprezint\u0103, de fapt, subiectul acestui articol.<\/p>\n<p>Recent, am trecut la Home Assistant ca sistem de cas\u0103 inteligent\u0103. Una dintre motive a fost exact posibilitatea de a organiza colectarea unei cantit\u0103\u021bi mari de date, cu op\u021biunea de a crea diverse tipuri de grafice.<\/p>\n<p>Informa\u021biile descrise \u00een acest articol nu sunt noi, aceste concepte au fost deja prezentate online sub diverse forme. Dar fiecare articol descrie, de obicei, doar o abordare sau un aspect. A trebuit s\u0103 compar toate aceste abord\u0103ri \u0219i s\u0103 aleg pe cea mai potrivit\u0103. Articolul nu ofer\u0103 o informa\u021bie complet\u0103 despre colectarea datelor, dar reprezint\u0103 o sintez\u0103 a modului \u00een care am procedat eu. Deci, critica constructiv\u0103 \u0219i sugestiile de \u00eembun\u0103t\u0103\u021bire sunt binevenite.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Formularea problemei<\/h2>\n<p>\nDeci, scopul exerci\u021biului de ast\u0103zi este de a ob\u021bine grafice frumoase pentru consumul de ap\u0103 \u0219i electricitate:<\/p>\n<ul>\n<li>Pe ore pentru 2 zile<\/li>\n<li>Pe zile pentru 2 s\u0103pt\u0103m\u00e2ni<\/li>\n<li>(op\u021bional) pe s\u0103pt\u0103m\u00e2ni \u0219i pe luni<\/li>\n<\/ul>\n<p>\n\u00cen aceast\u0103 demers, ne a\u0219teapt\u0103 c\u00e2teva dificult\u0103\u021bi:<\/p>\n<ul>\n<li>Componentele standard ale graficelor sunt, de obicei, destul de limitate. \u00cen cel mai bun caz, se poate construi un grafic liniar pe puncte.\n<p>Dac\u0103 cau\u021bi bine, po\u021bi g\u0103si componente ter\u021be care extind capacit\u0103\u021bile graficului standard. Pentru home assistant, componentul <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>, este decent \u0219i frumos, dar \u0219i acesta are unele limit\u0103ri:<\/p>\n<ul>\n<li>Este dificil s\u0103 setezi parametrii pentru graficele cu bare pe intervale mari (l\u0103\u021bimea barei este setat\u0103 \u00een frac\u021biuni de or\u0103, astfel c\u0103 intervalele mai lungi de o or\u0103 vor fi exprimate prin numere frac\u021bionare)<\/li>\n<li>Nu po\u021bi ad\u0103uga diferite entit\u0103\u021bi pe un singur grafic (de exemplu, temperatura \u0219i umiditatea, sau s\u0103 \u00eembini un grafic cu bare cu unul liniar)<\/li>\n<\/ul>\n<\/li>\n<li>Nu doar c\u0103 home assistant folose\u0219te \u00een mod implicit cea mai primitiv\u0103 baz\u0103 de date SQLite (iar eu, ne\u00eendem\u00e2natic, nu am reu\u0219it s\u0103 instalez MySQL sau Postgres), dar datele sunt stocate \u00eentr-un mod nu tocmai optim. De exemplu, la fiecare modificare a oric\u0103rui parametru digital, indiferent c\u00e2t de mic ar fi, se scrie \u00een baz\u0103 un json uria\u0219 de aproximativ un kilobyte.\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>\nAm destul de multe senzori (senzori de temperatur\u0103 \u00een fiecare camer\u0103, contoare de ap\u0103 \u0219i electricitate), iar unii dintre ace\u0219tia genereaz\u0103 destul de multe date. De exemplu, contorul de electricitate SDM220 genereaz\u0103 aproximativ zece valori la fiecare 10-15 secunde, iar eu a\u0219 dori s\u0103 instalez vreo 8 astfel de contoare. \u0218i mai sunt o mul\u021bime de parametri care sunt calcula\u021bi pe baza altor senzori. Astfel, toate aceste valori pot duce la o cre\u0219tere a bazei cu 100-200 MB zilnic. Dup\u0103 o s\u0103pt\u0103m\u00e2n\u0103, sistemul va func\u021biona cu dificultate, iar dup\u0103 o lun\u0103, flash-ul se va strica (\u00een cazul unei instal\u0103ri tipice home assistant pe Raspberry PI), iar despre stocarea datelor timp de un an nu poate fi vorba.<\/li>\n<li>Dac\u0103 ai noroc, contorul t\u0103u poate s\u0103 \u00ee\u0219i numere singur consumul. Po\u021bi oric\u00e2nd s\u0103 te adresezi contorului \u0219i s\u0103 \u00eentrebi care este valoarea acumulat\u0103 a consumului. De obicei, toate contoarele de electricitate care au o interfa\u021b\u0103 digital\u0103 (RS232\/RS485\/Modbus\/Zigbee) ofer\u0103 aceast\u0103 posibilitate.\n<p>Mai r\u0103u este dac\u0103 dispozitivul poate m\u0103sura doar un anumit parametru instantaneu (de exemplu, puterea instantanee sau curentul) sau pur \u0219i simplu genereaz\u0103 impulsuri la fiecare X watt-or\u0103 sau litri. Atunci trebuie s\u0103 ne g\u00e2ndim cum \u0219i cu ce s\u0103 integr\u0103m aceste date \u0219i unde s\u0103 acumul\u0103m valoarea. Exist\u0103 riscul de a pierde o raportare din diverse motive, iar precizia sistemului, \u00een ansamblu, ridic\u0103 \u00eentreb\u0103ri. Desigur, toate acestea pot fi delegate unui sistem de automatizare a locuin\u021bei, precum home assistant, dar aspectul legat de cantitatea de \u00eenregistr\u0103ri \u00een baza de date nu poate fi ignorat, iar interogarea senzorilor mai des dec\u00e2t o dat\u0103 pe secund\u0103 nu este posibil\u0103 (din cauza limit\u0103rilor arhitecturii home assistant).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Abordare 1<\/h2>\n<p>\n\u00cen primul r\u00e2nd, s\u0103 vedem ce ofer\u0103 home assistant din cutie. M\u0103surarea consumului pe o anumit\u0103 perioad\u0103 este o func\u021bionalitate foarte solicitat\u0103. Desigur, aceasta a fost implementat\u0103 de mult timp sub forma unui component specializat \u2013 utility_meter. <\/p>\n<p>Esenta componentului const\u0103 \u00een faptul c\u0103 acesta creeaz\u0103 o variabil\u0103 numit\u0103 current_accumulated_value, \u0219i o reseteaz\u0103 la sf\u00e2r\u0219itul unei perioade stabilite (or\u0103\/s\u0103pt\u0103m\u00e2n\u0103\/lun\u0103). Componentul monitorizeaz\u0103 singur variabila de intrare (valoarea unui senzor anume), se aboneaz\u0103 la modific\u0103rile de valoare \u2013 iar tu ob\u021bii rezultatul final f\u0103r\u0103 alte interven\u021bii. Aceast\u0103 func\u021bionalitate poate fi descris\u0103 \u00een doar c\u00e2teva linii \u00een fi\u0219ierul de configurare.<\/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>\nAici, sensor.water_meter_cold reprezint\u0103 valoarea curent\u0103 a contorului \u00een litri, pe care o primesc <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">direct de la dispozitiv<\/a><\/noindex> prin mqtt. Structura creeaz\u0103 2 senzori noi, water_cold_hour_um \u0219i water_cold_day_um, care acumuleaz\u0103 citirile pe or\u0103 \u0219i pe zi, reset\u00e2ndu-le la sf\u00e2r\u0219itul perioadei. Iat\u0103 un grafic al acumul\u0103rii pe or\u0103 pentru o jum\u0103tate de zi.<\/p>\n<p><img decoding=\"async\" alt=\"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCodul pentru graficul orar \u0219i zilnic pentru lovelace-UI arat\u0103 astfel:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consum orar de ap\u0103 folosind variabile'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consum zilnic de ap\u0103 folosind variabile'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\n\u00cen acest algoritm se afl\u0103, de fapt, problema acestui tip de abordare. A\u0219a cum am men\u021bionat, pentru fiecare valoare de intrare (citirea curent\u0103 a contorului pentru fiecare litru urm\u0103tor) se genereaz\u0103 c\u00e2te 1kB de \u00eenregistrare \u00een baz\u0103. Fiecare utility meter genereaz\u0103, de asemenea, o nou\u0103 valoare, care se adaug\u0103 \u00een baz\u0103. Dac\u0103 vreau s\u0103 colectez citiri orare\/zonale\/s\u0103pt\u0103m\u00e2nale\/lunare, \u0219i pentru c\u00e2teva coloane de ap\u0103, \u0219i s\u0103 adaug \u00eenc\u0103 un pachet de contoare de electricitate \u2014 vor fi foarte multe date. De fapt, datele nu sunt multe, dar fiindc\u0103 home assistant scrie o mul\u021bime de informa\u021bii inutile \u00een baz\u0103, dimensiunea bazei va cre\u0219te rapid. M\u0103 tem s\u0103 estimez dimensiunea bazei pentru graficele s\u0103pt\u0103m\u00e2nale \u0219i lunare.<\/p>\n<p>\u00cen plus, utility meter-ul \u00een sine nu rezolv\u0103 problema pus\u0103. Graficele valorilor pe care le ofer\u0103 utility meter sunt o func\u021bie monoton cresc\u0103toare, care reseteaz\u0103 la 0 \u00een fiecare or\u0103. Avem nevoie de un grafic care s\u0103 fie u\u0219or de \u00een\u021beles pentru utilizator, care s\u0103 arate c\u00e2te litri au fost consuma\u021bi pe o anumit\u0103 perioad\u0103. Componenta standard history-graph nu poate face asta, dar ne poate ajuta o component\u0103 extern\u0103 mini-graph-card.<\/p>\n<p>Acesta este codul pentru cardul 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: &quot;Consumul orar de ap\u0103 agregat pe baza contorului utilitar&quot;\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nPe l\u00e2ng\u0103 set\u0103rile standard, cum ar fi numele senzorului, tipul graficului, culoarea (portocaliul standard nu mi-a pl\u0103cut), este important s\u0103 men\u021bionez 3 set\u0103ri:<\/p>\n<ul>\n<li>group_by:hour \u2014 graficul va fi generat cu alinierea coloanelor la \u00eenceputul fiec\u0103rei ore<\/li>\n<li>points_per_hour: 1 \u2014 o coloan\u0103 pentru fiecare or\u0103<\/li>\n<li>\u0218i cel mai important, aggregate_func: max \u2014 se va lua valoarea maxim\u0103 \u00een cadrul fiec\u0103rei ore. Acest parametru transform\u0103 graficul \u00een form\u0103 de dinte de fer\u0103str\u0103u \u00een coloane<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIgnora\u021bi coloanele din st\u00e2nga \u2014 acesta este comportamentul standard al componentei dac\u0103 nu exist\u0103 date. \u0218i nu au fost date \u2014 abia acum c\u00e2teva ore am activat colectarea datelor prin utility meter doar pentru acest articol (metoda mea actual\u0103 o voi prezenta pu\u021bin mai jos). <\/p>\n<p>\u00cen aceast\u0103 imagine am vrut s\u0103 ar\u0103t c\u0103, uneori, afi\u0219area datelor chiar func\u021bioneaz\u0103, iar coloanele reflect\u0103 cu adev\u0103rat valorile corecte. Doar c\u0103 nu toate. Coloana eviden\u021biat\u0103 pentru intervalul dintre 11 \u0219i 12 diminea\u021ba arat\u0103 inexplicabil 19 litri, \u00een timp ce pe graficul dentat pu\u021bin mai sus, pentru aceea\u0219i perioad\u0103 \u0219i de la acela\u0219i senzor, vedem un consum de 62 de litri. Fie este un bug, fie oamenii nu \u0219tiu ce fac. \u00cens\u0103 nu am \u00een\u021beles de ce datele de pe dreapta au fost deranjate \u2014 consumul acolo a fost normal, lucru vizibil \u0219i pe graficul dentat.<\/p>\n<p>\u00cen general, nu am reu\u0219it s\u0103 ob\u021bin credibilitate cu aceast\u0103 abordare \u2014 graficul arat\u0103 aproape \u00eentotdeauna o nebunie.<\/p>\n<p>Cod similar pentru senzorul zilnic. <\/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;Consum zilnic de ap\u0103 agregat pe baza contorului utilitar&quot;\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nRe\u021bine\u021bi c\u0103 parametrul group_by este setat pe interval, iar parametrul points_per_hour controleaz\u0103 totul. \u0218i aici se afl\u0103 o alt\u0103 problem\u0103 a acestui component \u2014 points_per_hour func\u021bioneaz\u0103 bine pe grafice de o or\u0103 sau mai pu\u021bin, dar func\u021bioneaz\u0103 prost pe intervale mai mari. Astfel, pentru a ob\u021bine o coloan\u0103 pentru o zi, a trebuit s\u0103 inscriu valoarea 1\/24=0.0416666. Nu mai vorbesc despre graficele s\u0103pt\u0103m\u00e2nale \u0219i lunare.<\/p>\n<h2>Abordarea 2<\/h2>\n<p>\n\u00cenc\u0103 explor\u00e2nd Home Assistant, am dat peste acest videoclip:<\/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=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nCamaradul adun\u0103 date de consum de la mai multe tipuri de prize Xiaomi. Sarcina lui este ceva mai simpl\u0103 \u2014 doar s\u0103 afi\u0219eze valoarea consumului pentru ast\u0103zi, ieri \u0219i pentru o lun\u0103. Niciun grafic nu este necesar. <\/p>\n<p>S\u0103 l\u0103s\u0103m deoparte discu\u021biile despre integrarea manual\u0103 a valorilor instantanee de putere \u2014 despre \u201eprecizia\u201d acestui abord\u0103ri am scris deja mai sus. Nu este clar de ce nu a ales s\u0103 foloseasc\u0103 valorile de consum acumulate, care sunt deja colectate de aceea\u0219i priz\u0103. \u00cen opinia mea, integrarea \u00een interiorul echipamentului va func\u021biona mai bine. <\/p>\n<p>Din videoclip vom prelua ideea de a calcula manual consumul pe o perioad\u0103. Omul calculeaz\u0103 doar valorile pentru ast\u0103zi \u0219i ieri, dar noi vom merge mai departe \u0219i vom \u00eencerca s\u0103 desen\u0103m un grafic. Esen\u021ba metodei propuse \u00een cazul meu este urm\u0103toarea.<\/p>\n<p>Vom crea o variabil\u0103 numit\u0103 valoare_la_inceputul_orelei, \u00een care vom \u00eenregistra valorile curente ale contorului.<br \/>\nLa sf\u00e2r\u0219itul orei (sau la \u00eenceputul orei urm\u0103toare), vom calcula diferen\u021ba dintre citirea curent\u0103 \u0219i cea memorat\u0103 la \u00eenceputul orei. Aceast\u0103 diferen\u021b\u0103 va reprezenta consumul pentru ora curent\u0103 \u2014 vom salva valoarea \u00eentr-un senzor, iar \u00een viitor, vom construi un grafic pe baza acestei valori. <br \/>\nDe asemenea, trebuie s\u0103 \u201ereset\u0103m\u201d variabila valoare_la_\u00eenceput_ore, stoc\u00e2nd acolo valoarea curent\u0103 a contorului.<\/p>\n<p>Toate acestea se pot face prin intermediul home assistant. <\/p>\n<p>Vor fi necesare c\u00e2teva linii mai multe de cod dec\u00e2t \u00een abordarea anterioar\u0103. La \u00eenceput, vom crea aceste \u201evariabile\u201d. \u00cen mod implicit, nu avem entitatea \u201evariabil\u0103\u201d, dar putem folosi serviciile brokerului MQTT. Vom trimite acolo valori cu flagul retain=true \u2014 aceasta va p\u0103stra valoarea \u00een broker \u0219i poate fi preluat\u0103 oric\u00e2nd, chiar \u0219i dup\u0103 o repornire a Home Assistant. Am realizat \u00een mod direct contoare orare \u0219i zilnice.<\/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>\nToat\u0103 magia se desf\u0103\u0219oar\u0103 \u00een automatiz\u0103ri, care se activeaz\u0103 la fiecare or\u0103 \u0219i \u00een fiecare noapte, respectiv.<\/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>\nAmbele automatiz\u0103ri efectueaz\u0103 2 ac\u021biuni:<\/p>\n<ul>\n<li>Calculul valorii pentru interval ca diferen\u021b\u0103 \u00eentre valoarea ini\u021bial\u0103 \u0219i cea final\u0103<\/li>\n<li>Actualizeaz\u0103 valoarea de baz\u0103 pentru intervalul urm\u0103tor<\/li>\n<\/ul>\n<p>\nConstruirea graficelor \u00een acest caz se rezolv\u0103 prin history-graph obi\u0219nuit:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consum orar de ap\u0103 folosind variabile'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consum zilnic de ap\u0103 folosind variabile'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nArat\u0103 astfel:<\/p>\n<p><img decoding=\"async\" alt=\"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen principiu, aceasta este deja ceea ce este necesar. Avantajul acestei metode este c\u0103 datele sunt generate o singur\u0103 dat\u0103 pe interval. Adic\u0103, vor fi doar 24 de \u00eenregistr\u0103ri pe zi pentru graficul orar. <\/p>\n<p>Din p\u0103cate, aceasta nu rezolv\u0103 problema general\u0103 a bazei de date \u00een cre\u0219tere. Dac\u0103 vreau un grafic al consumului lunar, va trebui s\u0103 stochez datele de cel pu\u021bin un an. \u0218i cum asistentul de acas\u0103 ofer\u0103 doar o setare a duratei de stocare pentru \u00eentreaga baz\u0103 de date, asta \u00eenseamn\u0103 c\u0103 TOATE datele din sistem trebuie p\u0103strate timp de un an. De exemplu, \u00eentr-un an consum 200 de metri cubi de ap\u0103, ceea ce \u00eenseamn\u0103 200000 de \u00eenregistr\u0103ri \u00een baz\u0103. \u0218i dac\u0103 lu\u0103m \u00een considerare \u0219i altele senzori, cifra devine \u00eenfrico\u0219\u0103toare.<\/p>\n<h2>Metoda 3<\/h2>\n<p>\nDin fericire, oameni inteligen\u021bi au rezolvat deja aceast\u0103 problem\u0103 prin scrierea bazei de date InfluxDB. Aceast\u0103 baz\u0103 este optimizat\u0103 special pentru stocarea datelor bazate pe timp \u0219i se potrive\u0219te perfect pentru stocarea valorilor diferitelor senzori. Sistemul ofer\u0103 de asemenea un limbaj de interogare similar cu SQL, care permite extragerea valorilor din baz\u0103 \u0219i apoi agregarea acestora \u00een diverse moduri. \u00cen cele din urm\u0103, datele diferite pot fi stocate timpuri diferite. De exemplu, m\u0103sur\u0103torile frecvent schimb\u0103toare, cum ar fi temperatura sau umiditatea, pot fi stocate doar c\u00e2teva s\u0103pt\u0103m\u00e2ni, \u00een timp ce m\u0103sur\u0103torile zilnice ale consumului de ap\u0103 pot fi p\u0103strate timp de un an.<\/p>\n<p>\u00cen plus fa\u021b\u0103 de InfluxDB, persoanele inteligente au inventat \u0219i Grafana \u2014 un sistem de generare a graficelor pe baza datelor din InfluxDB. Grafana poate crea diferite tipuri de grafice, le poate personaliza detaliat \u0219i, cel mai important, aceste grafice pot fi \"\u00eenc\u0103rcate\" \u00een UI-ul lovelace al asistentului de acas\u0103.<\/p>\n<p>Inspira\u021bie <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">aici <\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">aici<\/a><\/noindex>. Articolele detaliaz\u0103 procesul de instalare \u0219i conectare a InfluxDB \u0219i Grafana la asistentul de acas\u0103. Eu m\u0103 voi concentra pe solu\u021bionarea problemei mele specifice.<\/p>\n<p>A\u0219adar, \u00eent\u00e2i vom \u00eencepe s\u0103 adun\u0103m valorile contoarelor \u00een influxDB. Un exemplu de configura\u021bie pentru asistentul de acas\u0103 (\u00een acest exemplu, m\u0103 voi distra nu doar cu apa rece, ci \u0219i cu cea cald\u0103):<\/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>\nVom dezactiva salvarea acestor date \u00een baza intern\u0103 a asistentului de acas\u0103, pentru a nu o umfla inutil:<\/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>\nAcum s\u0103 trecem la consola InfluxDB \u0219i s\u0103 configur\u0103m baza noastr\u0103 de date. \u00cen special, trebuie s\u0103 stabilim c\u00e2t timp vor fi p\u0103strate anumite date. Acest lucru se regleaz\u0103 prin a\u0219a-numitul retention policy \u2014 este similar cu bazele de date din cadrul bazei de date principale, fiecare dintre acestea av\u00e2nd propriile set\u0103ri. Implicit, toate datele sunt stocate \u00een retention policy numit\u0103 autogen, iar aceste date vor fi p\u0103strate o s\u0103pt\u0103m\u00e2n\u0103. A\u0219 dori ca datele pe or\u0103 s\u0103 fie p\u0103strate o lun\u0103, cele s\u0103pt\u0103m\u00e2nale \u2014 un an, iar cele lunare s\u0103 nu fie \u0219terse niciodat\u0103. Vom crea retention policy corespunz\u0103toare.<\/p>\n<pre><code class=\"sql\">CREA\u021aI POLITICA DE RETEN\u021aIE &quot;lun\u0103&quot; PE &quot;homeassistant&quot; DURAT\u0102 30d REPLICA 1\nCREA\u021aI POLITICA DE RETEN\u021aIE &quot;an&quot; PE &quot;homeassistant&quot; DURAT\u0102 52w REPLICA 1\nCREA\u021aI POLITICA DE RETEN\u021aIE &quot;infinite&quot; PE &quot;homeassistant&quot; DURAT\u0102 INF REPLICA 1<\/code><\/pre>\n<p>\nAcum, de fapt, trucul principal \u2014 agregarea datelor folosind continuous query. Acesta este un mecanism care execut\u0103 automat o interogare la intervale de timp determinate, agreg\u00e2nd datele conform acelei interog\u0103ri, iar rezultatul \u00eel stocheaz\u0103 \u00eentr-o valoare nou\u0103. S\u0103 lu\u0103m un exemplu (scriu pe vertical\u0103 pentru a fi mai u\u0219or de citit, dar \u00een realitate, a trebuit s\u0103 introduc aceast\u0103 comand\u0103 pe o linie).<\/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>\nAceast\u0103 comand\u0103:<\/p>\n<ul>\n<li>Creaz\u0103 continuous query numit\u0103 cq_water_cold_hourly \u00een baza homeassistant.<\/li>\n<li>Interogarea va fi executat\u0103 \u00een fiecare or\u0103 (time(1h)).<\/li>\n<li>Interogarea va extrage toate datele din measurement-ul homeassistant.autogen.l (litri), incluz\u00e2nd citirile pentru ap\u0103 rece \u0219i ap\u0103 cald\u0103.<\/li>\n<li>Datele agregate vor fi grupate dup\u0103 entity_id, ceea ce ne va crea valori separate pentru ap\u0103 rece \u0219i ap\u0103 cald\u0103.<\/li>\n<li>Av\u00e2nd \u00een vedere c\u0103 contorul de litri este o secven\u021b\u0103 monoton cresc\u0103toare, \u00een cadrul fiec\u0103rei ore va trebui s\u0103 lu\u0103m valoarea maxim\u0103, astfel \u00eenc\u00e2t agregarea se va face prin func\u021bia max(value). <\/li>\n<li>Noua valoare va fi \u00eenregistrat\u0103 \u00een homeassistant.month.water_meter_hour, unde month este numele retention policy cu termen de p\u0103strare de o lun\u0103. De asemenea, datele pentru ap\u0103 rece \u0219i ap\u0103 cald\u0103 vor fi distribuite \u00een \u00eenregistr\u0103ri separate cu entity_id corespunz\u0103tor \u0219i valoarea \u00een c\u00e2mpul value.<\/li>\n<\/ul>\n<p>\nNoaptea sau c\u00e2nd nu este nimeni acas\u0103, nu exist\u0103 consum de ap\u0103, iar prin urmare nu exist\u0103 \u00eenregistr\u0103ri noi \u00een homeassistant.autogen.l. Pentru a evita absen\u021ba valorilor \u00een interog\u0103rile obi\u0219nuite, se poate folosi fill(previous). Acest lucru va determina InfluxDB s\u0103 foloseasc\u0103 valoarea de la ora precedent\u0103. <\/p>\n<p>Din p\u0103cate, interog\u0103rile continue au o particularitate: trucul fill(previous) nu func\u021bioneaz\u0103 \u0219i \u00eenregistr\u0103rile pur \u0219i simplu nu se creeaz\u0103. Este o problem\u0103 insurmontabil\u0103 care <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">este discutat\u0103 de c\u00e2\u021biva ani<\/a><\/noindex>. Ne vom ocupa de aceast\u0103 problem\u0103 mai t\u00e2rziu, iar fill(previous) \u00een interog\u0103rile continue s\u0103 r\u0103m\u00e2n\u0103 \u2014 nu deranjeaz\u0103. <\/p>\n<p>S\u0103 vedem ce a ie\u0219it (desigur, trebuie s\u0103 a\u0219tept\u0103m c\u00e2teva ore):<\/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>\nObserva\u021bi c\u0103 valorile din baz\u0103 sunt salvate \u00een UTC, a\u0219a c\u0103, \u00een aceast\u0103 list\u0103, ele difer\u0103 cu 3 ore \u2014 valorile de la ora 7 diminea\u021ba din outputul InfluxDB corespund valorilor de la ora 10 diminea\u021ba de pe graficele de mai sus. De asemenea, re\u021bine\u021bi c\u0103 \u00eentre orele 2 \u0219i 5 diminea\u021ba nu exist\u0103 \u00eenregistr\u0103ri \u2014 aceasta este particularitatea interog\u0103rii continue.<\/p>\n<p>Dup\u0103 cum vede\u021bi, valoarea agregat\u0103 este de asemenea o secven\u021b\u0103 monoton cresc\u0103toare, doar c\u0103 \u00eenregistr\u0103rile sunt mai rare \u2014 o dat\u0103 pe or\u0103. Dar nu este o problem\u0103 \u2014 putem scrie o nou\u0103 interogare care va extrage datele corecte pentru grafic.<\/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>\n\u00cencepem cu deslu\u0219irea:<\/p>\n<ul>\n<li>Din baza homeassistant.month.water_meter_hour vom extrage date pentru entity_id=&#8217;water_meter_cold&#8217; \u00een ultimele 24 de ore (time &gt;= now() -24h). <\/li>\n<li>Dup\u0103 cum am men\u021bionat, \u00een secven\u021ba homeassistant.month.water_meter_hour pot lipsi unele \u00eenregistr\u0103ri. Aceste date le vom genera din nou, rul\u00e2nd interogarea cu GROUP BY time(1h). De data aceasta, fill(previous) va func\u021biona corect, gener\u00e2nd datele lips\u0103 (func\u021bia va lua valoarea anterioar\u0103)<\/li>\n<li>Cel mai important \u00een aceast\u0103 interogare este func\u021bia difference, care va calcula diferen\u021ba dintre marcajele orare. Ea nu func\u021bioneaz\u0103 de la sine \u0219i necesit\u0103 o func\u021bie de agregare. S\u0103 zicem c\u0103 va fi max() utilizat\u0103 anterior.<\/li>\n<\/ul>\n<p>\nRezultatul execu\u021biei arat\u0103 a\u0219a<\/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>\n\u00centre 2 \u0219i 5 diminea\u021ba (UTC) nu a fost consum. Cu toate acestea, cererea va returna aceea\u0219i valoare a consumului datorit\u0103 fill(previous), iar func\u021bia difference va sc\u0103dea aceast\u0103 valoare din ea \u00eens\u0103\u0219i, ob\u021bin\u00e2nd astfel 0, ceea ce este cerut de fapt.<\/p>\n<p>Acum r\u0103m\u00e2ne doar s\u0103 construim graficul. Pentru aceasta, deschidem Grafana, deschidem un panou existent (sau cre\u0103m unul nou), \u0219i cre\u0103m un nou grafic. Set\u0103rile grafice vor fi urm\u0103toarele.<\/p>\n<p><img decoding=\"async\" alt=\"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVoi afi\u0219a datele pentru apa rece \u0219i cald\u0103 pe acela\u0219i grafic. Cererea este exact aceea\u0219i pe care am descris-o mai sus. <\/p>\n<p>Parametrii de afi\u0219are sunt seta\u021bi astfel. Pentru mine va fi un grafic cu linii (lines), care merge \u00een trepte (stairs). Voi explica parametrul Stack mai jos. Acolo mai sunt c\u00e2\u021biva parametri de afi\u0219are, dar nu sunt at\u00e2t de interesan\u021bi.<\/p>\n<p><img decoding=\"async\" alt=\"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPentru a ad\u0103uga graficul ob\u021binut \u00een home assistant, trebuie s\u0103:<\/p>\n<ul>\n<li>ies din modul de editare a graficului. De ceva timp, set\u0103rile corecte de partajare a graficelor sunt oferite doar de pe pagina tabloului de bord.<\/li>\n<li>Face\u021bi clic pe triunghiul de l\u00e2ng\u0103 numele graficului, din meniu selecta\u021bi share.<\/li>\n<li>\u00cen fereastra deschis\u0103, trece\u021bi la tab-ul embed.<\/li>\n<li>Debifa\u021bi op\u021biunea current time range \u2014 intervalul de timp va fi setat prin URL. <\/li>\n<li>Selecta\u021bi tema necesar\u0103. \u00cen cazul meu, aceasta este light.<\/li>\n<li>Copia\u021bi URL-ul ob\u021binut \u00een cartea de set\u0103ri lovelace-UI.<\/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>\nRe\u021bine\u021bi c\u0103 intervalul de timp (ultimele 2 zile) este setat aici, nu \u00een set\u0103rile tabloului de bord. <\/p>\n<p>Graficul arat\u0103 astfel. Nu am folosit ap\u0103 cald\u0103 \u00een ultimele 2 zile, prin urmare graficul apei reci este singurul afi\u0219at.<\/p>\n<p><img decoding=\"async\" alt=\"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAstfel, nu am ajuns la o decizie cu privire la care grafic \u00eemi place mai mult, cel cu linii \u00een trepte sau coloanele reale. A\u0219a c\u0103, voi prezenta doar un exemplu de grafic zilnic de consum, de data aceasta cu coloane. Cererile sunt construite similar celor descrise mai sus. Parametrii de afi\u0219are sunt:<\/p>\n<p><img decoding=\"async\" alt=\"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAcest grafic arat\u0103 astfel:<\/p>\n<p><img decoding=\"async\" alt=\"Cas\u0103 inteligent\u0103: Construim graficele consumului de ap\u0103 \u0219i electricitate \u00een Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA\u0219adar, despre parametrul Stack. \u00cen acest grafic, coloana de ap\u0103 rece este desenat\u0103 deasupra coloanei de ap\u0103 cald\u0103. \u00cen\u0103l\u021bimea total\u0103 corespunde consumului total de ap\u0103 rece \u0219i cald\u0103 pe perioada respectiv\u0103. <\/p>\n<p>Toate graficele prezentate sunt dinamice. Pute\u021bi s\u0103 muta\u021bi mouse-ul peste punctul de interes \u0219i s\u0103 vede\u021bi detaliile \u0219i valoarea din acel punct specific. <\/p>\n<p>Din p\u0103cate, nu a fost lipsit de c\u00e2teva probleme. \u00cen graficul cu bare (spre deosebire de graficul cu linii \u00een trepte), mijlocul barei nu se afl\u0103 \u00een mijlocul zilei, ci la 00:00. Adic\u0103, partea st\u00e2ng\u0103 a barei este desenat\u0103 pe locul zilei precedente. A\u0219adar, graficele pentru s\u00e2mb\u0103t\u0103 \u0219i duminic\u0103 sunt desenate pu\u021bin mai \u00een st\u00e2nga zonei alb\u0103strii. Deocamdat\u0103 nu am g\u0103sit o solu\u021bie pentru a dep\u0103\u0219i aceast\u0103 problem\u0103. <\/p>\n<p>O alt\u0103 problem\u0103 este imposibilitatea de a lucra corect cu intervalele lunare. Problema este c\u0103 lungimea orei\/zilei\/s\u0103pt\u0103m\u00e2nii este fix\u0103, \u00een timp ce lungimea lunii este variabil\u0103. InfluxDB poate lucra doar cu intervale uniforme. P\u00e2n\u0103 acum, am reu\u0219it s\u0103 stabilesc un interval fix de 30 de zile. Da, graficul pe parcursul anului se va deplasa pu\u021bin \u0219i barele nu vor corespunde exact lunilor. Dar, av\u00e2nd \u00een vedere c\u0103 aceast\u0103 informa\u021bie \u00eemi este util\u0103 doar ca un indicator, sunt de acord cu asta. <\/p>\n<p>V\u0103d cel pu\u021bin dou\u0103 solu\u021bii:<\/p>\n<ul>\n<li>S\u0103 renun\u021b la graficele lunare \u0219i s\u0103 m\u0103 limitez la cele s\u0103pt\u0103m\u00e2nale. 52 de bare s\u0103pt\u0103m\u00e2nale pe an arat\u0103 destul de bine.<\/li>\n<li>S\u0103 consider consumul lunar ca pe o metod\u0103 nr. 2 \u0219i s\u0103 folosesc Grafana doar pentru grafice atractive. Va fi o solu\u021bie destul de precis\u0103. Chiar se pot suprapune graficele din anul trecut pentru compara\u021bie \u2014 Grafana \u0219tie s\u0103 fac\u0103 \u0219i asta.<\/li>\n<\/ul>\n<h2>Concluzie<\/h2>\n<p>\nNu \u0219tiu de ce, dar \u00eemi plac acest tip de grafice. Ele arat\u0103 c\u0103 via\u021ba este \u00een plin\u0103 desf\u0103\u0219urare \u0219i totul se schimb\u0103. Ieri a fost mult, azi e pu\u021bin, m\u00e2ine va fi altfel. Mai trebuie s\u0103 lucrez cu cei din familie privind consumul. Dar chiar \u0219i cu obiceiurile actuale, o sum\u0103 mare \u0219i confuz\u0103 pe factur\u0103 devine o imagine destul de clar\u0103 a consumului.<\/p>\n<p>\u00cen ciuda unei cariere de aproape 20 de ani ca programator, nu prea am avut de-a face cu baze de date. A\u0219a c\u0103 instalarea unei baze de date externe p\u0103rea ceva complicat \u0219i neclar. Totul s-a schimbat <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">articolul men\u021bionat mai sus<\/a><\/noindex> \u2014 s-a dovedit c\u0103 integrarea unui instrument potrivit se face \u00een c\u00e2teva clicuri, iar cu un instrument specializat, sarcina de a construi grafice devine ceva mai u\u0219oar\u0103.<\/p>\n<p>\u00cen titlu am men\u021bionat consumul de electricitate. Din p\u0103cate, \u00een acest moment nu pot prezenta niciun grafic. Un contor SDM120 s-a stricat, iar cel\u0103lalt are probleme c\u00e2nd este accesat prin Modbus. Totu\u0219i, acest lucru nu influen\u021beaz\u0103 \u00een niciun fel subiectul articolului \u2013 graficele vor fi realizate \u00een acela\u0219i mod ca pentru ap\u0103.<\/p>\n<p>\u00cen acest articol am prezentat metodele pe care le-am testat eu personal. Cu siguran\u021b\u0103 exist\u0103 \u0219i alte modalit\u0103\u021bi de organizare a colect\u0103rii \u0219i vizualiz\u0103rii datelor, despre care nu \u0219tiu. Spune\u021bi-mi despre acestea \u00een comentarii, mi-ar pl\u0103cea foarte mult. A\u0219 fi bucuros s\u0103 primesc critici constructive \u0219i idei noi. Sper ca materialul prezentat s\u0103 fie de ajutor \u0219i pentru al\u021bii.<br \/>\n<br \/>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Casa inteligent\u0103: Cre\u0103m grafice de consum de ap\u0103 \u0219i electricitate \u00een Home Assistant | ProHoster","description":"De fiecare dat\u0103.","canonical_url":"https:\/\/prohoster.info\/ro\/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":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}