é»æ°ä»£ãæ°Žé代ã®æ¯æããåãåããã³ã«ãç§ã®å®¶æã¯æ¬åœã«ããããã®é»åãæ¶è²»ããŠããã®ã ããããšçåã«æãã®ã§ãã 確ãã«ããã¹ã«ãŒã ã«ã¯åºææ¿ãšãã€ã©ãŒããããŸããã圌ãã¯åžžã«æ¶é²å£«ãšããŠåããŠããããã§ã¯ãããŸããã ç§ãã¡ã¯æ°Žã®ç¯çŽã«ããªã£ãŠããããã§ãïŒãã ããç§ãã¡ã¯ãã¹ã«ãŒã ã§æ°Žããããã®ã奜ãã§ãïŒã æ°å¹Žåã«ç§ã¯ãã§ã«
æè¿ãã¹ããŒã ããŒã ã·ã¹ãã ãšããŠããŒã ã¢ã·ã¹ã¿ã³ãã«åãæ¿ããŸããã ãã®çç±ã® XNUMX ã€ã¯ã倧éã®ããŒã¿ã®åéãæŽçããããŸããŸãªçš®é¡ã®ã°ã©ããç°¡åã«äœæã§ããããšã§ãã
ãã®èšäºã§èª¬æãããŠããæ
å ±ã¯æ°ãããã®ã§ã¯ãªããããããã¹ãŠã®ããšã¯ããŸããŸãªãœãŒã¹ã§ãã§ã«ã€ã³ã¿ãŒãããäžã§èª¬æãããŠããŸãã ãã ããåèšäºã§ã¯ãååãšã㊠XNUMX ã€ã®ã¢ãããŒããŸãã¯åŽé¢ã®ã¿ã説æããŸãã ããããã¹ãŠã®ã¢ãããŒããæ¯èŒããæãé©åãªãã®ãèªåã§éžæããå¿
èŠããããŸããã ãã®èšäºã¯ããŒã¿åéã«é¢ããå®å
šãªæ
å ±ããŸã æäŸããŠããŸããããç§ãã©ã®ããã«ããŒã¿åéãè¡ã£ããã«ã€ããŠã®æŠèŠã®ãããªãã®ã§ãã ãããã£ãŠã建èšçãªæ¹å€ãæ¹åã®ææ¡ã¯æè¿ãããŸãã
åé¡ã®å®åŒå
ãããã£ãŠãä»æ¥ã®æŒç¿ã®ç®æšã¯ãæ°Žãšé»åã®æ¶è²»éã®çŸããã°ã©ããååŸããããšã§ãã
- 2 æ¥éãXNUMX æéããš
- 2é±éæ¯æ¥
- (ãªãã·ã§ã³) æ¯é±ããã³æ¯æ
ããã«ã¯ããã€ãã®å°é£ããããŸãã
- æšæºã®ã°ã©ã ã³ã³ããŒãã³ãã¯éåžžã«è²§åŒ±ãªåŸåããããŸãã ãããããç¹ããšã«æãç·ã°ã©ããäœæã§ããŸãã
ããæ€çŽ¢ãããšãæšæºãã£ãŒãã®æ©èœãæ¡åŒµãããµãŒãããŒã㣠ã³ã³ããŒãã³ããèŠã€ããããšãã§ããŸãã ããŒã ã¢ã·ã¹ã¿ã³ãã«ãšã£ãŠãååãšããŠãåªããçŸããã³ã³ããŒãã³ã
ããã°ã©ãã«ãŒã ãã ããããçšåºŠå¶éããããŸãã- æ£ã°ã©ãã®ãã©ã¡ãŒã¿ã倧ããªééã§èšå®ããã®ã¯å°é£ã§ã (æ£ã®å¹ 㯠XNUMX æéã®å°æ°ç¹ã§èšå®ãããŸããã€ãŸããXNUMX æéãè¶ ããééã¯å°æ°ç¹ã§èšå®ãããŸã)ã
- XNUMX ã€ã®ã°ã©ãã«ç°ãªããšã³ãã£ãã£ãè¿œå ããããšã¯ã§ããŸãã (枩床ãšæ¹¿åºŠãæ£ã°ã©ããšç·ã®çµã¿åãããªã©)ã
- ããŒã ã¢ã·ã¹ã¿ã³ãã¯ããã©ã«ãã§æãåå§ç㪠SQLite ããŒã¿ããŒã¹ã䜿çšããã ãã§ãªã (䟿å©å±ã®ç§ã¯ MySQL ã Postgres ã®ã€ã³ã¹ããŒã«ããã¹ã¿ãŒããŠããŸããã§ãã)ãããŒã¿ã¯æé©ãªæ¹æ³ã§ä¿åãããŸããã ãããã£ãŠãããšãã°ããã©ã¡ãŒã¿ã®æå°ã®ããžã¿ã« ãã©ã¡ãŒã¿ãå€æŽããããã³ã«ããµã€ãºãçŽ XNUMX ãããã€ãã®å·šå€§ãª JSON ãããŒã¿ããŒã¹ã«æžã蟌ãŸããŸãã
{"entity_id": "sensor.water_cold_hourly", "old_state": {"entity_id": "sensor.water_cold_hourly", "state": "3", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:05:06.897604+00:00", "last_updated": "2020-02-23T19:05:06.897604+00:00", "context": {"id": "aafc8ca305ba4e49ad4c97f0eddd8893", "parent_id": null, "user_id": null}}, "new_state": {"entity_id": "sensor.water_cold_hourly", "state": "4", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:11:11.251545+00:00", "last_updated": "2020-02-23T19:11:11.251545+00:00", "context": {"id": "0de64b8af6f14bb9a419dcf3b200ef56", "parent_id": null, "user_id": null}}}
ããªãã®æ°ã®ã»ã³ãµãŒ (åéšå±ã®æž©åºŠã»ã³ãµãŒãæ°Žéã¡ãŒã¿ãŒãé»æ°ã¡ãŒã¿ãŒ) ããããäžã«ã¯ããªã倧éã®ããŒã¿ãçæããã»ã³ãµãŒããããŸãã ããšãã°ãSDM220 é»åã¡ãŒã¿ãŒã ãã 10 ïœ 15 ç§ããšã«çŽ 8 åã®å€ãçæããããããã®ãããªã¡ãŒã¿ãŒã 100 å°èšçœ®ããããšèããŠããŸãããŸããä»ã®ã»ã³ãµãŒã«åºã¥ããŠèšç®ããããã©ã¡ãŒã¿ãŒã倧éã«ãããŸãã ãããã ããããã¹ãŠã®å€ã«ãããããŒã¿ããŒã¹ãæ¯æ¥ 200 ïœ XNUMX MB ãã€ç°¡åã«èšåŒµããå¯èœæ§ããããŸãã XNUMX é±é以å ã«ã·ã¹ãã ã¯ã»ãšãã©å¯è¿ããæããªããªããXNUMX ãæåŸã«ã¯ãã©ãã·ã¥ ãã©ã€ããåæ¢ããŸã (Raspberry PI ã«äžè¬çãªããŒã ã¢ã·ã¹ã¿ã³ããã€ã³ã¹ããŒã«ããå Žå)ãXNUMX 幎éããŒã¿ãä¿åã§ãããã©ããã¯çåã®äœå°ããããŸããã
- éãè¯ããã°ãã¡ãŒã¿ãŒèªäœã§æ¶è²»éãã«ãŠã³ãã§ããŸãã ãã€ã§ãã¡ãŒã¿ãŒã«é£çµ¡ããŠã环ç©æ¶è²»éãäœæã§ããããå°ããããšãã§ããŸãã ååãšããŠãããžã¿ã« ã€ã³ã¿ãŒãã§ã€ã¹ (RS232/RS485/Modbus/Zigbee) ãåãããã¹ãŠã®é»åã¡ãŒã¿ãŒã¯ããã®ãããªæ©äŒãæäŸããŸãã
ããã«æªãããšã«ãããã€ã¹ãåã«äœããã®ç¬éãã©ã¡ãŒã¿ (ç¬éé»åãé»æµãªã©) ã枬å®ããããX ã¯ããæãŸãã¯ãªããã«ããšã«ãã«ã¹ãçæãããã§ããå Žåã¯ãããã«æªãããšã«ãªããŸãã 次ã«ããããäœãã©ã®ããã«çµ±åããã©ãã«äŸ¡å€ãèç©ããããèããå¿ èŠããããŸãã äœããã®çç±ã§æ¬¡ã®ã¬ããŒããèŠéããªã¹ã¯ããããã·ã¹ãã å šäœã®ç²ŸåºŠã«çåãçããŸãã ãã¡ãããããããã¹ãŠãããŒã ã¢ã·ã¹ã¿ã³ããªã©ã®ã¹ããŒã ããŒã ã·ã¹ãã ã«ä»»ããããšãã§ããŸãããããŒã¿ããŒã¹å ã®ãšã³ããªæ°ã«é¢ããç¹ã¯èª°ããã£ã³ã»ã«ããŠããããXNUMX ç§éã« XNUMX åãè¶ ããã»ã³ãµãŒã®ããŒãªã³ã°ã¯æ©èœããŸãã (ã·ã¹ãã ã®å¶é)ããŒã ã¢ã·ã¹ã¿ã³ãã¢ãŒããã¯ãã£ïŒã
ã¢ãããŒã 1
ãŸããããã«æäŸãããããŒã ã¢ã·ã¹ã¿ã³ããèŠãŠã¿ãŸãããã äžå®æéã«ãããæ¶è²»éã®æž¬å®ã¯ãéåžžã«èŠæã®é«ãæ©èœã§ãã ãã¡ãããããã¯ãã£ãšåã«ç¹æ®ãªã³ã³ããŒãã³ããutility_meter ãšããŠå®è£ ãããŸããã
ãã®ã³ã³ããŒãã³ãã®æ¬è³ªã¯ãå éšã§ current_accumulated_value å€æ°ãéå§ããæå®ãããæé (æé/é±/æ) ã®åŸã«ããããªã»ããããããšã§ãã ã³ã³ããŒãã³ãèªäœã¯åä¿¡å€æ° (ããçš®ã®ã»ã³ãµãŒã®å€) ãç£èŠããå€èªäœã®å€æŽããµãã¹ã¯ã©ã€ãããŸããæçµçµæãååŸããã ãã§ãã ãã®ããšã¯ãæ§æãã¡ã€ã«ã®ãããæ°è¡ã§èª¬æãããŠããŸã
utility_meter:
water_cold_hour_um:
source: sensor.water_meter_cold
cycle: hourly
water_cold_day_um:
source: sensor.water_meter_cold
cycle: daily
ããã§ãsensor.water_meter_cold ã¯ãååŸããã¡ãŒã¿ãŒã®çŸåšã®å€ (ãªããã«åäœ) ã§ãã
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 æéããšã« XNUMX ã«ãªã»ãããããå調å¢å é¢æ°ã§ãã ãŸããæéäžã«äœãªããã«é£ã¹ãããšãã£ãã䜿ããããæ¶è²»ã¹ã±ãžã¥ãŒã«ãå¿ èŠã§ãã æšæºã®å±¥æŽã°ã©ã ã³ã³ããŒãã³ãã¯ãããè¡ããŸããããå€éšã®ããã°ã©ãã«ãŒã ã³ã³ããŒãã³ãã圹ã«ç«ã¡ãŸãã
ããã¯ã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 - æéã®å§ãŸãã«åãããŠåãé 眮ãããã°ã©ããçæãããŸã
- Points_per_hour: 1 æéããã XNUMX - XNUMX ããŒ
- ãããŠæãéèŠãªã®ã¯ã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 ãã©ã¡ãŒã¿ã¯ééã«èšå®ãããŠãããpoints_per_hour ãã©ã¡ãŒã¿ããã¹ãŠã決å®ããããšã«æ³šæããŠãã ããã ãããŠãããã¯ãã®ã³ã³ããŒãã³ãã®ãã 1 ã€ã®åé¡ã§ããpoints_per_hour 㯠24 æé以äžã®ãã£ãŒãã§ã¯ããŸãæ©èœããŸãããããããé·ãééã§ã¯ããããããã»ã©æ©èœããŸããã ãããã£ãŠã0.04166666 æ¥ã« XNUMX åãååŸããã«ã¯ãå€ XNUMX/XNUMX=XNUMX ãå ¥åããå¿ èŠããããŸããã ç§ã¯é±è¶³ãã£ãŒããæ足ãã£ãŒãã«ã€ããŠè©±ããŠããã®ã§ã¯ãããŸããã
ã¢ãããŒã 2
ããŒã ã¢ã·ã¹ã¿ã³ãã«ã€ããŠãŸã èãäžã ã£ããšãã«ã次ã®ãããªãèŠã€ããŸããã
åå¿ã¯ãããã€ãã®çš®é¡ã® Xiaomi ãœã±ããããæ¶è²»ããŒã¿ãåéããŸãã 圌ã®ã¿ã¹ã¯ã¯ããå°ãåçŽã§ããä»æ¥ãæšæ¥ããããŠä»æã®æ¶è²»éã衚瀺ããã ãã§ãã ãã£ãŒãã¯å¿ èŠãããŸããã
ç¬éé»åå€ã®æåç©åã«é¢ããè°è«ã¯èã«çœ®ããŠãããŸãããããã®ã¢ãããŒãã®ã粟床ãã«ã€ããŠã¯äžã§ãã§ã«æžããŸããã åãã¢ãŠãã¬ããã«ãã£ãŠãã§ã«åéãããŠãã环ç©æ¶è²»éå€ããªã圌ã䜿çšããªãã£ãã®ãã¯æããã§ã¯ãããŸããã ç§ã®æèŠã§ã¯ãéçã®å éšã«çµ±åããæ¹ãããŸããããšæããŸãã
ãããªãããäžå®æéã®æ¶è²»éãæåã§ã«ãŠã³ããããšããã¢ã€ãã¢ãåãäžããŸãã ç·æ§ã®å Žåãä»æ¥ãšæšæ¥ã®å€ã®ã¿ãèæ ®ãããŸãããããã«é²ãã§ã°ã©ããæããŠã¿ãŸãã ç§ã®å Žåã®ææ¡ææ³ã®èŠç¹ã¯ä»¥äžã®éãã§ãã
å€æ° value_at_the_beginning_of_hour ãäœæããããã«çŸåšã®ã«ãŠã³ã¿ãŒã®èªã¿åãå€ãæžã蟌ã¿ãŸã
æéã®çµããïŒãŸãã¯æ¬¡ã®æéã®å§ãŸãïŒã®ã¿ã€ããŒã«åŸã£ãŠãçŸåšã®æž¬å®å€ãšæéã®åãã«ä¿åããã枬å®å€ã®å·®ãèšç®ããŸãã ãã®å·®ãçŸåšã®æéã®æ¶è²»éã«ãªããŸããå€ãã»ã³ãµãŒã«ä¿åããå°æ¥çã«ã¯ãã®å€ã«åºã¥ããŠã°ã©ããæ§ç¯ããŸãã
ãŸããå€æ° value_at_beginning_of_hour ã«ã«ãŠã³ã¿ãŒã®çŸåšã®å€ãæžã蟌ãã§ãå€æ° value_at_beginning_of_hour ãããªã»ãããããå¿
èŠããããŸãã
ãããã¯ãã¹ãŠãããŒã ã¢ã·ã¹ã¿ã³ãèªäœã䜿çšããŠè¡ãããšãã§ããŸãã
åã®ã¢ãããŒããããå°ãå€ãã®ã³ãŒããèšè¿°ããå¿ èŠããããŸãã ãããã®ãå€æ°ãããå§ããŸãããã ãã®ãŸãŸã§ã¯ãå€æ°ããšã³ãã£ãã£ã¯ãããŸããããMQTT ãããŒã«ãŒã®ãµãŒãã¹ã䜿çšã§ããŸãã ããã«ãretain=true ãã©ã°ãä»ããŠå€ãéä¿¡ããŸããããã«ãããå€ããããŒã«ãŒå ã«ä¿åãããããŒã ã¢ã·ã¹ã¿ã³ããåèµ·åãããå Žåã§ãããã€ã§ãåãåºãããšãã§ããŸãã æéã«ãŠã³ã¿ãŒãšæ¥ã«ãŠã³ã¿ãŒãäžæ°ã«äœããŸããã
- platform: mqtt
state_topic: "test/water/hour"
name: water_hour
unit_of_measurement: l
- platform: mqtt
state_topic: "test/water/hour_begin"
name: water_hour_begin
unit_of_measurement: l
- platform: mqtt
state_topic: "test/water/day"
name: water_day
unit_of_measurement: l
- platform: mqtt
state_topic: "test/water/day_begin"
name: water_day_begin
unit_of_measurement: l
ãã¹ãŠã®éæ³ã¯ãªãŒãã¡ãŒã·ã§ã³ã§èµ·ãããããããæ¯æãšæ¯æ©å®è¡ãããŸãã
- id: water_new_hour
alias: water_new_hour
initial_state: true
trigger:
- platform: time_pattern
minutes: 0
action:
- service: mqtt.publish
data:
topic: "test/water/hour"
payload_template: >
{{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_hour_begin.state|int) }}
retain: true
- service: mqtt.publish
data:
topic: "test/water/hour_begin"
payload_template: >
{{ states.sensor.water_meter_cold.state }}
retain: true
- id: water_new_day
alias: water_new_day
initial_state: true
trigger:
- platform: time
at: "00:00:00"
action:
- service: mqtt.publish
data:
topic: "test/water/day"
payload_template: >
{{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_day_begin.state|int) }}
retain: true
- service: mqtt.publish
data:
topic: "test/water/day_begin"
payload_template: >
{{ states.sensor.water_meter_cold.state }}
retain: true
ã©ã¡ãã®èªååã次㮠2 ã€ã®ããšãè¡ããŸãã
- éå§å€ãšçµäºå€ã®å·®ãšããŠééããšã®å€ãèšç®ããŸãã
- 次ã®ééã®åºæ¬å€ãæŽæ°ããŸã
ãã®å Žåã®ã°ã©ãã®æ§ç¯ã¯ãéåžžã®å±¥æŽã°ã©ãã«ãã£ãŠè§£æ±ºãããŸãã
- type: history-graph
title: 'Hourly water consumption using vars'
hours_to_show: 48
entities:
- sensor.water_hour
- type: history-graph
title: 'Daily water consumption using vars'
hours_to_show: 360
entities:
- sensor.water_day
ããã¯æ¬¡ã®ããã«ãªããŸãã
ååãšããŠãããã¯ãã§ã«å¿
èŠãªãã®ã§ãã ãã®æ¹æ³ã®å©ç¹ã¯ãããŒã¿ãééããšã« 24 åçæãããããšã§ãã ãããã®ã æé足ãã£ãŒãã§ã¯ XNUMX æ¥ãããåèš XNUMX ãšã³ããªã
æ®å¿µãªãããããã§ãåºå°ã®æ¡å€§ãšããäžè¬çãªåé¡ã¯ãŸã 解決ãããŠããŸããã æ¯æã®æ¶è²»éã°ã©ããå¿ èŠãªå Žåã¯ãå°ãªããšã 200 幎éã®ããŒã¿ãä¿åããå¿ èŠããããŸãã ãŸããããŒã ã¢ã·ã¹ã¿ã³ãã¯ããŒã¿ããŒã¹å šäœã«å¯Ÿã㊠200000 ã€ã®ä¿åæéèšå®ããæäŸããªããããã·ã¹ãã å ã®ãã¹ãŠã®ããŒã¿ã XNUMX 幎éä¿åããå¿ èŠãããããšãæå³ããŸãã ããšãã°ãç§ã¯ XNUMX 幎㫠XNUMX ç«æ¹ã¡ãŒãã«ã®æ°Žãæ¶è²»ããŸããããã¯ãããŒã¿ããŒã¹ã« XNUMX ã®ãšã³ããªãããããšãæå³ããŸãã ãããŠãä»ã®ã»ã³ãµãŒãèæ ®ãããšãå³ã¯äžè¬çã«åå£ã«ãªããŸãã
ã¢ãããŒã 3
幞ããªããšã«ãè³¢æãªäººã 㯠InfluxDB ããŒã¿ããŒã¹ãäœæããããšã§ãã®åé¡ããã§ã«è§£æ±ºããŠããŸãã ãã®ããŒã¿ããŒã¹ã¯ãæéããŒã¹ã®ããŒã¿ãä¿åããããã«ç¹å¥ã«æé©åãããŠãããããŸããŸãªã»ã³ãµãŒã®å€ãä¿åããã®ã«æé©ã§ãã ãã®ã·ã¹ãã ã¯ãããŒã¿ããŒã¹ããå€ãæœåºããããŸããŸãªæ¹æ³ã§ããããéèšã§ãã SQL ã«äŒŒãã¯ãšãªèšèªãæäŸããŸãã æåŸã«ãç°ãªãããŒã¿ãç°ãªãæéã«ä¿åã§ããŸãã ããšãã°ã枩床ã湿床ãªã©ã®é »ç¹ã«å€åãã枬å®å€ã¯æ°é±éããä¿åã§ããŸããããæ¯æ¥ã®æ°Žæ¶è²»éã®æž¬å®å€ã¯ XNUMX 幎éä¿åã§ããŸãã
InfluxDB ã«å ããŠãè³¢ã人ã 㯠InfluxDB ã®ããŒã¿ããã°ã©ããæç»ããã·ã¹ãã ã§ãã Grafana ãçºæããŸããã Grafana ã¯ããŸããŸãªã¿ã€ãã®ãã£ãŒããæç»ãã詳现ã«ã«ã¹ã¿ãã€ãºã§ããŸãããããŠæãéèŠãªããšã¯ããããã®ãã£ãŒãã lovelace-UI ããŒã ã¢ã·ã¹ã¿ã³ãã«ãæ¥ç¶ãã§ããããšã§ãã
觊çºãããŸã
ããã§ããŸã influxDB ã«ã«ãŠã³ã¿ãŒå€ãè¿œå ããŠã¿ãŸãããã ããŒã ã¢ã·ã¹ã¿ã³ãã®èšå®ã®äžéš (ãã®äŸã§ã¯ãå·æ°Žã ãã§ãªãæž©æ°Žã楜ãã¿ãŸã):
influxdb:
host: localhost
max_retries: 3
default_measurement: state
database: homeassistant
include:
entities:
- sensor.water_meter_hot
- sensor.water_meter_cold
ããŒã ã¢ã·ã¹ã¿ã³ãã®å éšããŒã¿ããŒã¹ãåã³èšåŒµããªãããã«ãåãããŒã¿ã®ä¿åãç¡å¹ã«ããŸãããã
recorder:
purge_keep_days: 10
purge_interval: 1
exclude:
entities:
- sensor.water_meter_hot
- sensor.water_meter_cold
次ã«ãInfluxDB ã³ã³ãœãŒã«ã«ç§»åããŠããŒã¿ããŒã¹ãèšå®ããŸãããã ç¹ã«ãç¹å®ã®ããŒã¿ãä¿åããæéãæ§æããå¿ èŠããããŸãã ããã¯ããããèŠå¶ãããŠããŸãã ä¿æããªã·ãŒ - ããã¯ã¡ã€ã³ ããŒã¿ããŒã¹å ã®ããŒã¿ããŒã¹ã«äŒŒãŠãããåå éšããŒã¿ããŒã¹ã«ã¯ç¬èªã®èšå®ããããŸãã ããã©ã«ãã§ã¯ããã¹ãŠã®ããŒã¿ã¯ autogen ãšåŒã°ããä¿æããªã·ãŒã«è¿œå ããããã®ããŒã¿ã¯ XNUMX é±éä¿åãããŸãã æéããšã®ããŒã¿ã¯ XNUMX ãæéä¿åããé±ããšã®ããŒã¿ã¯ XNUMX 幎éä¿åããæããšã®ããŒã¿ã¯ãŸã£ããåé€ããªãããã«ããããšèããŠããŸãã é©åãªä¿åããªã·ãŒãäœæããŸã
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
ããŠãå®éãäž»ãªããªãã¯ã¯é£ç¶ã¯ãšãªã䜿çšããããŒã¿éèšã§ãã ããã¯ãæå®ããééã§ã¯ãšãªãèªåçã«èµ·åãããã®ã¯ãšãªã®ããŒã¿ãéèšãããã®çµæãæ°ããå€ã«è¿œå ããã¡ã«ããºã ã§ãã äŸãèŠãŠã¿ãŸããã (èªã¿ãããããããã«åã«æžããŠããŸãããå®éã«ã¯ãã®ã³ãã³ãã XNUMX è¡ã§å ¥åããå¿ èŠããããŸãã)
CREATE CONTINUOUS QUERY cq_water_hourly ON homeassistant
BEGIN
SELECT max(value) AS value
INTO homeassistant.month.water_meter_hour
FROM homeassistant.autogen.l
GROUP BY time(1h), entity_id fill(previous)
END
ãã®ã³ãã³ã:
- homeassistant ããŒã¿ããŒã¹ã« cq_water_cold_hourly ãšããååã®ç¶ç¶ã¯ãšãªãäœæããŸã
- ã¯ãšãªã¯ 1 æéããšã«å®è¡ãããŸã (time(XNUMXh))
- ã¯ãšãªã¯ãå·æ°Žãšæž©æ°Žã®æž¬å®å€ãå«ããhomeassistant.autogen.l (ãªããã«) ã®æž¬å®å€ãããã¹ãŠã®ããŒã¿ãååŸããŸãã
- éçŽãããããŒã¿ã¯entity_idã«ãã£ãŠã°ã«ãŒãåãããå·æ°Žãšæž©æ°Žã«å¥ã ã®å€ãäœæãããŸãã
- ãªããã«ã®ã«ãŠã³ã¿ãŒã¯æéããšã«å調å¢å ãããããæ倧å€ãååŸããå¿ èŠããããéèšã¯ max(value) é¢æ°ã«ãã£ãŠå®è¡ãããŸãã
- æ°ããå€ã¯ homeassistant.month.water_meter_hour ã«æžã蟌ãŸããŸããmonth ã¯ãä¿ææéã XNUMX ãæã®ä¿æããªã·ãŒã®ååã§ãã ããã«ãå·æ°Žãšæž©æ°Žã®ããŒã¿ã¯ã察å¿ããentity_idãšvalueãã£ãŒã«ãã®å€ãæã€å¥ã ã®ã¬ã³ãŒãã«åæ£ãããŸãã
å€éã家ã«èª°ãããªããšãã¯æ°Žã®æ¶è²»ããªããããhomeassistant.autogen.l ã«ãæ°ããã¬ã³ãŒãã¯ãããŸããã éåžžã®ã¯ãšãªã§å€ã®æ¬ èœãé¿ããããã«ãfill(previous) ã䜿çšã§ããŸãã ããã«ãããInfluxDB ã¯éå» XNUMX æéã®å€ã䜿çšããããã«ãªããŸãã
æ®å¿µãªãããé£ç¶ã¯ãšãªã«ã¯ç¹æ®ãªç¹ããããŸããfill(previous) ããªãã¯ã¯æ©èœãããã¬ã³ãŒãã¯åã«äœæãããŸããã ããã«ãããã¯ããçš®ã®å
æã§ããªãåé¡ã§ãã
äœãèµ·ãã£ãã®ãã確èªããŠã¿ãŸããã (ãã¡ãããæ°æéåŸ ã€å¿ èŠããããŸã)ã
> select * from homeassistant.month.water_meter_hour group by entity_id
...
name: water_meter_hour
tags: entity_id=water_meter_cold
time value
---- -----
...
2020-03-08T01:00:00Z 370511
2020-03-08T02:00:00Z 370513
2020-03-08T05:00:00Z 370527
2020-03-08T06:00:00Z 370605
2020-03-08T07:00:00Z 370635
2020-03-08T08:00:00Z 370699
2020-03-08T09:00:00Z 370761
2020-03-08T10:00:00Z 370767
2020-03-08T11:00:00Z 370810
2020-03-08T12:00:00Z 370818
2020-03-08T13:00:00Z 370827
2020-03-08T14:00:00Z 370849
2020-03-08T15:00:00Z 370921
ããŒã¿ããŒã¹å ã®å€ã¯ UTC ã§ä¿åãããŠããããããã®ãªã¹ã㯠3 æéç°ãªããŸããInfluxDB åºåã®åå 7 æã®å€ã¯ãäžã®ã°ã©ãã®åå 10 æã®å€ãšäžèŽããŸãã ãŸããåå 2 æãã 5 æã®éã¯ã¬ã³ãŒãããŸã£ãããªãããšã«ã泚æããŠãã ãããããã¯ãŸãã«ç¶ç¶çã¯ãšãªã®ç¹åŸŽã§ãã
ã芧ã®ãšãããéèšå€ãå調å¢å ã·ãŒã±ã³ã¹ã§ããããšã³ããªã®é »åºŠãäœããªã£ãŠãã (XNUMX æéã« XNUMX å) ã ãã§ãã ããããããã¯åé¡ã§ã¯ãããŸãããã°ã©ãã®æ£ããããŒã¿ãæœåºããå¥ã®ã¯ãšãªãäœæã§ããŸãã
SELECT difference(max(value))
FROM homeassistant.month.water_meter_hour
WHERE entity_id='water_meter_cold' and time >= now() -24h
GROUP BY time(1h), entity_id
fill(previous)
解èªããŸãïŒ
- homeassistant.month.water_meter_hour ããŒã¿ããŒã¹ãããéå» 24 æ¥ (time >= now() -XNUMXh) ã®entity_id='water_meter_cold' ã®ããŒã¿ãååŸããŸãã
- åè¿°ããããã«ãhomeassistant.month.water_meter_hour ã·ãŒã±ã³ã¹ããäžéšã®ãšã³ããªãæ¬ èœããŠããå¯èœæ§ããããŸãã GROUP BY time(1h) ãæå®ããŠã¯ãšãªãå®è¡ããŠããã®ããŒã¿ãåçæããŸãã ä»åã¯ãfill(previous) ãé©åã«æ©èœããæ¬ èœããŠããããŒã¿ãçæãããŸã (é¢æ°ã¯åã®å€ãååŸããŸã)ã
- ãã®ã¯ãšãªã§æãéèŠãªã®ã¯ãæéããŒã¯éã®å·®ãèšç®ããå·®åé¢æ°ã§ãã ããèªäœã§ã¯æ©èœããªããããéèšé¢æ°ãå¿ èŠã§ãã ããã以åã«äœ¿çšãã max() ãšããŸãã
å®è¡çµæã¯ãããªæã
name: water_meter_hour
tags: entity_id=water_meter_cold
time difference
---- ----------
...
2020-03-08T02:00:00Z 2
2020-03-08T03:00:00Z 0
2020-03-08T04:00:00Z 0
2020-03-08T05:00:00Z 14
2020-03-08T06:00:00Z 78
2020-03-08T07:00:00Z 30
2020-03-08T08:00:00Z 64
2020-03-08T09:00:00Z 62
2020-03-08T10:00:00Z 6
2020-03-08T11:00:00Z 43
2020-03-08T12:00:00Z 8
2020-03-08T13:00:00Z 9
2020-03-08T14:00:00Z 22
2020-03-08T15:00:00Z 72
åå 2 æããåå 5 æ (UTC) ãŸã§æ¶è²»ã¯ãããŸããã§ããã ããã«ãããããããã¯ãšãªã¯ fill(previous) ã®ãããã§åãæ¶è²»å€ãè¿ããå·®åé¢æ°ã¯ãã®å€ãããèªäœããæžç®ããåºå㧠0 ãååŸããŸãããããã¯å®éã«å¿ èŠã§ãã
ããšã¯ã°ã©ããäœæããã ãã§ãã ãããè¡ãã«ã¯ãGrafana ãéããæ¢åã® (ãŸãã¯æ°ãã) ããã·ã¥ããŒããéããæ°ããããã«ãäœæããŸãã ãã£ãŒãã®èšå®ã¯ä»¥äžã®ããã«ãªããŸãã
å·æ°Žãšæž©æ°Žã®ããŒã¿ãåãã°ã©ãã§è¡šç€ºããŸãã ãªã¯ãšã¹ãã¯äžã§èª¬æãããã®ãšãŸã£ããåãã§ãã
衚瀺ãã©ã¡ãŒã¿ã¯ä»¥äžã®ããã«èšå®ããŸãã ç§ã«ãšã£ãŠãããã¯ç·ïŒç·ïŒãå«ãã°ã©ãã§ãããããã¯æ®µéïŒé段ïŒã«é²ã¿ãŸãã 以äžãStackãã©ã¡ãŒã¿ã«ã€ããŠèª¬æããã 以äžã«ããã«ããã€ãã®è¡šç€ºãªãã·ã§ã³ããããŸãããããã»ã©èå³æ·±ããã®ã§ã¯ãããŸããã
çµæã®ã°ã©ããããŒã ã¢ã·ã¹ã¿ã³ãã«è¿œå ããã«ã¯ã次ã®æäœãè¡ãå¿
èŠããããŸãã
- ãã£ãŒãç·šéã¢ãŒããçµäºããŸãã äœããã®çç±ã§ãæ£ããã°ã©ãå ±æèšå®ã¯ããã·ã¥ããŒã ããŒãžããã®ã¿æäŸãããŸãã
- ãã£ãŒãåã®æšªã«ããäžè§åœ¢ãã¯ãªãã¯ããã¡ãã¥ãŒãããå ±æããéžæããŸã
- éãããŠã£ã³ããŠã§ããåã蟌ã¿ãã¿ãã«ç§»åããŸã
- çŸåšã®æéç¯å²ã®ãã§ãã¯ãå€ããŸã - URL ãä»ããŠæéç¯å²ãèšå®ããŸã
- å¿ èŠãªãããã¯ãéžæããŸãã ç§ã®å Žåã¯è»œãã§ã
- çµæã® URL ã lovelace-UI èšå®ã«ãŒãã«ã³ããŒããŸãã
- type: iframe
id: graf_water_hourly
url: "http://192.168.10.200:3000/d-solo/rZARemQWk/water?orgId=1&panelId=2&from=now-2d&to=now&theme=light"
æé (éå» 2 æ¥é) ã¯ããã·ã¥ããŒãã®èšå®ã§ã¯ãªããããã§èšå®ãããããšã«æ³šæããŠãã ããã
ãã£ãŒãã¯ãããªæãã§ãã ãã2æ¥éã¯ã湯ã䜿ã£ãŠããªãã®ã§ãå·æ°Žã®ã°ã©ãã®ã¿ãæãããŠããŸãã
ã¹ãããã©ã€ã³ãšãªã¢ã«ããŒã®ã©ã¡ãã®ãã£ãŒããäžçªå¥œãããç§èªèº«ã¯ãŸã 決ããŠããŸããã ãããã£ãŠãä»åã¯ããŒã§ã®ã¿ãXNUMXæ¥ã®æ¶è²»ã¹ã±ãžã¥ãŒã«ã®äŸãç°¡åã«ç€ºããŸãã ã¯ãšãªã¯äžèšãšåãæ¹æ³ã§æ§ç¯ãããŸãã 衚瀺ãªãã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã
ãã®ãã£ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
ãšããããšã§ãStackãã©ã¡ãŒã¿ã«ã€ããŠã ãã®ã°ã©ãã§ã¯ãå·ããæ°Žã®ããŒãç±ãããŒã®äžã«æãããŠããŸãã å
šé«ã¯ããã®æéã®å·æ°Žãšæž©æ°Žã®ç·æ¶è²»éã«çžåœããŸãã
衚瀺ããããã¹ãŠã®ã°ã©ãã¯åçã§ãã ããŠã¹ãé¢å¿ã®ãããã€ã³ãã®äžã«ç§»åãããšãç¹å®ã®ãã€ã³ãã®è©³çŽ°ãšå€ã確èªã§ããŸãã
æ®å¿µãªãããè»èã®äžã«ããšãæ°å¹ããªãããã§ã¯ãããŸããã§ããã æ£ã°ã©ã (é段ç¶ã®ã°ã©ããšã¯ç°ãªããŸã) ã§ã¯ãæ£ã®äžå€®ã¯æ¥äžã§ã¯ãªã 00:00 ã«ãããŸãã ãããã®ã ããŒã®å·Šååãåæ¥ã®ä»£ããã«æç»ãããŸãã ãã®ãããåææ¥ãšæ¥ææ¥ã®ãã£ãŒãã¯éã¿ããã£ããŸãŒã³ã®å°ãå·ŠåŽã«æãããŠããŸãã åã¡æ¹ãåãããŸã§ã¯ã
ãã 30 ã€ã®åé¡ã¯ãæ¯æã®ééãæ£ããæ©èœã§ããªãããšã§ãã å®éã«ã¯ãæé/æ¥/é±ã®é·ãã¯åºå®ãããŠããŸãããæã®é·ãã¯æ¯åç°ãªããŸãã InfluxDB ã¯çééã§ã®ã¿åäœããŸãã ãããŸã§ã®ãšãããç§ã®é è³ã¯ XNUMX æ¥ãšããäžå®ã®ééãèšå®ããã®ã«ååã§ããã ã¯ãããã£ãŒãã¯å¹ŽéãéããŠå°ãæµ®ããæ£ã¯æã«æ£ç¢ºã«å¯Ÿå¿ããŸããã ã§ããããã¯åã«è¡šç€ºã¡ãŒã¿ãŒãšããŠèå³ãããã®ã§ãããã§OKã§ãã
å°ãªããšã XNUMX ã€ã®è§£æ±ºçãèããããŸãã
- æ次ãã£ãŒãã§ã¹ã³ã¢ãç²åŸããé±æ¬¡ãã£ãŒãã«éå®ããŸãã 52 幎㫠XNUMX é±è¶³ã¯ããªãè¯ãããã«èŠããŸã
- æã ã®æ¶è²»éèªäœã¯æ¹æ³ 2 ãšããŠèããçŸããã°ã©ããäœæããå Žåã«ã®ã¿ grafana ã䜿çšããŸãã ããã¯ããªãæ£ç¢ºãªè§£æ±ºçã§ãã éå» XNUMX 幎éã®ãã£ãŒããéããŠæ¯èŒããããšãã§ããŸããgrafana ãªããããã§ããŸãã
ãŸãšã
çç±ã¯ããããŸããããç§ã¯ãã®çš®ã®ãã£ãŒãã倧奜ãã§ãã 圌ãã¯ã人çãæ¬æ Œåãããã¹ãŠãå€åããŠããããšã瀺ããŠããŸãã æšæ¥ã¯ãããããããŸããããä»æ¥ã¯å°ãªããææ¥ã¯ãŸãäœããããã§ãããã æ¶è²»ãšããããŒãã«ã€ããŠã¯ã家èšãšã®ååãåŒãç¶ãå¿ èŠã ã ããããçŸåšã®é£æ¬²ãèæ ®ããŠããæ³æ¡ã«èšèŒãããŠãã倧ãããŠç解ã§ããªãæ°åã ãã§ããã§ã«ããªãç解ã§ããæ¶è²»ã®å šäœåã«å€ããã€ã€ãããŸãã
ããã°ã©ããŒãšã㊠20 幎è¿ãã®ãã£ãªã¢ãããã«ãããããããç§ã¯ããŒã¿ããŒã¹ã«ã»ãšãã©è§ŠããããšããããŸããã§ããã ãããã£ãŠãå€éšããŒã¿ããŒã¹ã®ã€ã³ã¹ããŒã«ã¯éåžžã«é£è§£ã§ç解ã§ããªããã®ã®ããã«æããŸããã ãã¹ãŠãå€ãã£ã
ã¿ã€ãã«ã§æ¶è²»é»åã«ã€ããŠè§ŠããŸããã æ®å¿µãªãããçŸæç¹ã§ã¯ã°ã©ããæäŸã§ããŸããã 120 ã€ã® SDMXNUMX ã¡ãŒã¿ãŒãæ éããŠããããã XNUMX ã€ã¯ Modbus çµç±ã§ã¢ã¯ã»ã¹ãããšãã°ãçºçããŸãã ãã ããããã¯ãã®èšäºã®äž»é¡ã«ã¯ãŸã£ãã圱é¿ããŸãããã°ã©ãã¯æ°Žã®å Žåãšåãæ¹æ³ã§æ§ç¯ãããŸãã
ãã®èšäºã§ã¯ãç§èªèº«ãè©Šããã¢ãããŒãã玹ä»ããŸããã 確ãã«ãç§ãç¥ããªãããŒã¿ã®åéãšèŠèŠåãæŽçããä»ã®æ¹æ³ãããã€ããããŸãã ã³ã¡ã³ãã§ããã«ã€ããŠæããŠãã ãããéåžžã«èå³ããããŸãã 建èšçãªæ¹å€ãšæ°ããã¢ã€ãã¢ãåãã§åãå
¥ããŸãã äžèšã®å
容ã誰ãã®ã圹ã«ç«ãŠã°å¹žãã§ãã
åºæïŒ habr.com