본문 바로가기

SmartHome. IoT/SmartHome 응용

HA 사용시 db용량 다이어트 하기, Recorder / History / Logbook 에 관하여..

728x90
반응형

안녕하세요~ 레이군 입니다.

오늘은 HomeAssistant를 사용하면서 만나게 되는, 여러 장치 동작의 기록에 관한 내용을 알아볼까 합니다.

스마트홈을 구성하다 보면 여러가지 데이터가 쌓이게 됩니다.

온/습도 같은걸 모니터링 할수도 있고, co2 라던지 전력량 같은것도 체크하게 되죠.

이런 데이터들은 휘발성이 아니라 저장이 되는데요, HA에서는 이런 것들을 관리하는게 recorder 구성요소 입니다.

이 부분은 따로 건드리지 않았다면 HA에 있는 모든 내용을 기록하게 됩니다.

그리고 모든 내용이라 함은, 정말 어마어마한 양의 정보들이 기록된다는 의미 이기도 합니다.

그래서 사용하다 보면, DB파일의 용량이 너무 커져서 HA가 느려지는 현상을 경험하게 되기도 하고

어쩌면 디스크 용량의 부족으로 인해 문제가 발생할수도 있습니다.

DB파일 용량은 다음에서 확인할 수 있습니다.(core 2023.2 버전 입니다)

설정-시스템-해결하기-3점-시스템 정보-Recorder 의 예상 데이터베이스 크기

저는 현재 1.4GB정도 나오네요..

큰 분들은 10기가 넘는 용량을 사용하기도 합니다.

이러면 데이터를 불러오는 시간도 오래 걸릴꺼고, 자동백업을 할때의 시간과 차지하는 용량도 커질겁니다.

이렇게 데이터가 많이 쌓이는 이유는 무엇일까요?

최종적으로 쌓이는 데이터가 많아지는 요인은 2가지 입니다.

종류가 많거나, 기간이 길거나... 물론 둘 다 해당한다면 어마어마 하겠죠...?

기간

이 조건 중 기간의 경우, 보통은 문제되지 않습니다.

db에 쌓이는 정보는 recorder라는 설정값을 기준으로 하는데,

현 시점의 HA는 recorder 항목의 기본설정으로 auto_purge가 활성화 되어 있고

keep_purge_days는 기본값이 10 이므로 10일이 지난 데이터는 자동으로 삭제됩니다.​

즉, HA를 깔고 그냥 쓰고 있다면, 모든 데이터는 10일치만 기록된다 라고 보시면 됩니다.

어떤 장치의 히스토리를 봤는데, 10일 이전의 데이터가 보인다?

그러면 recorder 컴포넌트를 설정하면서 날짜를 건드렸거나 auto_purge를 꺼둔것일 수 있으니

이 항목들을 한번 체크해 보세요

종류

자... 이제 진짜 문제 입니다.

바로 기록되는 종류(숫자) 인데요..

저는 초보자라 장치도 얼마 없고 해서 별로 안 올라오겠죠...? 라고 생각하신다면, 오산입니다.

개발자도구 - 이벤트 항목으로 이동하신 다음,

이벤트 내용 들어보기 쪽에 state_changed 를 입력하고 청취 시작을 눌러보세요.

뭔가...호로로로로록 하는게 보이실겁니다.(연결된 기기에 따라 다를 수 있습니다)

이 내용들은 state_changed, 즉 설정된 entity_id의 변화값을 모니터링 하는건데요

이 정보들이 recorder에 기록되게 됩니다.

5분 이상 긴 시간을 지켜봐야 확실하지만, 위 움짤은 대충 10초에 100개 정도의 데이터가 올라왔네요..

장치가 10개 있고, 그 장치들이 10초에 1번 업데이트 된다면, 1분동안 총 60개의 업데이트가 기록되겠죠.

하지만, 어떤 장치는 하나를 설치하면 여러개의 센서가 같이 들어오기도 합니다.

가령 스마트플러그의 경우, on/off 제어를 하는 switch 뿐만 아니라 전압, 전류, 전력량, 에너지사용량 등

더욱 다양한 센서들이 생성됩니다.

물론 이것들은 변동사항이 있을때만 업데이트가 되고 저장이 되긴 합니다만...

장치에 따라서는 보고 주기가 1초일수도 있고, 5초나 10초일수도 있고...

이런게 기본값인 10일동안, 864,000초 동안 얼마나 쌓이게 될까요...?

거기다 장치들 중엔 uptime 이라던지 wifi신호강도 라던지 그런것까지 표시하기도 합니다.

이런 데이터는... 글세요 저는 안 쓰거든요? 그러므로 저에겐 불필요한 데이터가 쌓이는건데요...

자기가 안 쓸것같은 데이터를 저장하지 않는것만 으로도 많은 공간을 절약할 수 있습니다.

이제부터 쌓이는 데이터를 줄여보겠습니다.

Recorder 설정

Recorder는 HA에서 일어나는 일들을 저장하는 역할을 합니다.

configuration.yaml 파일에서 설정할 수 있는 항목이며, 따로 설정하지 않아도 이미 동작중 입니다.

https://www.home-assistant.io/integrations/recorder

Recorder

Instructions on how to configure the data recorder for Home Assistant.

www.home-assistant.io

해당 항목의 자세한 내용은 위 공홈 링크를 참조해 주세요.

본 글에서는 DB종류를 바꾸는 등 다른 작업은 제외하도록 하겠습니다.

Recorder 설정은 크게 3가지로 나눌 수 있습니다.

기본적인 동작 방식을 설정하는 부분과 / 제외할 내용 / 포함시킬 내용 입니다.

기본 동작쪽에 설정할게 여럿 있지만, 사실상 건드릴건 1개 뿐입니다.

나머지는 기본설정 그대로 두시면 되어서 딱히 건드릴 이유가 없더라구요.

purge_keep_days 항목인데요, 저장된 데이터의 유지 기간을 결정합니다.

기본값은 10으로, 10일치 데이터가 쌓이게 되고 날짜가 넘어가면 가장 오래된 1일치 데이터가 삭제됩니다.

삭제 단위는 날짜는 아니고 시간단위 정도로 보이네요... 10일치 = 240시간치 데이터가 쌓이는거죠.

제외할 내용(exclude) / 포함시킬 내용(include) 부분이 recorder 설정에서 가장 중요한 부분 이라고 생각하고

가장 복잡한 부분이기도 합니다.

exclude(제외)

Exclude 는 총 4가지 설정이 존재합니다.

만약 include 없이 exclude만으로 구성한다면, 지정된 항목을 제외하고 나머지는 전부 기록됩니다.

domains

도메인 항목은 HA 구성에서 가장 큰 단위로 제외를 설정할 수 있습니다.

- switch 를 넣으면, switch.xxx switch.yyy 등 switch 도메인의 모든 항목이 기록되지 않습니다.

- sensor 도 마찬가지로 각종 센서들을 다 제외하겠죠.

도메인 항목은 너무 큰 단위라서, 보통은 잘 안쓸듯 합니다. 저도 따로 설정되어 있는건 없네요...

entity_globs

글로브는 프로그래밍에 사용하는 형태라고 하는데요... 와일드카드로 여러가지를 지정할때 사용합니다.

와일드카드는 * 로 표시하고, 해당 항목은 무엇으로든 대체가 가능합니다. 일종의 조커카드 같은거죠.

- sensor.*wifi* 이라고 지정하면, sensor.ray_wifi_signal, sensor.aa123wifisignal 이라던지

sensor. 으로 시작해서 중간에 wifi가 들어가는 모든 entity를 제외하게 됩니다.

전 주로 제가 잘 안보는 히스토리를 가진 센서들을 여기에 넣습니다.

sensor.*uptime* 이라던가, sensor.*_voltage 라던가, sensor.*_linkquality 같은거요.

entities list

엔티티 리스트는 말 그대로 제외할 엔티티를 하나하나 설정하는겁니다.

가장 작은 단위인 만큼 세밀한 제외가 가능하지만, 한개씩만 적용되니...숫자가 많아지면 좀 귀찮아 질거예요

event_types

이벤트 타입은, HA에서 발생하는 여러 이벤트 들중 제외할걸 설정할 수 있습니다.

call_service 를 넣으면, 각종 액션등에서 발생하는 call_service 항목에 대한 내용을 기록하지 않게 되는거죠

event_types 항목은 include에는 존재하지 않으므로, 오직 exclude(제외) 하는것만 가능합니다.

include(포함)

Include 항목은 3개의 설정이 존재합니다.

exclude 없이 include만 구성한다면, 지정된 항목 만 기록됩니다.(나머지 전부 기록 x)

domains, entity_globs, entities list

전부 exclude 항목과 동일한 설정방법을 가집니다.

exclude, include 의 설정(필터 설정)

이제 가장 복잡한걸 해봅시다.

제외하는것과 포함하는것에 여러가지 방법이 있다는건, 이것들이 동시에 사용될 수 있다는 의미이죠.

그러면 어떤식으로 사용되는지에 따라 제외되고, 포함되는 항목이 달라지게 됩니다.

우선 기본적인 순서는 다음과 같습니다.

include -> exclude

entites -> entity_globs -> domains

동일한 조건이 상충할때, 포함되는게 우선으로 동작됩니다.

그리고 entites에 지정된게 가장 우선이 되고, 이후에 entity_globs, 마지막으로 domains를 체크합니다.

아래 내용은 공홈의 필터관련 내용 입니다.(오역이 있을 수 있습니다)

1. 필터가 없는경우

- 모든 내용을 포함

2. include만 있는 경우

- entites에 지정된 내용 : 포함

- 그외, domains에 지정된 내용 : 포함

- 그외, entity_glob에 지정된 내용 : 포함

- 그외 : 제외

3. exclude만 있는 경우

- entites에 지정된 내용 : 제외

- 그외, domains에 지정된 내용 : 제외

- 그외, entity_glob에 지정된 내용 : 제외

- 그외 : 포함

4. include 항목에 domain, entity_globs 등의 항목이 있을 때(일부 exclude 항목 지정)

- include 항목의 entites에 지정된 내용 : 포함

- 그외, exclude 항목의 entites에 지정된 내용 : 제외

- 그외, include 항목의 entity_globs에 지정된 내용 : 포함

- 그외, exclude 항목의 entity_globs에 지정된 내용 : 제외

- 그외, include 항목의 domains 에 지정된 내용 : 포함

5. exclude 항목에 domain, entity_glos 등의 항목이 있을 때(include는 entites만 지정되었을때)

- include 항목의 entites에 지정된 내용 : 포함

- 그외, exclude 항목의 entites에 지정된 내용 : 제외

- 그외, exclude 항목의 entity_globs에 지정된 내용 : 제외

- 그외, exclude 항목의 domains 에 지정된 내용 : 제외

- 그외 : 포함

6. domain, entity_glos 항목이 incluse 또는 exclude에 지정되지 않았을때

- include 항목의 entites에 지정된 내용 : 포함

- 그외 : 제외

exclude, include 설정 예시

언제나 그럿듯, 설명만 들으면 뭐가 뭔지 모르겠죠....?

그렇다면 이제 예시를 들어보도록 하겠습니다.

본 내용은 표를 사용해서 옆으로 길 수 있으므로, 모바일 에서는 보기 어려울 수 있으니

가능하면 PC버전에서 확인 부탁드립니다.

entity_list
exclude
domain
entity_globs
entites
switch
sensor.*uptime
sensor.ray_temp
sensor.ray_temp
sensor.ray_temp
sensor.ray_temp
sensor.ray_humidi
sensor.ray_humidi
sensor.ray_humidi
sensor.ray_humidi
sensor.living_temp
sensor.ray_uptime
sensor.ray_uptime
sensor.living_temp
sensor.living_humidi
sensor.living_temp
sensor.living_temp
sensor.living_humidi
sensor.bed_humidi
sensor.living_humidi
sensor.living_humidi
sensor.bed_humidi
sensor.bed_uptime
sensor.living_uptime
sensor.living_uptime
sensor.bed_uptime
weather.naver
sensor.bed_temp
sensor.bed_temp
weather.naver
 
sensor.bed_humidi
sensor.bed_humidi
 
 
sensor.bed_uptime
sensor.bed_uptime
 
 
switch.living
weather.naver
 
 
switch.bedroom
 
 
 
switch.test
 
 
 
weather.naver
 
 
 

exclude로 domains 항목에 switch를 넣으면, switch 로 시작하는 모든 항목이 제외되고

그 상태로 entity_globs에 sensor.*uptime 를 지정하면, sensor. 으로 시작해서 uptime 으로 끝나는 모든게 제외됩니다.

entites 항목에 sensor.ray_temp 를 넣으면, 하나의 항목만 제외가 되는거죠.

이렇게 필터를 정하면, 총 13개의 entity_id 중 6개만 recorder에 기록이 되는거죠.

만약 이 외에 automation이나 script 같은 다른 domais 가 있다면, 그건 제외 항목 어디에도 포함되지 않으니

전부 기록이 될겁니다.

제외는, '지정된 것 빼고 나머지 모두 기록' 입니다.

이제 include를 살펴봅시다.

entity_list
include
domains
entity_globs
entites
switch
sensor.*temp
sensor.living_humidi
sensor.ray_temp
switch.living
sensor.ray_temp
sensor.ray_temp
sensor.ray_humidi
switch.bedroom
sensor.living_temp
sensor.living_temp
sensor.ray_uptime
switch.test
sensor.bed_temp
sensor.living_humidi
sensor.living_temp
 
switch.living
sensor.bed_temp
sensor.living_humidi
 
switch.bedroom
switch.living
sensor.living_uptime
 
switch.test
switch.bedroom
sensor.bed_temp
 
 
switch.test
sensor.bed_humidi
 
 
 
sensor.bed_uptime
 
 
 
switch.living
 
 
 
switch.bedroom
 
 
 
switch.test
 
 
 
weather.naver
 
 
 

exclude로 domains 항목에 switch를 넣으면, switch 로 시작하는 항목 만 기록합니다.

그 상태로 entity_globs에 sensor.*temp 를 지정하면, sensor. 으로 시작해서 temp 으로 끝나는 항목을 포함합니다.

entites 항목에 sensor.living_humidi 를 넣으면, 하나의 항목만 포함이 되는거죠.

이렇게 필터를 정하면, 총 13개의 entity_id 중 7개만 recorder에 기록이 되는거죠.

만약 이 외에 automation이나 script 같은 다른 domais 가 있다면, 그건 기록되지 않습니다.

포함은, '지정된 것 만 기록' 입니다.

이제 좀 더 복잡하게 exclude와 include를 섞어볼까요?

entity_list
exclude
include
domain
entity_globs
entites
sensor
sensor.*temp
sensor.bed_humidi
sensor.ray_temp
switch.living
sensor.ray_temp
sensor.ray_temp
sensor.ray_humidi
switch.bedroom
sensor.living_temp
sensor.living_temp
sensor.ray_uptime
switch.test
sensor.bed_temp
sensor.bed_temp
sensor.living_temp
weather.naver
switch.living
sensor.bed_humidi
sensor.living_humidi
 
switch.bedroom
switch.living
sensor.living_uptime
 
switch.test
switch.bedroom
sensor.bed_temp
 
weather.naver
switch.test
sensor.bed_humidi
 
 
weather.naver
sensor.bed_uptime
 
 
 
switch.living
 
 
 
switch.bedroom
 
 
 
switch.test
 
 
 
weather.naver
 
 
 

이번엔 exclude에 domain 으로 sensor를 넣었습니다. 당연히 이상태면 sensor로 표시되는 모든게 제외됩니다.

하지만 include에 지정된 항목은 exclude보다 우선하므로, entity_globs로 sensor.*temp 를 지정하면

sensor.ray_temp, sensor.living_temp 등 sensor.으로 시작해서 temp로 끝나는 항목들을 포함합니다.

그리고 entites 항목으로 그 sensor.bed_humidi 항목을 지정해서 그것까지 포함이 되게 되었습니다.

entity_globs 항목이 exclude와 include 모두 존재하면 어떻게 될까요?

entity_list
exclude
include
entity_globs
entity_globs
entites
*bed*
sensor.*temp
sensor.*humidi
switch.bedroom
sensor.ray_temp
sensor.ray_temp
sensor.ray_temp
sensor.ray_temp
sensor.ray_humidi
sensor.ray_humidi
sensor.ray_humidi
sensor.ray_humidi
sensor.ray_uptime
sensor.ray_uptime
sensor.ray_uptime
sensor.ray_uptime
sensor.living_temp
sensor.living_temp
sensor.living_temp
sensor.living_temp
sensor.living_humidi
sensor.living_humidi
sensor.living_humidi
sensor.living_humidi
sensor.living_uptime
sensor.living_uptime
sensor.living_uptime
sensor.living_uptime
sensor.bed_temp
switch.living
sensor.bed_temp
sensor.bed_temp
sensor.bed_humidi
switch.test
sensor.bed_humidi
sensor.bed_humidi
sensor.bed_uptime
weather.naver
switch.living
switch.living
switch.living
 
switch.test
switch.bedroom
switch.bedroom
 
weather.naver
switch.test
switch.test
 
weather.naver
weather.naver
 
 

이번엔 exclude 의 entity_globs 항목으로 *bed* 을 넣어봤습니다.

그러면 sensor.bed_temp, sensor.bed_humidi, sensor.bed_uptime 그리고 switch.bed 까지 비활성화 됩니다.

그 상태로 include항목의 entity_globs는 sensor.*temp와 sensor.*humidi 를 넣어봤습니다.

그러면 제외되었던 sensor.bed_temp와 sensor.bed_humidi 가 포함되게 됩니다.

이후 eneites 항목으로 switch.bedroom 을 넣으면, 해당 항목도 포함되게 되죠.

위 예시는 제외하고 -> 포함하는 순서로 설명을 드렸습니다.

공홈 내용은 반대로 포함하고, 나머지에서 제외 형태로 설명을 하고 있습니다.

어느쪽이던 편한 형태로 이해하시면 되고, 결론은 똑같습니다.

기억할것은, 단위가 작을수록 영량력이 강하고, 제외보다 포함이 강합니다.

그래서 include - entites 항목이 무조건 최 우선(여기에 포함되면 무조건 포함) 이고

exclude - domains 항목이 가장 하위로 동작합니다.

제외할게 많다면 제외 위주로 구성을 하면 되고, 해당 항목에 포함될게 많다면 포함 위주로 구성하시면 됩니다.

저같은 경우는 exclude 위주로 구성해서 뺄것만 빼주는 형태로 구성되어 있습니다.

recorder:
  purge_keep_days: 10
  include:
    entities:
      - sensor.ray_wifi_connection
  exclude:
    entity_globs:
      - sensor.*_linkquality
      - sensor.socket_*_current
      - binary_sensor.*_update_*
      - sensor.*_update_*
      - sensor.*uptim*
      - sensor.*wifi*
      - sensor.*_voltage
      - sensor.dw*
      - sensor.naver*
      - weather.damda*
    domains:
      - group
    entities:
      - binary_sensor.camera_living_motion_detected
      - binary_sensor.camera_entrance_motion_detected
      - sensor.date_time
      - sensor.time

자 여기까지가 recorder의 설정에 관련된 내용 입니다.

적용은 각자의 몫이니.....힘내세요...?

recorder

recorder는 HA의 데이터 입니다. 이걸 어떻게 쌓을지 결정하는게 지금까지 설명한 내용이구요.

여기 쌓이는 데이터는 표시하는것과 관계 없이, 그냥 DB에 쌓이기만 하는거예요.

이걸 표시하려면, 별도로 다른 곳에서 지정을 해줘야 합니다.

history, logbook

히스토리와 로그북은 나눠서 설명설명하기 애매해서 합쳤습니다.

https://www.home-assistant.io/integrations/history

위 링크는 히스토리 관련 문서이고

https://www.home-assistant.io/integrations/logbook

이건 로그북 관련 입니다.

이걸 따로 설명하지 않고 합쳐둔건...

위 화면처럼, 동시에 보이는 경우가 많기 때문입니다.

History(기록 그래프)

히스토리는, 해당 구성요소의 상태 변화를 기록합니다.

온도계 라면 온도의 오르내림을 기록하고, 스위치나 라이트 라면 켜지고/꺼짐을 기록합니다.

기록그래프 상에서 바 형태 혹은 그래프 형태를 가지는게 히스토리 항목이며,

위 링크에서 확인할 수 있는것 처럼 exclude와 include를 활용해 표시할 항목을 지정할 수 있습니다.

단, recorder에 기록이 되는 항목에 한해서만 가능합니다.

recorder(기록) -> history(불러오기) 라고 생각하시면 됩니다.

Logbook(로그북)

로그북은, 해당 구성요소의 상태 변화의 요인을 기록합니다.

꺼지고/켜지면 그 이유가 있겠죠?

스위치 라면 물리적인 버튼을 눌렀을수도 있고, HA의 대시보드에서 껐을수도 있고, 자동화로 껐을수도 있고..

아니면 구글홈에 연동시켜서 구글한테 끄라고 시켰을수도 있구요.

이런 항목들을 기록합니다.

위 내용을 보면, 13시간전에 거실 등 제어 켜기 라는 자동화로 mqtt토픽을 받아서 켜졌고

8시간 전엔 전등끄기 라는 자동화가 트리거 되며 꺼졌고

5시간 전엔 웰컴 라이트 라는 자동화가 트리거 되어 켜졌습니다. 트리거 포인트는 door door state의 변화네요.

8시간전껀 왜 트리거 포인트가 안 나오는지 모르겠지만, 해당 자동화에 들어가서 기록보기를 하면 보이겠죠?

로그북 항목도 마찬가지로 exclude와 include를 지정할 수 있고, recorder에 기록된 항목만 표시됩니다.

HA는 우리가 생각하는것 보다 정말 어마어마한 정보들이 생성되고, 그걸 다루고 있습니다.

그렇기 때문에 사용자가 사용하지 않는 데이터도 쌓이고, 그러다 보면 의도치 않게 많은 용량을 차지하게 되고

그로인해 여러가지 문제(용량부족, 속도 저하)의 발생이 가능합니다.

esphome에 주로 쓰이는 uptime 이나 wifi signal 같은 경우, 유지보수의 목적이 아니라 실사용 목적이라면

사실상 한번도 안 들어가 보는 항목이기도 하거든요.

DB다이어트는 빠릿한 HA를 만드는데 큰 도움을 줍니다. 차근차근 공부해서 도전해 보세요~

오늘 내용은 여기까지!

다음에 또 재미난거 들고 올게요~

728x90
반응형