์Šค๋งˆํŠธ ํ™ˆ: ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์—์„œ ๋ฌผ ๋ฐ ์ „๊ธฐ ์†Œ๋น„๋Ÿ‰ ์ฐจํŠธ

์Šค๋งˆํŠธ ํ™ˆ: ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์—์„œ ๋ฌผ ๋ฐ ์ „๊ธฐ ์†Œ๋น„๋Ÿ‰ ์ฐจํŠธ
์ „๊ธฐ์™€ ๋ฌผ์— ๋Œ€ํ•œ ๋Œ€๊ฐ€๋ฅผ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ๊ถ๊ธˆํ•ด์ง‘๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๊ฐ€์กฑ์ด ์ •๋ง ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์†Œ๋น„ํ• ๊นŒ์š”? ์˜ˆ, ์š•์‹ค์—๋Š” ๋ฐ”๋‹ฅ ๋‚œ๋ฐฉ๊ณผ ๋ณด์ผ๋Ÿฌ๊ฐ€ ์žˆ์ง€๋งŒ ํ•ญ์ƒ ์†Œ๋ฐฉ๊ด€์œผ๋กœ ์ผํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋ฌผ์„ ์ ˆ์•ฝํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(ํ™”์žฅ์‹ค์—์„œ ๋ฌผ์„ ํŠ€๊ธฐ๋Š” ๊ฒƒ๋„ ์ข‹์•„ํ•˜์ง€๋งŒ). ๋‚˜๋Š” ๋ช‡ ๋…„ ์ „์— ์ด๋ฏธ ์—ฐ๊ฒฐ๋œ ์ˆ˜๋Ÿ‰๊ณ„ ะธ ์ „๊ธฐ ์Šค๋งˆํŠธ ํ™ˆ์œผ๋กœ ์ „ํ™˜ํ–ˆ์ง€๋งŒ ๊ฑฐ๊ธฐ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์ œ ์†Œ๋น„ ๋ถ„์„์— ๋“ค์–ด์„ฐ๊ณ , ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด ๊ธฐ์‚ฌ์˜ ์‹ค์ œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ์Šค๋งˆํŠธ ํ™ˆ ์‹œ์Šคํ…œ์œผ๋กœ Home Assistant๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ๊ณผ ํ•จ๊ป˜ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์— ์„ค๋ช…๋œ ์ •๋ณด๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ๋‹ค๋ฅธ ์†Œ์Šค์— ์žˆ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋‚ด์šฉ์€ ์ด๋ฏธ ์ธํ„ฐ๋„ท์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ ๊ธฐ์‚ฌ๋Š” ์›์น™์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‚˜ ์ธก๋ฉด๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋น„๊ตํ•˜๊ณ  ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐฉ์‹์„ ์ง์ ‘ ์„ ํƒํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ๋Š” ์—ฌ์ „ํžˆ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋‚ด๊ฐ€ ์ˆ˜ํ–‰ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ผ์ข…์˜ ์š”์•ฝ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฑด์„ค์ ์ธ ๋น„ํŒ๊ณผ ๊ฐœ์„ ์„ ์œ„ํ•œ ์ œ์•ˆ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ์„ฑ๋ช…

๋”ฐ๋ผ์„œ ์˜ค๋Š˜ ์šด๋™์˜ ๋ชฉํ‘œ๋Š” ๋ฌผ๊ณผ ์ „๊ธฐ ์†Œ๋น„์— ๋Œ€ํ•œ ์•„๋ฆ„๋‹ค์šด ๊ทธ๋ž˜ํ”„๋ฅผ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • 2์ผ ๋™์•ˆ ๋งค์‹œ๊ฐ„
  • 2์ฃผ๊ฐ„ ๋งค์ผ
  • (์„ ํƒ ์‚ฌํ•ญ) ๋งค์ฃผ ๋ฐ ๋งค์›”

์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ‘œ์ค€ ์ฐจํŠธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ƒ๋‹นํžˆ ์—ด์•…ํ•œ ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๊ปํ•ด์•ผ ํฌ์ธํŠธ๋ณ„๋กœ ์„  ๊ทธ๋ž˜ํ”„๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ž˜ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ‘œ์ค€ ์ฐจํŠธ์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ํƒ€์‚ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ • ๋น„์„œ์˜ ๊ฒฝ์šฐ ์›์น™์ ์œผ๋กœ ํ›Œ๋ฅญํ•˜๊ณ  ์•„๋ฆ„๋‹ค์šด ๊ตฌ์„ฑ ์š”์†Œ ๋ฏธ๋‹ˆ ๊ทธ๋ž˜ํ”„ ์นด๋“œ, ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์†Œ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

    • ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํฐ ๊ฐ„๊ฒฉ์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค(๋ง‰๋Œ€์˜ ๋„ˆ๋น„๋Š” ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ์„ค์ •๋˜๋ฏ€๋กœ 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-XNUMXMB์”ฉ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์ฃผ์ผ ์•ˆ์— ์‹œ์Šคํ…œ์€ ๊ฐ„์‹ ํžˆ ๋’ค์ฒ™์ด๊ณ  ํ•œ ๋‹ฌ ์•ˆ์— ํ”Œ๋ž˜์‹œ ๋“œ๋ผ์ด๋ธŒ๊ฐ€ ์ฃฝ๊ณ  (๋ผ์ฆˆ๋ฒ ๋ฆฌ PI์— ์ผ๋ฐ˜์ ์ธ ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ ์„ค์น˜์˜ ๊ฒฝ์šฐ) XNUMX ๋…„ ๋™์•ˆ ๋ฐ์ดํ„ฐ ์ €์žฅ์— ๋Œ€ํ•œ ์˜๋ฌธ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ์šด์ด ์ข‹๋‹ค๋ฉด ์ธก์ •๊ธฐ๊ฐ€ ์†Œ๋น„๋Ÿ‰ ์ž์ฒด๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์ œ๋“ ์ง€ ๋ฏธํ„ฐ๊ธฐ๋ฅผ ์ผœ์„œ ๋ˆ„์  ์†Œ๋น„๋Ÿ‰์ด ๋ช‡์‹œ์ธ์ง€ ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋””์ง€ํ„ธ ์ธํ„ฐํŽ˜์ด์Šค(RS232/RS485/Modbus/Zigbee)๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์ „๊ธฐ ๊ณ„๋Ÿ‰๊ธฐ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    ์„ค์ƒ๊ฐ€์ƒ์œผ๋กœ ์žฅ์น˜๊ฐ€ ์ผ๋ถ€ ์ˆœ๊ฐ„ ๋งค๊ฐœ๋ณ€์ˆ˜(์˜ˆ: ์ˆœ๊ฐ„ ์ „๋ ฅ ๋˜๋Š” ์ „๋ฅ˜)๋ฅผ ๋‹จ์ˆœํžˆ ์ธก์ •ํ•˜๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ X ์™€ํŠธ์‹œ ๋˜๋Š” ๋ฆฌํ„ฐ๋งˆ๋‹ค ํŽ„์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์–ด๋–ป๊ฒŒ ๋ฌด์—‡์„ ํ†ตํ•ฉํ•˜๊ณ  ์–ด๋””์— ๊ฐ€์น˜๋ฅผ ์ถ•์ ํ• ์ง€ ๊ณ ๋ฏผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ๋“  ๋‹ค์Œ ๋ณด๊ณ ์„œ๋ฅผ ๋†“์น  ์œ„ํ—˜์ด ์žˆ์œผ๋ฉฐ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์ •ํ™•์„ฑ์— ์˜๋ฌธ์ด ์ œ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด ๋ชจ๋“  ๊ฒƒ์„ ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์™€ ๊ฐ™์€ ์Šค๋งˆํŠธ ํ™ˆ ์‹œ์Šคํ…œ์— ๋งก๊ธธ ์ˆ˜ ์žˆ์ง€๋งŒ ์•„๋ฌด๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ•ญ๋ชฉ ์ˆ˜์— ๋Œ€ํ•œ ํฌ์ธํŠธ๋ฅผ ์ทจ์†Œํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ํด๋ง ์„ผ์„œ๋Š” 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๋Š” ๋‚ด๊ฐ€ ์–ป์€ ๋ฏธํ„ฐ์˜ ํ˜„์žฌ ๊ฐ’(๋ฆฌํ„ฐ)์ž…๋‹ˆ๋‹ค. ์ฒ ์—์„œ ์ง์ ‘ mqtt. ์„ค๊ณ„๋Š” 2๊ฐœ์˜ ์ƒˆ๋กœ์šด ์„ผ์„œ water_cold_hour_um ๋ฐ water_cold_day_um์„ ๋งŒ๋“ค์–ด ์‹œ๊ฐ„๋ณ„ ๋ฐ ์ผ๋ณ„ ํŒ๋…๊ฐ’์„ ๋ˆ„์ ํ•˜๊ณ  ์ผ์ • ๊ธฐ๊ฐ„ ํ›„์— XNUMX์œผ๋กœ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฐ˜๋‚˜์ ˆ ๋™์•ˆ์˜ ์‹œ๊ฐ„๋‹น ๋ฐฐํ„ฐ๋ฆฌ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.

์Šค๋งˆํŠธ ํ™ˆ: ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์—์„œ ๋ฌผ ๋ฐ ์ „๊ธฐ ์†Œ๋น„๋Ÿ‰ ์ฐจํŠธ

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์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฏธํ„ฐ๋Š” ๋˜ํ•œ ๊ธฐ๋ณธ์— ์ถ”๊ฐ€๋˜๋Š” ์ƒˆ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„๋ณ„/์ผ๋ณ„/์ฃผ๋ณ„/์›”๋ณ„ ํŒ๋…๊ฐ’์„ ์ˆ˜์ง‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์˜ˆ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ธ‰์ˆ˜๊ด€์— ๋Œ€ํ•ด ์ „๊ธฐ ๊ณ„๋Ÿ‰๊ธฐ ํŒฉ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ง€ ์•Š์ง€๋งŒ ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ๊ฐ€ ๋น„์•ฝ์ ์œผ๋กœ ์ปค์ง‘๋‹ˆ๋‹ค. ์ฃผ๊ฐ„ ๋ฐ ์›”๊ฐ„ ์ฐจํŠธ์˜ ๊ธฐ์ค€ ํฌ๊ธฐ๋ฅผ ์ถ”์ •ํ•˜๋Š” ๊ฒƒ๋„ ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ธก์ •๊ธฐ ์ž์ฒด๋กœ๋Š” ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. utility meter ํ”Œ๋กฏ์€ ๋งค์‹œ๊ฐ„ 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 - ์‹œ๊ฐ„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ •๋ ฌ๋œ ์—ด๋กœ ์ฐจํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • points_per_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 ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ฐ„๊ฒฉ์œผ๋กœ ์„ค์ •๋˜๊ณ  points_per_hour ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. points_per_hour๋Š” 1์‹œ๊ฐ„ ์ดํ•˜์˜ ์ฐจํŠธ์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋” ํฐ ๊ฐ„๊ฒฉ์—์„œ๋Š” ์—ญ๊ฒน๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•˜๋ฃจ์— ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์„ ์–ป์œผ๋ ค๋ฉด 24/0.04166666=XNUMX ๊ฐ’์„ ์ž…๋ ฅํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ๊ฐ„ ๋ฐ ์›”๊ฐ„ ์ฐจํŠธ์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ ‘๊ทผ๋ฒ• 2

์—ฌ์ „ํžˆ ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋™์•ˆ ๋‚˜๋Š” ๋‹ค์Œ ๋น„๋””์˜ค๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.


๋™์ง€๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ Xiaomi ์†Œ์ผ“์—์„œ ์†Œ๋น„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ์˜ ์ž‘์—…์€ ์กฐ๊ธˆ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜, ์–ด์ œ ๋ฐ ํ•ด๋‹น ์›”์˜ ์†Œ๋น„ ๊ฐ€์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฐจํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ˆœ๊ฐ„ ์ „๋ ฅ ๊ฐ’์˜ ์ˆ˜๋™ ํ†ตํ•ฉ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์€ ์ œ์ณ๋‘๊ณ  ์œ„์˜์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ "์ •ํ™•์„ฑ"์— ๋Œ€ํ•ด ์ด๋ฏธ ์ผ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋งค์žฅ์—์„œ ์ด๋ฏธ ์ˆ˜์ง‘ํ•œ ๋ˆ„์  ์†Œ๋น„ ๊ฐ€์น˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ฒ  ์กฐ๊ฐ ๋‚ด๋ถ€์˜ ํ†ตํ•ฉ์ด ๋” ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋น„๋””์˜ค์—์„œ ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ์ˆ˜๋™์œผ๋กœ ์†Œ๋น„๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋‚จ์ž์˜ ๊ฒฝ์šฐ ์˜ค๋Š˜๊ณผ ์–ด์ œ์˜ ๊ฐ’๋งŒ ๊ณ ๋ คํ•˜์ง€๋งŒ ๋” ๋‚˜์•„๊ฐ€ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•„์ž์˜ ๊ฒฝ์šฐ ์ œ์•ˆํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ๋ณธ์งˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํ˜„์žฌ ์นด์šดํ„ฐ ํŒ๋…๊ฐ’์„ ์“ธ ๋ณ€์ˆ˜ value_at_the_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

๋‘ ์ž๋™ํ™” ๋ชจ๋‘ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์‹œ์ž‘ ๊ฐ’๊ณผ ๋ ๊ฐ’์˜ ์ฐจ์ด๋กœ ๊ฐ„๊ฒฉ๋‹น ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ๊ฐ„๊ฒฉ์˜ ๊ธฐ์ค€ ๊ฐ’ ์—…๋ฐ์ดํŠธ

์ด ๊ฒฝ์šฐ ๊ทธ๋ž˜ํ”„ ๊ตฌ์„ฑ์€ ์ผ๋ฐ˜์ ์ธ ํžˆ์Šคํ† ๋ฆฌ ๊ทธ๋ž˜ํ”„๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

      - 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๋…„ ๋™์•ˆ ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ €๋Š” XNUMX๋…„์— XNUMX์ž…๋ฐฉ๋ฏธํ„ฐ์˜ ๋ฌผ์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— XNUMX๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์„ผ์„œ๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ๊ทธ ์ˆ˜์น˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์Œ๋ž€ํ•ด์ง‘๋‹ˆ๋‹ค.

์ ‘๊ทผ๋ฒ• 3

๋‹คํ–‰ํžˆ ๋˜‘๋˜‘ํ•œ ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฏธ InfluxDB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ํŠน๋ณ„ํžˆ ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ๋‹ค์–‘ํ•œ ์„ผ์„œ์˜ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์Šคํ…œ์€ ๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ’์„ ์ถ”์ถœํ•œ ๋‹ค์Œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š” SQL๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜จ๋„๋‚˜ ์Šต๋„์™€ ๊ฐ™์ด ์ž์ฃผ ๋ณ€ํ•˜๋Š” ํŒ๋…๊ฐ’์€ ๋‹จ XNUMX์ฃผ ๋™์•ˆ๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด ๋ฌผ ์†Œ๋น„๋Ÿ‰์˜ ์ผ์ผ ํŒ๋…๊ฐ’์€ XNUMX๋…„ ๋™์•ˆ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

InfluxDB ์™ธ์—๋„ ๋˜‘๋˜‘ํ•œ ์‚ฌ๋žŒ๋“ค์€ InfluxDB์˜ ๋ฐ์ดํ„ฐ์—์„œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฌ๋Š” ์‹œ์Šคํ…œ์ธ Grafana๋„ ๋ฐœ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. Grafana๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ณ  ์„ธ๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์ฐจํŠธ๋ฅผ lovelace-UI ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์— "์—ฐ๊ฒฐ"ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜๊ฐ์„ ๋ฐ›๋‹ค ์—ฌ๊ธฐ์— ะธ ์—ฌ๊ธฐ์—. ๊ธฐ์‚ฌ์—์„œ๋Š” InfluxDB์™€ Grafana๋ฅผ ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์— ์„ค์น˜ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋จผ์ € 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๋…„ ๋™์•ˆ, ์›”๋ณ„ ๋ฐ์ดํ„ฐ๋Š” ์ ˆ๋Œ€ ์‚ญ์ œ๋˜์ง€ ์•Š์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๋ณด์กด ์ •์ฑ…์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด ๋ช…๋ น:

  • homeassistant ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— cq_water_cold_hourly๋ผ๋Š” ์—ฐ์† ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ฟผ๋ฆฌ๋Š” ๋งค์‹œ๊ฐ„(time(1h)) ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ฟผ๋ฆฌ๋Š” ๋ƒ‰์ˆ˜ ๋ฐ ์˜จ์ˆ˜ ํŒ๋…๊ฐ’์„ ํฌํ•จํ•˜์—ฌ measurement'a homeassistant.autogen.l(๋ฆฌํ„ฐ)์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์ง‘๊ณ„๋œ ๋ฐ์ดํ„ฐ๋Š” entity_id๋กœ ๊ทธ๋ฃนํ™”๋˜์–ด ๋ƒ‰์ˆ˜ ๋ฐ ์˜จ์ˆ˜์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌํ„ฐ ์นด์šดํ„ฐ๋Š” ๋งค ์‹œ๊ฐ„๋งˆ๋‹ค ๋‹จ์กฐ๋กญ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ์‹œํ€€์Šค์ด๋ฏ€๋กœ ์ตœ๋Œ€๊ฐ’์„ ์ทจํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ง‘๊ณ„๋Š” max(value) ํ•จ์ˆ˜๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ ๊ฐ’์€ homeassistant.month.water_meter_hour์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Month๋Š” ๋ณด์กด ๊ธฐ๊ฐ„์ด XNUMX๊ฐœ์›”์ธ ๋ณด์กด ์ •์ฑ…์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ƒ‰์ˆ˜ ๋ฐ ์˜จ์ˆ˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ’ ํ•„๋“œ์˜ ํ•ด๋‹น ์—”ํ„ฐํ‹ฐ_id ๋ฐ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ„๋„์˜ ๋ ˆ์ฝ”๋“œ๋กœ ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

๋ฐค์ด๋‚˜ ์ง‘์— ์‚ฌ๋žŒ์ด ์—†์„ ๋•Œ๋Š” ๋ฌผ ์†Œ๋น„๊ฐ€ ์—†์œผ๋ฏ€๋กœ homeassistant.autogen.l์—๋„ ์ƒˆ๋กœ์šด ๊ธฐ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์ฟผ๋ฆฌ์—์„œ ๊ฐ’์ด ๋ˆ„๋ฝ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด fill(์ด์ „)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 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์‹œ ์‚ฌ์ด์—๋Š” ๋‹จ์ˆœํžˆ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์—ฐ์† ์ฟผ๋ฆฌ์˜ ํŠน์ง•์ž…๋‹ˆ๋‹ค.

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ง‘๊ณ„๋œ ๊ฐ’๋„ ๋‹จ์กฐ๋กญ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ์‹œํ€€์Šค์ด๋ฉฐ ํ•ญ๋ชฉ๋งŒ ๋นˆ๋„๊ฐ€ ๋‚ฎ์Šต๋‹ˆ๋‹ค(ํ•œ ์‹œ๊ฐ„์— ํ•œ ๋ฒˆ). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐจํŠธ์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ง€๋‚œ ๋‚ (time >= now() -24h)์˜ entity_id='water_meter_cold' ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด homeassistant.month.water_meter_hour ์‹œํ€€์Šค์—์„œ ์ผ๋ถ€ ํ•ญ๋ชฉ์ด ๋ˆ„๋ฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GROUP BY ์‹œ๊ฐ„(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๋ฅผ ์—ด๊ณ  ์ผ๋ถ€ ๊ธฐ์กด(๋˜๋Š” ์ƒˆ ๋Œ€์‹œ๋ณด๋“œ ์ƒ์„ฑ) ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์—ด๊ณ  ์ƒˆ ํŒจ๋„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฐจํŠธ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Šค๋งˆํŠธ ํ™ˆ: ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์—์„œ ๋ฌผ ๋ฐ ์ „๊ธฐ ์†Œ๋น„๋Ÿ‰ ์ฐจํŠธ

๊ฐ™์€ ๊ทธ๋ž˜ํ”„์— ๋ƒ‰์˜จ์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ๊ณ„๋‹จ(๊ณ„๋‹จ)์œผ๋กœ ๊ฐ€๋Š” ์„ (์„ )์ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šคํƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์— ๋ช‡ ๊ฐ€์ง€ ํ‘œ์‹œ ์˜ต์…˜์ด ๋” ์žˆ์ง€๋งŒ ๊ทธ๋‹ค์ง€ ํฅ๋ฏธ๋กญ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์Šค๋งˆํŠธ ํ™ˆ: ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์—์„œ ๋ฌผ ๋ฐ ์ „๊ธฐ ์†Œ๋น„๋Ÿ‰ ์ฐจํŠธ

๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„๋ฅผ ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฐจํŠธ ํŽธ์ง‘ ๋ชจ๋“œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์ฐจํŠธ ๊ณต์œ  ์„ค์ •์€ ๋Œ€์‹œ๋ณด๋“œ ํŽ˜์ด์ง€์—์„œ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ฐจํŠธ ์ด๋ฆ„ ์˜†์— ์žˆ๋Š” ์‚ผ๊ฐํ˜•์„ ํด๋ฆญํ•˜๊ณ  ๋ฉ”๋‰ด์—์„œ ๊ณต์œ ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์—ด๋ฆฌ๋Š” ์ฐฝ์—์„œ ํผ๊ฐ€๊ธฐ ํƒญ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์‹œ๊ฐ„ ๋ฒ”์œ„ ์„ ํƒ ์ทจ์†Œ - 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์ผ ๋™์•ˆ ๋œจ๊ฑฐ์šด ๋ฌผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ์ฐฌ๋ฌผ ๊ทธ๋ž˜ํ”„๋งŒ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.

์Šค๋งˆํŠธ ํ™ˆ: ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์—์„œ ๋ฌผ ๋ฐ ์ „๊ธฐ ์†Œ๋น„๋Ÿ‰ ์ฐจํŠธ

๋‚˜๋Š” ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ฐจํŠธ, ์Šคํ… ๋ผ์ธ ๋˜๋Š” ์‹ค์ œ ๋ง‰๋Œ€๋ฅผ ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜๋Š” ๋‹จ์ˆœํžˆ ์ผ์ผ ์†Œ๋น„ ์ผ์ •์˜ ์˜ˆ๋ฅผ ์ œ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋ฐ”๋กœ ๋ฐ”์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์‹œ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Šค๋งˆํŠธ ํ™ˆ: ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์—์„œ ๋ฌผ ๋ฐ ์ „๊ธฐ ์†Œ๋น„๋Ÿ‰ ์ฐจํŠธ

์ด ์ฐจํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Šค๋งˆํŠธ ํ™ˆ: ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ์—์„œ ๋ฌผ ๋ฐ ์ „๊ธฐ ์†Œ๋น„๋Ÿ‰ ์ฐจํŠธ

๋”ฐ๋ผ์„œ Stack ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด. ์ด ๊ทธ๋ž˜ํ”„์—์„œ๋Š” ๋ƒ‰์ˆ˜ ๋ง‰๋Œ€๊ฐ€ ๋œจ๊ฑฐ์šด ๋ง‰๋Œ€ ์œ„์— ๊ทธ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋†’์ด๋Š” ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ƒ‰์ˆ˜ ๋ฐ ์˜จ์ˆ˜์˜ ์ด ์†Œ๋น„๋Ÿ‰์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์‹œ๋œ ๋ชจ๋“  ๊ทธ๋ž˜ํ”„๋Š” ๋™์ ์ž…๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์ง€์  ์œ„๋กœ ๋งˆ์šฐ์Šค๋ฅผ ์ด๋™ํ•˜๋ฉด ํŠน์ • ์ง€์ ์˜ ์„ธ๋ถ€ ์ •๋ณด์™€ ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์—ฐ๊ณ ์—๋Š” ํŒŒ๋ฆฌ ๋‘ ๋งˆ๋ฆฌ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ง‰๋Œ€ ์ฐจํŠธ์—์„œ๋Š”(๊ณ„๋‹จ์„ ์ด ์žˆ๋Š” ์ฐจํŠธ์™€ ๋‹ฌ๋ฆฌ) ๋ง‰๋Œ€์˜ ์ค‘์•™์ด ์ •์ค‘์•™์— ์žˆ์ง€ ์•Š๊ณ  00:00์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๊ฒƒ๋“ค. ์—ด์˜ ์™ผ์ชฝ ์ ˆ๋ฐ˜์ด ์ „๋‚  ๋Œ€์‹  ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ† ์š”์ผ๊ณผ ์ผ์š”์ผ์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”„๋Š” ํ‘ธ๋ฅธ์ƒ‰ ์˜์—ญ์˜ ์•ฝ๊ฐ„ ์™ผ์ชฝ์— ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์ด๊ธธ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ๋•Œ๊นŒ์ง€.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋งค์›” ๊ฐ„๊ฒฉ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค์€ ์‹œ๊ฐ„/์ผ/์ฃผ์˜ ๊ธธ์ด๋Š” ๊ณ ์ •๋˜์–ด ์žˆ์ง€๋งŒ ํ•œ ๋‹ฌ์˜ ๊ธธ์ด๋Š” ๋งค๋ฒˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. InfluxDB๋Š” ๋™์ผํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ๋งŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด ๋‘๋‡Œ๋Š” 30์ผ์ด๋ผ๋Š” ๊ณ ์ •๋œ ๊ฐ„๊ฒฉ์„ ์„ค์ •ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ฐจํŠธ๋Š” XNUMX๋…„ ๋™์•ˆ ์•ฝ๊ฐ„ ๋– ๋‹ค๋‹ˆ๋ฉฐ ๋ง‰๋Œ€๋Š” ์›”๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋””์Šคํ”Œ๋ ˆ์ด ๋ฏธํ„ฐ๋กœ์„œ ๋‚˜์—๊ฒŒ ํฅ๋ฏธ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์œผ๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ ์–ด๋„ ๋‘ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์›”๊ฐ„ ์ฐจํŠธ์—์„œ ์ ์ˆ˜๋ฅผ ๋งค๊ธฐ๊ณ  ์ž์‹ ์„ ์ฃผ๊ฐ„ ์ฐจํŠธ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. 52๋…„์— XNUMX๊ฐœ์˜ ์œ„ํด๋ฆฌ ๋ฐ”๊ฐ€ ๊ฝค ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ์›”๊ฐ„ ์†Œ๋น„๋Ÿ‰ ์ž์ฒด๋ฅผ ๋ฐฉ๋ฒ• 2๋ฒˆ์œผ๋กœ ์ƒ๊ฐํ•˜์‹œ๊ณ , ๊ทธ๋ผํŒŒ๋‚˜๋Š” ์•„๋ฆ„๋‹ค์šด ๊ทธ๋ž˜ํ”„๋งŒ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ฝค ์ •ํ™•ํ•œ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค. ๋น„๊ต๋ฅผ ์œ„ํ•ด ์ง€๋‚œ ํ•ด์˜ ์ฐจํŠธ๋ฅผ ์˜ค๋ฒ„๋ ˆ์ดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. grafana๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ฐจํŠธ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ธ์ƒ์ด ํ•œ์ฐฝ์ด๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ๋ณ€ํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์–ด์ œ๋Š” ๋งŽ์•˜๊ณ  ์˜ค๋Š˜์€ ์ ์—ˆ๊ณ  ๋‚ด์ผ์€ ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†Œ๋น„ ์ฃผ์ œ์— ๋Œ€ํ•ด ๊ฐ€์ •๊ณผ ํ˜‘๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ์˜ ์‹์š•์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฒ•์•ˆ์˜ ํฌ๊ณ  ์ดํ•ดํ•  ์ˆ˜์—†๋Š” ์ˆ˜์น˜๋Š” ์ด๋ฏธ ์ƒ๋‹นํžˆ ์ดํ•ดํ•  ์ˆ˜์žˆ๋Š” ์†Œ๋น„ ๊ทธ๋ฆผ์œผ๋กœ ๋ฐ”๋€Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฑฐ์˜ 20๋…„์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๊ฒฝ๋ ฅ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‚˜๋Š” ์‚ฌ์‹ค์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ต์ฐจํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋‚œํ•ดํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ์ผ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋‹ค ์œ„์˜ ๊ธฐ์‚ฌ -์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์กฐ์ด๋Š” ๊ฒƒ์ด ๋ช‡ ๋ฒˆ์˜ ํด๋ฆญ๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ ํŠน์ˆ˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”Œ๋กœํŒ… ์ž‘์—…์ด ์กฐ๊ธˆ ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

์ œ๋ชฉ์—์„œ ์ „๊ธฐ ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ ํ˜„์žฌ ๊ทธ๋ž˜ํ”„๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ SDM120 ๋ฏธํ„ฐ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Modbus๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ๋•Œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ด ๊ธฐ์‚ฌ์˜ ์ฃผ์ œ์— ์–ด๋–ค ์‹์œผ๋กœ๋“  ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„๋Š” ๋ฌผ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๋‚ด๊ฐ€ ์ง์ ‘ ์‹œ๋„ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋‚ด๊ฐ€ ๋ชจ๋ฅด๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ์‹œ๊ฐํ™”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜๊ฒฌ์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฑด์„ค์ ์ธ ๋น„ํŒ๊ณผ ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด์— ๊ธฐ๋ปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์ž๋ฃŒ๊ฐ€ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€