ప్రోహోస్టర్ > బ్లాగ్ > పరిపాలన > స్మార్ట్ హోమ్: మేము హోమ్ అసిస్టెంట్లో నీరు మరియు విద్యుత్ వినియోగం యొక్క గ్రాఫ్లను రూపొందిస్తాము
స్మార్ట్ హోమ్: మేము హోమ్ అసిస్టెంట్లో నీరు మరియు విద్యుత్ వినియోగం యొక్క గ్రాఫ్లను రూపొందిస్తాము
నేను కరెంటు మరియు నీటి కోసం చెల్లింపును స్వీకరించిన ప్రతిసారీ, నేను ఆశ్చర్యపోతున్నాను - నా కుటుంబం నిజంగా అంత ఖర్చు చేస్తుందా? బాగా, అవును, బాత్రూంలో వేడిచేసిన నేల మరియు బాయిలర్ ఉంది, కానీ అవి అన్ని సమయాలలో మంటలను కాల్చవు. మేము నీటిని కూడా ఆదా చేస్తున్నట్లు అనిపిస్తుంది (అయితే మేము బాత్రూంలో చుట్టూ స్ప్లాష్ చేయడానికి కూడా ఇష్టపడతాము). చాలా సంవత్సరాల క్రితం నేను ఇప్పటికే కనెక్ట్ చేయబడిన నీటి మీటర్లు и విద్యుత్ స్మార్ట్ హోమ్కి, కానీ అక్కడ విషయాలు చిక్కుకున్నాయి. మేము ఇప్పుడు మాత్రమే వినియోగాన్ని విశ్లేషించడం ప్రారంభించాము, ఈ కథనం వాస్తవానికి దాని గురించి.
నేను ఇటీవల నా స్మార్ట్ హోమ్ సిస్టమ్గా హోమ్ అసిస్టెంట్కి మారాను. వివిధ రకాల గ్రాఫ్లను సౌకర్యవంతంగా నిర్మించగల సామర్థ్యంతో పెద్ద మొత్తంలో డేటా సేకరణను నిర్వహించే అవకాశం ఒక కారణం.
ఈ వ్యాసంలో వివరించిన సమాచారం కొత్తది కాదు; వివిధ సాస్ల క్రింద ఉన్న ఈ విషయాలన్నీ ఇప్పటికే ఇంటర్నెట్లో వివరించబడ్డాయి. కానీ ప్రతి వ్యాసం సాధారణంగా ఒక విధానాన్ని లేదా అంశాన్ని మాత్రమే వివరిస్తుంది. నేను ఈ అన్ని విధానాలను సరిపోల్చాలి మరియు చాలా సరిఅయినదాన్ని నేనే ఎంచుకోవలసి వచ్చింది. కథనం ఇప్పటికీ డేటా సేకరణపై సమగ్ర సమాచారాన్ని అందించలేదు, కానీ నేను దీన్ని ఎలా చేసాను అనే దాని సారాంశం. కాబట్టి నిర్మాణాత్మక విమర్శలు మరియు మెరుగుదల కోసం సూచనలు స్వాగతం.
సమస్య యొక్క ప్రకటన
కాబట్టి, నేటి వ్యాయామం యొక్క లక్ష్యం నీరు మరియు విద్యుత్ వినియోగం యొక్క అందమైన గ్రాఫ్లను పొందడం:
2 రోజులు గంటకు
2 వారాలపాటు రోజువారీ
(ఐచ్ఛికం) వారం మరియు నెలవారీ
దీనితో కొన్ని ఇబ్బందులు ఉన్నాయి:
ప్రామాణిక చార్ట్ భాగాలు సాధారణంగా చాలా పేలవంగా ఉంటాయి. ఉత్తమంగా, మీరు పాయింట్ ద్వారా లైన్ గ్రాఫ్ పాయింట్ను నిర్మించవచ్చు.
మీరు తగినంత గట్టిగా చూస్తే, మీరు ప్రామాణిక చార్ట్ యొక్క సామర్థ్యాలను విస్తరించే మూడవ పక్ష భాగాలను కనుగొనవచ్చు. హోమ్ అసిస్టెంట్ కోసం, సూత్రప్రాయంగా, ఇది మంచి మరియు అందమైన భాగం చిన్న గ్రాఫ్ కార్డ్, కానీ ఇది కొంతవరకు పరిమితం చేయబడింది:
బార్ చార్ట్ యొక్క పారామితులను పెద్ద విరామాలలో సెట్ చేయడం కష్టం (బార్ యొక్క వెడల్పు గంట భిన్నాలలో సెట్ చేయబడింది, అంటే గంట కంటే ఎక్కువ విరామాలు పాక్షిక సంఖ్యలలో సెట్ చేయబడతాయి)
మీరు ఒక గ్రాఫ్కు వేర్వేరు ఎంటిటీలను జోడించలేరు (ఉదాహరణకు, ఉష్ణోగ్రత మరియు తేమ లేదా బార్ గ్రాఫ్ను లైన్తో కలపడం)
హోమ్ అసిస్టెంట్ డిఫాల్ట్గా అత్యంత ప్రాచీనమైన SQLite డేటాబేస్ను ఉపయోగించడమే కాకుండా (మరియు నేను, ఒక పనివాడు, MySQL లేదా Postgresని ఇన్స్టాల్ చేయడాన్ని నిర్వహించలేకపోయాను), కానీ డేటా అత్యంత అనుకూలమైన రీతిలో నిల్వ చేయబడదు. కాబట్టి, ఉదాహరణకు, మీరు పరామితి యొక్క అతి చిన్న డిజిటల్ పారామీటర్ను కూడా మార్చిన ప్రతిసారీ, ఒక కిలోబైట్ పరిమాణంలో ఉన్న భారీ json డేటాబేస్కు వ్రాయబడుతుంది.
నా దగ్గర చాలా సెన్సార్లు ఉన్నాయి (ప్రతి గదిలో ఉష్ణోగ్రత సెన్సార్లు, నీరు మరియు విద్యుత్ మీటర్లు), మరియు కొన్ని చాలా ఎక్కువ డేటాను కూడా ఉత్పత్తి చేస్తాయి. ఉదాహరణకు, SDM220 విద్యుత్ మీటర్ మాత్రమే ప్రతి 10-15 సెకన్లకు డజను విలువలను ఉత్పత్తి చేస్తుంది మరియు నేను అలాంటి 8 మీటర్లను ఇన్స్టాల్ చేయాలనుకుంటున్నాను. ఇతర సెన్సార్ల ఆధారంగా లెక్కించబడే మొత్తం పారామితుల సమూహం కూడా ఉంది. ఆ. ఈ విలువలన్నీ రోజువారీ డేటాబేస్ను 100-200 MB ద్వారా సులభంగా పెంచగలవు. ఒక వారంలో సిస్టమ్ కదలదు మరియు ఒక నెలలో ఫ్లాష్ డ్రైవ్ చనిపోతుంది (రాస్ప్బెర్రీ PIలో సాధారణ హోమ్ అసిస్టెంట్ ఇన్స్టాలేషన్ విషయంలో), మరియు మొత్తం సంవత్సరానికి డేటాను నిల్వ చేయడం ప్రశ్నార్థకం కాదు.
మీరు అదృష్టవంతులైతే, మీ మీటర్ వినియోగాన్ని లెక్కించవచ్చు. మీరు ఎప్పుడైనా మీటర్ని ఆశ్రయించవచ్చు మరియు సేకరించిన వినియోగ విలువ ఏ సమయంలో ఉందో అడగవచ్చు. నియమం ప్రకారం, డిజిటల్ ఇంటర్ఫేస్ (RS232/RS485/Modbus/Zigbee) ఉన్న అన్ని విద్యుత్ మీటర్లు ఈ అవకాశాన్ని అందిస్తాయి.
పరికరం కొన్ని తక్షణ పారామీటర్ను (ఉదాహరణకు, తక్షణ శక్తి లేదా కరెంట్) కొలవగలిగితే లేదా ప్రతి X వాట్-గంటలు లేదా లీటర్లకు పప్పులను ఉత్పత్తి చేయగలిగితే అది చాలా ఘోరంగా ఉంటుంది. అప్పుడు మీరు దానిని ఎలా మరియు దేనితో ఏకీకృతం చేయాలి మరియు ఎక్కడ విలువను కూడగట్టుకోవాలి అనే దాని గురించి ఆలోచించాలి. ఏ కారణం చేతనైనా తదుపరి నివేదికను కోల్పోయే ప్రమాదం ఉంది మరియు మొత్తం సిస్టమ్ యొక్క ఖచ్చితత్వం ప్రశ్నలను లేవనెత్తుతుంది. మీరు హోమ్ అసిస్టెంట్ వంటి స్మార్ట్ హోమ్ సిస్టమ్కు వీటన్నింటిని అప్పగించవచ్చు, కానీ డేటాబేస్లోని రికార్డుల సంఖ్యను ఎవరూ రద్దు చేయలేదు మరియు సెకనుకు ఒకసారి సెన్సార్లను పోల్ చేయడం సాధ్యం కాదు (a హోమ్ అసిస్టెంట్ ఆర్కిటెక్చర్ యొక్క పరిమితి).
విధానం 1
ముందుగా, హోమ్ అసిస్టెంట్ బాక్స్ నుండి ఏమి అందిస్తారో చూద్దాం. ఒక వ్యవధిలో వినియోగాన్ని కొలవడం అనేది అత్యంత కోరుకునే కార్యాచరణ. వాస్తవానికి, ఇది చాలా కాలం క్రితం ప్రత్యేక భాగం రూపంలో అమలు చేయబడింది - utility_meter.
కాంపోనెంట్ యొక్క సారాంశం ఏమిటంటే, ఇది అంతర్గతంగా ఒక వేరియబుల్ ప్రస్తుత_సంచిత_విలువను సృష్టిస్తుంది మరియు పేర్కొన్న వ్యవధి (గంట/వారం/నెల) తర్వాత దాన్ని రీసెట్ చేస్తుంది. భాగం స్వయంగా ఇన్పుట్ వేరియబుల్ను పర్యవేక్షిస్తుంది (కొన్ని సెన్సార్ యొక్క విలువ), విలువలో మార్పులకు సభ్యత్వాన్ని పొందుతుంది - మీరు పూర్తి ఫలితాన్ని పొందుతారు. ఈ విషయం కాన్ఫిగరేషన్ ఫైల్లోని కొన్ని పంక్తులలో వివరించబడింది
ఇక్కడ sensor.water_meter_cold అనేది నేను స్వీకరించే లీటర్లలో ప్రస్తుత మీటర్ విలువ నేరుగా ఇనుప ముక్క నుండి mqtt ద్వారా డిజైన్ 2 కొత్త సెన్సార్లు water_cold_hour_um మరియు water_cold_day_umని సృష్టిస్తుంది, ఇవి గంటకు మరియు రోజువారీ రీడింగ్లను సేకరించి, వ్యవధి ముగిసిన తర్వాత వాటిని సున్నాకి రీసెట్ చేస్తుంది. ఇక్కడ గంటకు సగం బ్యాటరీ యొక్క గ్రాఫ్ ఉంది.
Lovelace-UI కోసం గంట మరియు రోజువారీ చార్ట్ల కోడ్ ఇలా కనిపిస్తుంది:
- type: history-graph
title: 'Hourly water consumption using vars'
hours_to_show: 48
entities:
- sensor.water_hour
- type: history-graph
title: 'Daily water consumption using vars'
hours_to_show: 360
entities:
- sensor.water_day
వాస్తవానికి, ఈ విధానంతో సమస్య ఈ అల్గారిథమ్లో ఉంది. నేను ఇప్పటికే పేర్కొన్నట్లుగా, ప్రతి ఇన్పుట్ విలువకు (ప్రతి తదుపరి లీటర్కు ప్రస్తుత మీటర్ రీడింగ్) 1kb రికార్డులు డేటాబేస్లో రూపొందించబడ్డాయి. ప్రతి యుటిలిటీ మీటర్ కూడా కొత్త విలువను ఉత్పత్తి చేస్తుంది, ఇది బేస్కు కూడా జోడించబడుతుంది. నేను గంట/రోజువారీ/వారం/నెలవారీ రీడింగ్లను మరియు అనేక వాటర్ రైజర్లను సేకరించాలనుకుంటే మరియు ఎలక్ట్రిక్ మీటర్ల ప్యాక్ను జోడించాలనుకుంటే, అది చాలా డేటా అవుతుంది. బాగా, మరింత ఖచ్చితంగా, చాలా డేటా లేదు, కానీ హోమ్ అసిస్టెంట్ డేటాబేస్కు అనవసరమైన సమాచారాన్ని వ్రాస్తుంది కాబట్టి, డేటాబేస్ పరిమాణం చాలా వేగంగా పెరుగుతుంది. వారంవారీ మరియు నెలవారీ చార్ట్ల కోసం బేస్ పరిమాణాన్ని అంచనా వేయడానికి కూడా నేను భయపడుతున్నాను.
అదనంగా, యుటిలిటీ మీటర్ స్వయంగా సమస్యను పరిష్కరించదు. యుటిలిటీ మీటర్ ద్వారా ఉత్పత్తి చేయబడిన విలువల గ్రాఫ్ ప్రతి గంటకు 0కి రీసెట్ చేసే మార్పు లేకుండా పెరుగుతున్న ఫంక్షన్. ఆ కాలంలో ఎన్ని లీటర్లు వినియోగించబడ్డాయో చూపుతూ వినియోగదారుకు అర్థమయ్యేలా మనకు వినియోగ చార్ట్ అవసరం. స్టాండర్డ్ హిస్టరీ-గ్రాఫ్ కాంపోనెంట్ దీన్ని చేయలేము, కానీ మినీ-గ్రాఫ్ కార్డ్ ఎక్స్టర్నల్ కాంపోనెంట్ మాకు సహాయపడుతుంది.
ఇది lovelace-UI కోసం కార్డ్ కోడ్:
- aggregate_func: max
entities:
- color: var(--primary-color)
entity: sensor.water_cold_hour_um
group_by: hour
hours_to_show: 48
name: "Hourly water consumption aggregated by utility meter"
points_per_hour: 1
show:
graph: bar
type: 'custom:mini-graph-card'
సెన్సార్ పేరు, గ్రాఫ్ రకం, రంగు (నేను ప్రామాణిక నారింజ రంగును ఇష్టపడలేదు) వంటి ప్రామాణిక సెట్టింగ్లతో పాటు, 3 సెట్టింగ్లను గమనించడం ముఖ్యం:
group_by:hour — గంట ప్రారంభానికి సమలేఖనం చేయబడిన బార్లతో గ్రాఫ్ రూపొందించబడుతుంది
పాయింట్_ప్రతి_గంటకు: 1 - ప్రతి గంటకు ఒక బార్
మరియు ముఖ్యంగా, aggregate_func: max - ప్రతి గంటలోపు గరిష్ట విలువను తీసుకోండి. ఇది సాటూత్ గ్రాఫ్ను బార్లుగా మార్చే ఈ పరామితి
ఎడమ వైపున ఉన్న నిలువు వరుసలకు శ్రద్ధ చూపవద్దు - డేటా లేనట్లయితే ఇది భాగం యొక్క ప్రామాణిక ప్రవర్తన. కానీ డేటా లేదు - నేను ఈ కథనం కోసం కొన్ని గంటల క్రితం యుటిలిటీ మీటర్ డేటా సేకరణను ఆన్ చేసాను (నేను నా ప్రస్తుత విధానాన్ని క్రింద వివరిస్తాను).
ఈ చిత్రంలో నేను కొన్నిసార్లు డేటా డిస్ప్లే కూడా పనిచేస్తుందని మరియు బార్లు సరైన విలువలను ప్రతిబింబిస్తాయని చూపించాలనుకుంటున్నాను. అయితే అంతే కాదు. కొన్ని కారణాల వల్ల, ఉదయం 11 నుండి 12 గంటల వరకు ఎంచుకున్న కాలమ్ 19 లీటర్లను ప్రదర్శిస్తుంది, అయితే అదే సెన్సార్ నుండి అదే కాలానికి టూతీ గ్రాఫ్లో కొంచెం ఎక్కువ 62 లీటర్ల వినియోగాన్ని చూస్తాము. దోషం ఉంది లేదా చేతులు వంకరగా ఉంటాయి. కుడి వైపున ఉన్న డేటా ఎందుకు విచ్ఛిన్నమైందో నాకు ఇంకా అర్థం కాలేదు - అక్కడ వినియోగం సాధారణమైనది, ఇది పంటి గ్రాఫ్ నుండి కూడా కనిపిస్తుంది.
సాధారణంగా, నేను ఈ విధానం యొక్క ఆమోదయోగ్యతను సాధించలేకపోయాను - గ్రాఫ్ దాదాపు ఎల్లప్పుడూ ఒక రకమైన మతవిశ్వాశాలను చూపుతుంది.
పగటిపూట సెన్సార్ కోసం ఇలాంటి కోడ్.
- aggregate_func: max
entities:
- color: var(--primary-color)
entity: sensor.water_cold_day_um
group_by: interval
hours_to_show: 360
name: "Daily water consumption aggregated by utility meter"
points_per_hour: 0.0416666666
show:
graph: bar
type: 'custom:mini-graph-card'
దయచేసి group_by పరామితి విరామానికి సెట్ చేయబడిందని మరియు పాయింట్లు_per_hour పరామితి ప్రతిదానిని నియమిస్తుంది. మరియు దానిలో ఈ భాగంతో మరొక సమస్య ఉంది - point_per_hour ఒక గంట లేదా అంతకంటే తక్కువ చార్ట్లలో బాగా పని చేస్తుంది, కానీ ఇది పెద్ద వ్యవధిలో సక్స్ చేస్తుంది. కాబట్టి ఒక రోజులో ఒక నిలువు వరుసను పొందడానికి, నేను 1/24=0.04166666 విలువను నమోదు చేయాల్సి వచ్చింది. నేను వీక్లీ మరియు నెలవారీ చార్ట్ల గురించి కూడా మాట్లాడటం లేదు.
విధానం 2
హోమ్ అసిస్టెంట్ని అర్థం చేసుకున్నప్పుడు, నేను ఈ వీడియోను చూశాను:
ఒక స్నేహితుడు అనేక రకాల Xiaomi సాకెట్ల నుండి వినియోగ డేటాను సేకరిస్తాడు. అతని పని కొంచెం సరళమైనది - ఈ రోజు, నిన్న మరియు నెల కోసం వినియోగ విలువను ప్రదర్శించండి. షెడ్యూల్లు అవసరం లేదు.
తక్షణ శక్తి విలువల మాన్యువల్ ఇంటిగ్రేషన్ గురించి చర్చలను పక్కన పెడదాం - ఈ విధానం యొక్క “ఖచ్చితత్వం” గురించి నేను ఇప్పటికే పైన వ్రాసాను. అతను ఇప్పటికే అదే అవుట్లెట్ ద్వారా సేకరించిన వినియోగ విలువలను ఎందుకు ఉపయోగించలేదో స్పష్టంగా తెలియదు. నా అభిప్రాయం ప్రకారం, హార్డ్వేర్ లోపల ఇంటిగ్రేషన్ మెరుగ్గా పని చేస్తుంది.
వీడియో నుండి మేము ఒక వ్యవధిలో వినియోగాన్ని మానవీయంగా లెక్కించే ఆలోచనను తీసుకుంటాము. వ్యక్తి ఈ రోజు మరియు నిన్నటి విలువలను మాత్రమే లెక్కిస్తాడు, కానీ మేము మరింత ముందుకు వెళ్లి గ్రాఫ్ను గీయడానికి ప్రయత్నిస్తాము. నా విషయంలో ప్రతిపాదిత పద్ధతి యొక్క సారాంశం క్రింది విధంగా ఉంది.
వేరియబుల్ విలువ_at_the_beginning_of_hourని సృష్టిద్దాం, దీనిలో మేము ప్రస్తుత మీటర్ రీడింగ్లను రికార్డ్ చేస్తాము
టైమర్ని ఉపయోగించి, గంట చివరిలో (లేదా తదుపరి ప్రారంభంలో) మేము ప్రస్తుత పఠనానికి మరియు గంట ప్రారంభంలో నిల్వ చేసిన వాటికి మధ్య వ్యత్యాసాన్ని గణిస్తాము. ఈ వ్యత్యాసం ప్రస్తుత గంటకు వినియోగం అవుతుంది - మేము విలువను సెన్సార్లో సేవ్ చేస్తాము మరియు భవిష్యత్తులో ఈ విలువ ఆధారంగా గ్రాఫ్ను నిర్మిస్తాము.
మీరు అక్కడ ప్రస్తుత కౌంటర్ విలువను వ్రాయడం ద్వారా value_at_beginning_of_hour వేరియబుల్ను "రీసెట్" చేయాలి.
హోమ్ అసిస్టెంట్ ద్వారానే ఇదంతా చేయవచ్చు.
మీరు మునుపటి విధానం కంటే కొంచెం ఎక్కువ కోడ్ వ్రాయవలసి ఉంటుంది. మొదట, ఇదే "వేరియబుల్స్" క్రియేట్ చేద్దాం. పెట్టె వెలుపల మన వద్ద “వేరియబుల్” ఎంటిటీ లేదు, కానీ మేము mqtt బ్రోకర్ సేవలను ఉపయోగించవచ్చు. మేము రిటైన్=ట్రూ ఫ్లాగ్తో అక్కడ విలువలను పంపుతాము - ఇది బ్రోకర్లోని విలువను సేవ్ చేస్తుంది మరియు హోమ్ అసిస్టెంట్ రీబూట్ చేయబడినప్పుడు కూడా అది ఎప్పుడైనా అక్కడ నుండి తీసివేయబడుతుంది. నేను ఒకేసారి గంట మరియు రోజువారీ కౌంటర్లు చేసాను.
- platform: mqtt
state_topic: "test/water/hour"
name: water_hour
unit_of_measurement: l
- platform: mqtt
state_topic: "test/water/hour_begin"
name: water_hour_begin
unit_of_measurement: l
- platform: mqtt
state_topic: "test/water/day"
name: water_day
unit_of_measurement: l
- platform: mqtt
state_topic: "test/water/day_begin"
name: water_day_begin
unit_of_measurement: l
అన్ని మాయాజాలం ఆటోమేషన్లో జరుగుతుంది, ఇది వరుసగా ప్రతి గంట మరియు ప్రతి రాత్రి నడుస్తుంది.
ప్రారంభ మరియు ముగింపు విలువల మధ్య వ్యత్యాసంగా విరామం కోసం విలువను లెక్కించండి
తదుపరి విరామం కోసం మూల విలువను నవీకరించండి
ఈ సందర్భంలో గ్రాఫ్ల నిర్మాణం సాధారణ చరిత్ర-గ్రాఫ్ ద్వారా పరిష్కరించబడుతుంది:
- type: history-graph
title: 'Hourly water consumption using vars'
hours_to_show: 48
entities:
- sensor.water_hour
- type: history-graph
title: 'Daily water consumption using vars'
hours_to_show: 360
entities:
- sensor.water_day
ఇది ఇలా కనిపిస్తుంది:
సూత్రప్రాయంగా, ఇది ఇప్పటికే అవసరం. ఈ పద్ధతి యొక్క ప్రయోజనం ఏమిటంటే డేటా విరామానికి ఒకసారి ఉత్పత్తి చేయబడుతుంది. ఆ. ఒక గంట చార్ట్ కోసం రోజుకు 24 రికార్డులు మాత్రమే.
దురదృష్టవశాత్తు, ఇది ఇప్పటికీ పెరుగుతున్న బేస్ యొక్క సాధారణ సమస్యను పరిష్కరించదు. నాకు నెలవారీ వినియోగ గ్రాఫ్ కావాలంటే, నేను కనీసం ఒక సంవత్సరం పాటు డేటాను నిల్వ చేయవలసి ఉంటుంది. మరియు హోమ్ అసిస్టెంట్ మొత్తం డేటాబేస్ కోసం ఒక నిల్వ వ్యవధి సెట్టింగ్ను మాత్రమే అందిస్తుంది కాబట్టి, సిస్టమ్లోని మొత్తం డేటా మొత్తం సంవత్సరం పాటు నిల్వ చేయబడుతుందని దీని అర్థం. ఉదాహరణకు, ఒక సంవత్సరంలో నేను 200 క్యూబిక్ మీటర్ల నీటిని వినియోగిస్తాను, అంటే డేటాబేస్లో 200000 ఎంట్రీలు అని అర్థం. మరియు మీరు ఇతర సెన్సార్లను పరిగణనలోకి తీసుకుంటే, ఫిగర్ సాధారణంగా అసభ్యకరంగా మారుతుంది.
విధానం 3
అదృష్టవశాత్తూ, స్మార్ట్ వ్యక్తులు ఇప్పటికే InfluxDB డేటాబేస్ రాయడం ద్వారా ఈ సమస్యను పరిష్కరించారు. ఈ డేటాబేస్ సమయ-ఆధారిత డేటాను నిల్వ చేయడానికి ప్రత్యేకంగా ఆప్టిమైజ్ చేయబడింది మరియు వివిధ సెన్సార్ల విలువలను నిల్వ చేయడానికి అనువైనది. సిస్టమ్ SQL లాంటి ప్రశ్న భాషను కూడా అందిస్తుంది, ఇది డేటాబేస్ నుండి విలువలను సంగ్రహించడానికి మరియు వాటిని వివిధ మార్గాల్లో సమగ్రపరచడానికి మిమ్మల్ని అనుమతిస్తుంది. చివరగా, వేర్వేరు డేటాను వేర్వేరు సమయాల్లో నిల్వ చేయవచ్చు. ఉదాహరణకు, ఉష్ణోగ్రత లేదా తేమ వంటి తరచుగా మారుతున్న రీడింగ్లను కేవలం రెండు వారాల పాటు నిల్వ చేయవచ్చు, అయితే రోజువారీ నీటి వినియోగ రీడింగ్లు మొత్తం సంవత్సరం పాటు నిల్వ చేయబడతాయి.
ఇన్ఫ్లక్స్డిబితో పాటు, స్మార్ట్ వ్యక్తులు ఇన్ఫ్లక్స్డిబి నుండి డేటా ఆధారంగా గ్రాఫ్లను గీయడానికి గ్రాఫానా వ్యవస్థను కూడా కనుగొన్నారు. గ్రాఫానా వివిధ రకాల గ్రాఫ్లను గీయవచ్చు, వాటిని వివరంగా అనుకూలీకరించవచ్చు మరియు ముఖ్యంగా, ఈ గ్రాఫ్లను లవ్లేస్-UI హోమ్ అసిస్టెంట్లో “ప్లగ్” చేయవచ్చు.
ప్రేరణ పొందండి ఇక్కడ и ఇక్కడ. ఇన్ఫ్లక్స్డిబి మరియు గ్రాఫానాను హోమ్ అసిస్టెంట్కు ఇన్స్టాల్ చేయడం మరియు కనెక్ట్ చేసే ప్రక్రియ గురించి కథనాలు వివరంగా వివరిస్తాయి. నేను నా నిర్దిష్ట సమస్యను పరిష్కరించడంపై దృష్టి పెడతాను.
కాబట్టి, ముందుగా, influxDBలో కౌంటర్ విలువను జోడించడం ప్రారంభిద్దాం. హోమ్ అసిస్టెంట్ కాన్ఫిగరేషన్ యొక్క భాగం (ఈ ఉదాహరణలో నేను చల్లగా మాత్రమే కాకుండా వేడి నీటితో కూడా ఆనందిస్తాను):
ఇప్పుడు InfluxDB కన్సోల్కి వెళ్లి మన డేటాబేస్ని కాన్ఫిగర్ చేద్దాం. ప్రత్యేకించి, నిర్దిష్ట డేటా ఎంతకాలం నిల్వ చేయబడుతుందో మీరు కాన్ఫిగర్ చేయాలి. ఇది అని పిలవబడే వారిచే నియంత్రించబడుతుంది. నిలుపుదల విధానం - ఇది ప్రధాన డేటాబేస్లోని డేటాబేస్ల మాదిరిగానే ఉంటుంది, ప్రతి అంతర్గత డేటాబేస్ దాని స్వంత సెట్టింగ్లను కలిగి ఉంటుంది. డిఫాల్ట్గా, మొత్తం డేటా ఆటోజెన్ అని పిలువబడే నిలుపుదల విధానంలో నిల్వ చేయబడుతుంది; ఈ డేటా ఒక వారం పాటు నిల్వ చేయబడుతుంది. గంటవారీ డేటాను ఒక నెల పాటు ఉంచాలని, వారంవారీ డేటాను ఒక సంవత్సరం పాటు ఉంచాలని మరియు నెలవారీ డేటాను ఎప్పటికీ తొలగించకూడదని నేను కోరుకుంటున్నాను. తగిన నిలుపుదల విధానాన్ని రూపొందిద్దాం
CREATE RETENTION POLICY "month" ON "homeassistant" DURATION 30d REPLICATION 1
CREATE RETENTION POLICY "year" ON "homeassistant" DURATION 52w REPLICATION 1
CREATE RETENTION POLICY "infinite" ON "homeassistant" DURATION INF REPLICATION 1
ఇప్పుడు, వాస్తవానికి, నిరంతర ప్రశ్నను ఉపయోగించి డేటా అగ్రిగేషన్ ప్రధాన ట్రిక్. ఇది నిర్దిష్ట వ్యవధిలో స్వయంచాలకంగా క్వెరీని రన్ చేసే మెకానిజం, ఈ క్వెరీ కోసం డేటాను సమగ్రం చేస్తుంది మరియు ఫలితాన్ని కొత్త విలువలోకి జోడిస్తుంది. ఒక ఉదాహరణను చూద్దాం (నేను చదవడానికి ఒక కాలమ్లో వ్రాస్తాను, కానీ వాస్తవానికి నేను ఈ ఆదేశాన్ని ఒక లైన్లో నమోదు చేయాల్సి వచ్చింది)
CREATE CONTINUOUS QUERY cq_water_hourly ON homeassistant
BEGIN
SELECT max(value) AS value
INTO homeassistant.month.water_meter_hour
FROM homeassistant.autogen.l
GROUP BY time(1h), entity_id fill(previous)
END
ఈ ఆదేశం:
హోమ్అసిస్టెంట్ డేటాబేస్లో cq_water_cold_hourly పేరుతో నిరంతర ప్రశ్నను సృష్టిస్తుంది
అభ్యర్థన ప్రతి గంటకు అమలు చేయబడుతుంది (సమయం(1గం))
అభ్యర్థన శీతల మరియు వేడి నీటి రీడింగ్లతో సహా కొలత' homeassistant.autogen.l (లీటర్లు) నుండి మొత్తం డేటాను స్క్రాప్ చేస్తుంది
సమగ్ర డేటా entity_id ద్వారా సమూహం చేయబడుతుంది, ఇది చల్లని మరియు వేడి నీటి కోసం మాకు ప్రత్యేక విలువలను ఇస్తుంది
లీటరు కౌంటర్ ప్రతి గంటలో మార్పు లేకుండా పెరుగుతున్న క్రమం కాబట్టి, గరిష్ట విలువను తీసుకోవడం అవసరం, కాబట్టి గరిష్ట (విలువ) ఫంక్షన్ ద్వారా అగ్రిగేషన్ నిర్వహించబడుతుంది.
కొత్త విలువ homeassistant.month.water_meter_hourకి వ్రాయబడుతుంది, ఇక్కడ నెల అనేది ఒక నెల నిలుపుదల వ్యవధితో నిలుపుదల పాలసీ పేరు. అంతేకాకుండా, చల్లని మరియు వేడి నీటికి సంబంధించిన డేటా సంబంధిత entity_id మరియు విలువ ఫీల్డ్లోని విలువతో ప్రత్యేక రికార్డులుగా చెల్లాచెదురు చేయబడుతుంది.
రాత్రి సమయంలో లేదా ఇంట్లో ఎవరూ లేని సమయంలో, నీటి వినియోగం ఉండదు, అందువలన homeassistant.autogen.lలో కొత్త ఎంట్రీలు లేవు. సాధారణ ప్రశ్నలలో విలువలను కోల్పోకుండా నివారించడానికి, మీరు పూరించడాన్ని ఉపయోగించవచ్చు (మునుపటిది). ఇది InfluxDBని చివరి గంట విలువను ఉపయోగించమని బలవంతం చేస్తుంది.
దురదృష్టవశాత్తూ, నిరంతర ప్రశ్నకు ఒక ప్రత్యేకత ఉంది: పూరించే (మునుపటి) ట్రిక్ పనిచేయదు మరియు రికార్డులు సృష్టించబడవు. అంతేకాక, ఇది ఒక రకమైన అధిగమించలేని సమస్య చాలా సంవత్సరాలుగా చర్చిస్తున్నారు. మేము ఈ సమస్యను తర్వాత పరిష్కరిస్తాము, కాని పూరించండి(మునుపటిది) నిరంతర ప్రశ్నలో ఉండనివ్వండి - ఇది జోక్యం చేసుకోదు.
ఏమి జరిగిందో తనిఖీ చేద్దాం (వాస్తవానికి, మీరు కొన్ని గంటలు వేచి ఉండాలి):
> select * from homeassistant.month.water_meter_hour group by entity_id
...
name: water_meter_hour
tags: entity_id=water_meter_cold
time value
---- -----
...
2020-03-08T01:00:00Z 370511
2020-03-08T02:00:00Z 370513
2020-03-08T05:00:00Z 370527
2020-03-08T06:00:00Z 370605
2020-03-08T07:00:00Z 370635
2020-03-08T08:00:00Z 370699
2020-03-08T09:00:00Z 370761
2020-03-08T10:00:00Z 370767
2020-03-08T11:00:00Z 370810
2020-03-08T12:00:00Z 370818
2020-03-08T13:00:00Z 370827
2020-03-08T14:00:00Z 370849
2020-03-08T15:00:00Z 370921
డేటాబేస్లోని విలువలు UTCలో నిల్వ చేయబడతాయని గమనించండి, కాబట్టి ఈ జాబితా 3 గంటల తేడాతో ఉంటుంది - InfluxDB అవుట్పుట్లోని 7am విలువలు ఎగువ గ్రాఫ్లలోని 10am విలువలకు అనుగుణంగా ఉంటాయి. ఉదయం 2 మరియు 5 గంటల మధ్య ఎటువంటి రికార్డులు లేవని కూడా గమనించండి - ఇది నిరంతర ప్రశ్న యొక్క అదే లక్షణం.
మీరు చూడగలిగినట్లుగా, సమగ్ర విలువ కూడా మార్పు లేకుండా పెరుగుతున్న క్రమం, ఎంట్రీలు మాత్రమే తక్కువ తరచుగా జరుగుతాయి - గంటకు ఒకసారి. కానీ ఇది సమస్య కాదు - మేము గ్రాఫ్ కోసం సరైన డేటాను తిరిగి పొందే మరొక ప్రశ్నను వ్రాయవచ్చు.
SELECT difference(max(value))
FROM homeassistant.month.water_meter_hour
WHERE entity_id='water_meter_cold' and time >= now() -24h
GROUP BY time(1h), entity_id
fill(previous)
నేను అర్థాన్ని విడదీస్తాను:
homeassistant.month.water_meter_hour డేటాబేస్ నుండి మేము entity_id='water_meter_cold' కోసం చివరి రోజు (సమయం >= ఇప్పుడు() -24గం) డేటాను సంగ్రహిస్తాము.
నేను ఇప్పటికే పేర్కొన్నట్లుగా, homeassistant.month.water_meter_hour సీక్వెన్స్లో కొన్ని ఎంట్రీలు మిస్ అయి ఉండవచ్చు. మేము సమయం (1గం) ద్వారా GROUPతో ప్రశ్నను అమలు చేయడం ద్వారా ఈ డేటాను పునరుత్పత్తి చేస్తాము. ఈసారి పూరించండి (మునుపటిది) ఊహించిన విధంగా పని చేస్తుంది, తప్పిపోయిన డేటాను ఉత్పత్తి చేస్తుంది (ఫంక్షన్ మునుపటి విలువను తీసుకుంటుంది)
ఈ అభ్యర్థనలో అత్యంత ముఖ్యమైన విషయం ఏమిటంటే భేదం ఫంక్షన్, ఇది గంట మార్కుల మధ్య వ్యత్యాసాన్ని గణిస్తుంది. ఇది స్వంతంగా పని చేయదు మరియు అగ్రిగేషన్ ఫంక్షన్ అవసరం. ఇది ఇంతకు ముందు ఉపయోగించిన గరిష్ట()గా ఉండనివ్వండి.
ఉదయం 2 నుండి 5 గంటల వరకు (UTC) వినియోగం లేదు. అయినప్పటికీ, ప్రశ్న పూరించడానికి (మునుపటి) అదే వినియోగ విలువను అందిస్తుంది మరియు తేడా ఫంక్షన్ దాని నుండి ఈ విలువను తీసివేస్తుంది మరియు అవుట్పుట్ 0 అవుతుంది, ఇది ఖచ్చితంగా అవసరం.
గ్రాఫ్ను నిర్మించడమే మిగిలి ఉంది. దీన్ని చేయడానికి, గ్రాఫానాను తెరిచి, ఇప్పటికే ఉన్న (లేదా క్రొత్తదాన్ని సృష్టించండి) డాష్బోర్డ్ను తెరిచి, కొత్త ప్యానెల్ను సృష్టించండి. చార్ట్ సెట్టింగ్లు ఇలా ఉంటాయి.
నేను అదే గ్రాఫ్లో చల్లని మరియు వేడి నీటి డేటాను ప్రదర్శిస్తాను. అభ్యర్థన నేను పైన వివరించిన విధంగానే ఉంది.
ప్రదర్శన పారామితులు క్రింది విధంగా సెట్ చేయబడ్డాయి. నాకు ఇది పంక్తులతో గ్రాఫ్ అవుతుంది, ఇది దశల్లో (మెట్లు) వెళుతుంది. నేను దిగువ స్టాక్ పరామితిని వివరిస్తాను. దిగువన మరికొన్ని ప్రదర్శన ఎంపికలు ఉన్నాయి, కానీ అవి అంత ఆసక్తికరంగా లేవు.
ఫలిత చార్ట్ని హోమ్ అసిస్టెంట్కి జోడించడానికి మీరు వీటిని చేయాలి:
చార్ట్ సవరణ మోడ్ నుండి నిష్క్రమించండి. కొన్ని కారణాల వల్ల, సరైన చార్ట్ షేరింగ్ సెట్టింగ్లు డాష్బోర్డ్ పేజీ నుండి మాత్రమే అందించబడతాయి
చార్ట్ పేరు పక్కన ఉన్న త్రిభుజంపై క్లిక్ చేసి, మెను నుండి భాగస్వామ్యం ఎంచుకోండి
తెరుచుకునే విండోలో, ఎంబెడ్ ట్యాబ్కు వెళ్లండి
ప్రస్తుత సమయ పరిధిని ఎంపిక చేయవద్దు - మేము URL ద్వారా సమయ పరిధిని సెట్ చేస్తాము
అవసరమైన అంశాన్ని ఎంచుకోండి. నా విషయంలో అది తేలికైనది
దయచేసి సమయ పరిధి (గత 2 రోజులు) ఇక్కడ సెట్ చేయబడిందని మరియు డాష్బోర్డ్ సెట్టింగ్లలో కాదని గుర్తుంచుకోండి.
గ్రాఫ్ ఇలా కనిపిస్తుంది. నేను గత 2 రోజులుగా వేడి నీటిని ఉపయోగించలేదు, కాబట్టి చల్లని నీటి గ్రాఫ్ మాత్రమే డ్రా చేయబడింది.
నాకు ఏ గ్రాఫ్ బాగా నచ్చిందో, లైన్-స్టెప్ లేదా రియల్ బార్లను నేను ఇంకా నిర్ణయించుకోలేదు. అందువల్ల, నేను రోజువారీ వినియోగ చార్ట్ యొక్క ఉదాహరణను ఇస్తాను, ఈసారి బార్లలో మాత్రమే. ప్రశ్నలు పైన వివరించిన విధంగానే నిర్మించబడ్డాయి. ప్రదర్శన ఎంపికలు:
ఈ గ్రాఫ్ ఇలా కనిపిస్తుంది:
కాబట్టి స్టాక్ పరామితి గురించి. ఈ గ్రాఫ్లో, వేడి నీటి కాలమ్ పైన చల్లటి నీటి కాలమ్ డ్రా చేయబడింది. మొత్తం ఎత్తు కాలానికి చల్లని మరియు వేడి నీటి మొత్తం వినియోగానికి అనుగుణంగా ఉంటుంది.
చూపిన అన్ని గ్రాఫ్లు డైనమిక్గా ఉన్నాయి. మీరు ఆసక్తి ఉన్న పాయింట్పై మీ మౌస్ని ఉంచవచ్చు మరియు నిర్దిష్ట పాయింట్ వద్ద వివరాలు మరియు విలువను చూడవచ్చు.
దురదృష్టవశాత్తు, లేపనంలో రెండు ఫ్లై ఉన్నాయి. బార్ చార్ట్లో (స్టెప్ లైన్లతో కూడిన చార్ట్ కాకుండా), బార్ మధ్యలో రోజు మధ్యలో కాదు, 00:00కి. ఆ. కాలమ్ యొక్క ఎడమ సగం మునుపటి రోజు స్థానంలో డ్రా చేయబడింది. కాబట్టి శని మరియు ఆదివారాలకు సంబంధించిన గ్రాఫ్లు నీలిరంగు జోన్కు కొద్దిగా ఎడమవైపుకి డ్రా చేయబడతాయి. దానిని ఎలా ఓడించాలో నేను కనుగొన్నంత వరకు.
నెలవారీ వ్యవధిలో సరిగ్గా పని చేయలేకపోవడం మరో సమస్య. వాస్తవం ఏమిటంటే గంట/రోజు/వారం యొక్క నిడివి నిర్ణయించబడింది, కానీ నెల పొడవు ప్రతిసారీ భిన్నంగా ఉంటుంది. InfluxDB సమాన వ్యవధిలో మాత్రమే పని చేస్తుంది. ఇప్పటివరకు నా మెదడు 30 రోజుల నిర్ణీత విరామాన్ని సెట్ చేయడానికి సరిపోతుంది. అవును, గ్రాఫ్ ఏడాది పొడవునా కొద్దిగా తేలుతుంది మరియు బార్లు సరిగ్గా నెలలకు అనుగుణంగా ఉండవు. కానీ డిస్ప్లే మీటర్గా ఈ విషయంపై నాకు ఆసక్తి ఉన్నందున, నేను దానితో సరే.
నేను కనీసం రెండు పరిష్కారాలను చూస్తున్నాను:
నెలవారీ చార్ట్లను వదిలివేయండి మరియు వారంవారీ చార్ట్లకు మిమ్మల్ని మీరు పరిమితం చేసుకోండి. సంవత్సరానికి 52 వీక్లీ బార్లు చాలా బాగున్నాయి
నెలవారీ వినియోగాన్ని పద్ధతి సంఖ్య 2గా పరిగణించండి మరియు గ్రాఫానాను అందమైన గ్రాఫ్ల కోసం మాత్రమే ఉపయోగించండి. ఇది చాలా ఖచ్చితమైన పరిష్కారం అవుతుంది. పోలిక కోసం మీరు గత సంవత్సరం గ్రాఫ్లను కూడా అతివ్యాప్తి చేయవచ్చు - గ్రాఫానా కూడా అలా చేయగలదు.
తీర్మానం
ఎందుకో నాకు తెలియదు, కానీ నేను ఈ రకమైన గ్రాఫ్లతో నిమగ్నమై ఉన్నాను. జీవితం పూర్తి స్వింగ్లో ఉందని మరియు ప్రతిదీ మారుతున్నదని వారు చూపుతారు. నిన్న చాలా ఉంది, ఈ రోజు కొంచెం ఉంది, రేపు ఇంకేదో అవుతుంది. వినియోగం అంశంపై ఇంటి సభ్యులతో కలిసి పనిచేయడమే మిగిలి ఉంది. కానీ ప్రస్తుత ఆకలితో కూడా, చెల్లింపు స్లిప్లోని పెద్ద మరియు అపారమయిన వ్యక్తి ఇప్పటికే వినియోగం యొక్క చాలా అర్థమయ్యే చిత్రంగా మారుతోంది.
ప్రోగ్రామర్గా నా దాదాపు 20 ఏళ్ల కెరీర్ ఉన్నప్పటికీ, డేటాబేస్లతో నాకు వాస్తవంగా ఎలాంటి సంబంధం లేదు. అందువల్ల, బాహ్య డేటాబేస్ను ఇన్స్టాల్ చేయడం చాలా నిగూఢమైనది మరియు అపారమయినదిగా అనిపించింది. అన్నీ మార్చేసింది పై వ్యాసం - తగిన సాధనాన్ని జోడించడం రెండు క్లిక్లలో జరుగుతుంది మరియు ప్రత్యేకమైన సాధనంతో, చార్ట్లను ప్లాట్ చేసే పని కొద్దిగా సులభం అవుతుంది.
శీర్షికలో నేను విద్యుత్ వినియోగం గురించి ప్రస్తావించాను. దురదృష్టవశాత్తు, ప్రస్తుతానికి నేను ఏ గ్రాఫ్లను అందించలేను. ఒక SDM120 మీటర్ నా కోసం మరణించింది మరియు మరొకటి మోడ్బస్ ద్వారా యాక్సెస్ చేసినప్పుడు ఇబ్బందికరంగా ఉంది. అయితే, ఇది ఈ వ్యాసం యొక్క అంశాన్ని ఏ విధంగానూ ప్రభావితం చేయదు - గ్రాఫ్లు నీటి కోసం అదే విధంగా నిర్మించబడతాయి.
ఈ వ్యాసంలో నేను స్వయంగా ప్రయత్నించిన విధానాలను అందించాను. ఖచ్చితంగా నాకు తెలియని డేటా సేకరణ మరియు విజువలైజేషన్ నిర్వహించడానికి కొన్ని ఇతర మార్గాలు ఉన్నాయి. వ్యాఖ్యలలో దాని గురించి చెప్పండి, నేను చాలా ఆసక్తిగా ఉంటాను. నిర్మాణాత్మక విమర్శలు మరియు కొత్త ఆలోచనలకు నేను సంతోషిస్తాను. సమర్పించిన విషయం ఎవరికైనా సహాయపడుతుందని నేను ఆశిస్తున్నాను.