안녕하세요? 레이군 입니다.
이번에 작성해볼건, HA에 있는 수많은 데이터들을 파일로 만드는 방법 입니다.
물론 기본적으로 쌓이는 DB를 분석하는것도 방법이지만, 이건...제가 실력이 딸려서...
거기다 몇주 이내의 데이터라면 모를까, 월 단위의 데이터를 분석하기엔 양이 너무 많더라구요.
(월 단위의 DB를 그대로 두면 로딩시간도 문제구요)
일단 제가 원하는 건 다음과 같습니다.
특정 센서 몇몇에서 올라오는 데이터를 수집하여 파일로 만든다.
월 단위 이상의 기록을 분석하기 위하여 날짜/시간/센서데이터가 포함되어야 함
이걸 시작한 목적은...
실외온도, 실내온도, 실내습도, 에어컨 전력소모량 을 종합적으로 측정하여
가동시간에 따른 실내 온습도 변화 및 전력소모량을 분석하는것 입니다.
물론 특정 데이터를 DB가 아닌 별도 파일로의 영구백업등을 목적으로 할수도 있습니다~
일단 제가 원하는걸 진행해 보려고 합니다.
제가 원하는 데이터는 총 5가지(날짜/시간, 실외온도, 실내온도, 실내습도, 전력소모량) 입니다.
이 데이터를 생성하기 위해 필요한건 특정 states 인데요, 저는 모두 센서로 만들어서 진행하려 합니다.
일단 날짜/시간 부분은 별도 생성이 필요 없고, 실외온도 부분은 darksky 컴포넌트를 sensor 로 만들어서 쓰려고 합니다.
sensor:
- platform: darksky # 변경 x
api_key: api_key
monitored_conditions:
- apparent_temperature
이런식으로 configuration.yaml 에 넣어주시거나,
sensor: !include sensors.yaml
형식으로 넣어주신 경우는 sensors.yaml 파일에 직접 넣어주시면 됩니다.
여러 센서를 만들 수 있지만, 제가 원하는 부분은 딱 현재 날씨이므로 - apparent_temperature 만 넣겠습니다.
다음은 실내 온도 / 습도 부분인데 이건 일반적인 온습도 센서 데이터를 그대로 불러올거니 별다른 설정이 필요 없습니다.
다음은 에어컨에 연결된 플러그에서 현재 사용량 데이터를 뽑아올건데요, 이건 기본 센서로 정해진게 없어서 만들어야 합니다.
(이 부분은 통합된 데이터를 제공하는 기기의 데이터를 센서화 할때도 동일하게 적용됩니다)
![](https://blog.kakaocdn.net/dn/deThuB/btrpDZXQghp/OynQO91nQbkXukCyFBu2H0/img.png)
HA의 개발자 도구중 상태 항목으로 이동하면
![](https://blog.kakaocdn.net/dn/daFQKa/btrpD1BkYvS/w2tjlnong2mDBbsgTC8v0k/img.png)
이런식으로 특정 장치 안에 여러가지 데이터가 있는것들이 보입니다.
이 스위치의 경우는, on/off 상태, 현재 전력량, 금일 전력량 이렇게 3가지 데이터가 있는거죠.
이중 제가 사용해볼건, 현재 전력량(current_power_w) 항목 입니다.
이걸 센서로 만들어 볼건데요, 단순하게 만들 수 있습니다.
# sensors.yaml 파일에 작성
- platform: template
# 타입은 template 로 만들거다
sensors:
# 센서는
tuya2_power:
# tuya2_power 라는 이름을 가질것이고
value_template: '{{ states.switch.tuya_plug2.attributes.current_power_w }}'
# swhitch.tuya_plug2 라는 장치의 attributes(속성) 중 currnet_power_w 라는 항목의 states 를 불러오겠다
unit_of_measurement: "W"
# 단위는 W로 할것이다
이렇게 해주면, sensor.tuya2_power 라는 센서가 생성됩니다.
(위 템플릿 센서는 다양하게 이용이 가능합니다. 가령 샤오미 가습기 라면, 습도, 온도, 회전속도, LED 밝기 등등을 만들 수 있죠)
자 이렇게 하면 일단 데이터 추출할 센서들은 다 만들었습니다.
이제 이걸 어떻게 추출할지 진행해 보겠습니다.
먼저 추출할 방법은, HA에서 제공하는 File 컴포넌트를 사용합니다.
https://www.home-assistant.io/components/notify.file/
공홈 문서 참조하시면 됩니다.
configuration.yaml 파일에 다음 문구를 작성해 줍니다.
notify:
# notify 방식을 사용하고
- platform: file
# 플랫폼 종류는 file로 할것이며
name: air_power
# 이름은 xxx로 정한다(여기서는 air_power로 가정)
filename: /config/air_power.csv
# 파일 이름은 /경로/파일명.csv(txt 등도 가능하나, 데이터의 분할 유연성을 위해 csv로 작업예정)
# timestamp: true
# 시간을 넣을것인지 여부(지정하지 않을경우 false 이며, timestamp 작성시 UTC시간으로 들어감)
타임스템프의 경우, 넣어보니 UTC 시간으로 들어가서...
현재 시간을 표시하는데 무리가 있더라구요(라즈베리 시간 및 HA의 타임존도 다 한국인데.. 이상합니다)
하지만 다른방법이 있으니 타임스탬프는 끄고 가겠습니다.
위 방법은 notify 가 실행되었을때 어디로 저장한다 정도의 값을 가지고 있으며, 이것만으로는 동작되지 않습니다.
주기적으로 파일에 업데이트(데이터를 쌓기) 위해서는 오토메이션으로 작성이 필요합니다.
# automations.yaml 파일에 작성
- alias: Air_power_values_to_file
# 오토메이션 이름 지정
initial_state: 'on'
# 시작시 상태 지정
trigger:
# 오토메이션의 트리거는
- platform: time_pattern
# 타임패턴으로 지정하겠다
seconds: 00
# 매 00초마다 트리거(1분마다 트리거됨)
action:
# 트리거시 행동은
- service: notify.air_power
# notify.air_power 를 호출한다(notify.아까 지정한 notify 이름 형식)
data_template:
# 데이터는 템플릿으로 작성하고
message: '{{now().strftime("%Y-%m-%d_%H:%M:%S")}};power;{{ states.sensor.tuya2_power.state }};out_temp;{{ states.sensor.dark_sky_apparent_temperature.state }};in_temp;{{ states.sensor.temperature_158d0002226dd0.state }};in_humidity;{{ states.sensor.humidity_158d0002226dd0.state }}'
# 메세지로 다음 항목들을 나열한다
# ' 과 ' 사이의 문자열들을 출력함
# '{{now().strftime("%Y-%m-%d_%H:%M:%S")}};
# 현재 시간을 년-월-일_시:분:초 형식으로 출력
# power;
# 문자열 power; 출력
# {{ states.sensor.tuya2_power.state }};
# 상태값 sensor.tuya2_power 의 상태를 출력
# out_temp;
# 문자열 out_temp; 출력
# {{ states.sensor.dark_sky_apparent_temperature.state }};
# sensor.dark_sky_apparent_temperature 의 상태를 출력
# in_temp;
# 문자열 in_temp; 출력
# {{ states.sensor.temperature_158d0002226dd0.state }};
# sensor.tem......xxxx 의 값을 출력
# in_humidity;
# 문자열 in_humidity; 출력
# {{ states.sensor.humidity_158d0002226dd0.state }}'
# sensor.humi.....xxxx 의 값을 출력
위와 같이 {{ states.xxxxxxx.state }} 형식으로 입력하게 되면 지정된 states(상태값) = 지정된 entity인 xxxxx 의 states(현상태) 를 출력합니다.
{{ 뒤에 공백 / }} 전에 공백이 있는점 유의하세요. 필요한 센서 or 상태값은 개발자도구-상태 화면에 있는 entity로 넣어주시면 됩니다.
각 데이터 사이에는 ; 으로 세미콜론을 넣어주었습니다.
둘 다 없어도 상관 없으나, 데이터 분할을 유연하게 하려면 세미콜론 or 공백 둘중 하나는 있어야 편합니다.
이런식으로 하게되면, 지정된 값으로 갱신되는 CSV파일이 생성됩니다.
2019-04-01_20:50:00; power; 2.4; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.6
2019-04-01_20:51:00; power; 2.2; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
2019-04-01_20:52:00; power; 2.2; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
2019-04-01_20:53:00; power; 2.2; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
2019-04-01_20:54:00; power; 2; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
2019-04-01_20:55:00; power; 2.2; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
2019-04-01_20:56:00; power; 2; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
2019-04-01_20:57:00; power; 2.2; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
2019-04-01_20:58:00; power; 2.1; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
2019-04-01_20:59:00; power; 2.1; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
2019-04-01_21:00:00; power; 2.3; out_temp; 4.1; in_temp; 22.4; in_hemidify; 50.8
텍스트로 보게되면 이런식의 파일이 생성되며, CSV파일 형식으로 로드시 ;(세미콜론) 을 구분기호로 지정하면
![](https://blog.kakaocdn.net/dn/cedDZb/btrpJQMy4yJ/tKbYYSQr2nnX2KCqo8tka0/img.png)
이런식으로 각 항목별로 탭 분리가 되어 엑셀 데이터로 불러오기가 쉽게 됩니다.
(각 항목의 이름을 넣는것은 편의성 때문이니 자신만의 데이터 분류가 있다면 값만 있어도 무방하겠죠)
현재 위와 같이 총 5개 항목 + 4개의 이름을 넣어서 데이터를 쌓고 있으며
18시 부터 21시 30분 정도까지 쌓인 데이터는 약 16KB 입니다.
대략적인 계산으로는 1시간당 4.5~4.6KB / 24시간이면 110KB정도, 30일을 쌓으면 3.3MB정도가 되겠네요
데이터 명 없이 값만 넣고, 해당 셀에 대해서 따로 기록해 둔다면 용량은 절반 이하로 찍을 수 있습니다~
전 일단 이렇게 해보고.. 좀 부담된다 싶으면 값만 넣는쪽으로 해볼라구요~
이런식으로 해서 데이터를 추출하면, 엑셀등으로 불러와서 그래프를 만든다던가..
피벗테이블 같은걸로 분석을 할수도 있겠죠..?
오토메이션의 트리거를 해당 entity의 상태로 설정하면값이 변할때만 기록을 하게 됩니다.
변화에 민감해야 하는 데이터(0.1도 단위의 온/습도 변화, W단위의 전력량 변화) 혹은
1분 단위로는 잘 변하지 않는 데이터(1도 단위로 변하는 온도계의 온도라던지, kWh 단위로 설정된 전력량 등)
이런 부분들도 원하는대로 트리거를 만들 수 있습니다.
'SmartHome. IoT > SmartHome 기본' 카테고리의 다른 글
홈 IoT의 가장 기본, 플랫폼 이란? / 스마트홈 구축시 생각할 것들 (0) | 2022.01.15 |
---|---|
HomeAssistant(HA) 에 대한 기본적인 이해. (0) | 2022.01.15 |
HA 자동화 구성에 대한 개념 / 예제. (0) | 2022.01.15 |
라즈베리 초보자를 위한, Docker의 개념에 대한 이해. (0) | 2022.01.15 |
HA(Home Assistant)에 테마를 적용해 봅시다! (0) | 2022.01.04 |