본문 바로가기

SmartHome. IoT/SmartHome 기본

HA에 불쾌지수 센서를 추가하기.

728x90
반응형

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

요즘 여름은 온도가 높진 않지만...습도가 어마어마 하게 높아, 매우 불편한 경우가 발생합니다.

평소엔 습도에 관해서 신경을 안 썼는데, 실내 습도가 상시 70%를 넘어가게 되면

도가 얼마 안되는데도 너무 힘들더라구요.

그래서, 자동화에 쓸만한 불쾌지수 센서를 만들어 보았습니다.

불쾌지수는 최초에 화씨온도 기준으로 만들어 졌으나, 이후 섭씨온도에서 가능한 계산식이 나왔습니다.

하지만, 습구온도계가 필요하기 때문에 쉽지 않았죠.

이후에 기온 및 상대습도(우리가 보통 말하는 습도) 를 가지고 계산할 수 있는 계산식이 나왔고, 그걸 기준으로 만들어 보려고 합니다.

https://www.kma.go.kr/HELP/basic/help_01_05.jsp

단계
지수범위
설명 및 주의사항
매우높음
80 이상
전원 불쾌감을 느낌
높음
75~80 미만
50% 정도 불쾌감을 느낌
보통
68~75 미만
불쾌감을 나타내기 시작함
낮음
68 미만
전원 쾌적함을 느낌

기상청에서 제공하는 불쾌지수 계산식 정보로 만들어 보았습니다.

이중 9/5 는 1.8로 대체하고, RH는 상대습도(%)에 0.01을 곱해서 계산해야 합니다.

27도 / 60% 라면 다음과 같이 계산할 수 있습니다.

(1.8 * 27) - 0.55 * (1 - 0.6) * ((1.8 x 26) - 26) + 32

48.6 - 0.55 * 0.4 * (48.6-26) + 32

48.6 - 0.22 * 22.6 + 32

48.6 - 4.972 + 32

= 75.628

이제 이걸 HA에서 쓸 수 있는 계산식으로 만들어야겠죠.

템플릿 만들때 테스트는, 개발자도구-템플릿 에서 하시면 됩니다.

템플릿은 아래와 같은 구성으로 진행됩니다.

{{ 온도*1.8-(0.55*(1-습도/100)*(온도*1.8-26))+32}}

이걸 sensor.temperature 온도센서와 sensor.humidity 습도센서로 구성하면 다음과 같아집니다.

{{ states('sensor.temperature')|float * 1.8-(0.55*(1-states('sensor.humidity')|float/100)*(states('sensor.temperature')|float * 1.8-26))+32}}

온도,습도 뒤에 |float는, 해당 값을 소숫점 이하 숫자까지 포함한다는 의미 입니다.

이 부분이 포함되지 않으면, 해당 숫자가 문자형태로 인식되어서 계산이 안됩니다.

온도/습도에 따라 소숫점 아래 자리가 매우 길어질 수 있으므로, 적당히 잘라줍니다.

전 소숫점 아래 2자리 까지 표현하고, 반올림 하는걸로 지정하겠습니다.

이 경우, |round(2) 를 마지막에 넣어주면 됩니다.

주의할점은 |round는 | 앞에 있는걸 수식하는거라 맨 뒤에 붙여주기만 하면 의미가 없습니다.(마지막 32|round(2) 와 마찬가지 이므로)

그래서 전체를 감싸서 수식해줘야 합니다.

{{ (states('sensor.temperature')|float * 1.8-(0.55*(1-states('sensor.humidity')|float/100)*(states('sensor.temperature')|float * 1.8-26))+32)|round(2) }}

이렇게 하면 완성됩니다.

근데 이게 너무 길다 싶으면, 조금 변형을 할수도 있습니다.

(그래도 길고 복잡해 지지만, 나중에 여러가지로 쓸 수 있는거니 한번 공부해 보세요)

{% set test = xxxx %} 를 사용하면, 동일한 템플릿(동일 센서라던가, 오토메이션의 액션이라던가) 에서 test 라는 값을 xxxx로 치환하게 됩니다.

이걸 응용하면, {% set rh = states('sensor.humidity') |float %} 이라고 선언해두면, 그 아래쪽에 {{ rh }} 라고 치면

sensor.humidity의 state 값을 불러오게 됩니다.

{{ states('sensor.humidity') |float }}

이걸 다음과 같이 표현할 수 있습니다.

{% set rh = states('sensor.humidity') |float %} {{ rh }}

온도도 마찬가지로 표현해 보겠습니다.

온도의 경우, 어차피 온도x1.8 로만 계산하므로 아예 선언할때 해당 값을 넣어보겠습니다.

{% set t = ((states('sensor.temperature')|float * 1.8)) %}

이렇게 선언하고 {{ t }} 를 호출하면, 온도 x 1.8인 값이 호출됩니다.

그러면 이걸 조합해서 다음과 같이 표현할 수 있습니다.

{% set t = ((states('sensor.temperature')|float * 1.8)) %} {% set rh = states('sensor.humidity')|float /100 %} {{ (t-(0.55*(1-rh)*(t-26))+32)|round(2) }}

위 센서에 원하는 곳의 온도/습도 센서의 entity_id를 입력해서 개발자도구-템플릿에 넣어보세요.

26도 / 65% 근처라면 값이 75 정도가 나오게 됩니다.

정상적으로 나오면, 이제 센서로 만들어 봅시다.

센서 타입은 template가 되어야겠죠.

# sensors.yaml
- platform: template
  sensors:
    thi_living_room:
      friendly_name: 거실 불쾌지수
      icon_template: mdi:account-alert
      unit_of_measurement: 'di'
      value_template: >
           {% set t = ((states('sensor.temperature_158d0002226dd0')|float * 1.8)) %} {% set rh = states('sensor.humidity_158d0002226dd0') |float %} {{ (t-(0.55*(1-rh/100)*(t-26))+32)|round(2) }}

unit_of_measurement 가 없는경우 히스토리 쪽에서 그래프가 아닌 바 형태로 나오기 때문에 임의로 넣어주었습니다.

히스토리쪽 신경 안 쓰시거나, 다른 db로 그래프를 그리는 경우 무시하셔도 됩니다.

전 온습도가 설치되어 있는곳이 총5곳 이어서, 그중 실생활 공간인 거실/안방/옷방 3군데만 만들었습니다.

불쾌지수고 77정도면 좀 불편하고, 75 초반까지 가면 살짝 춥네요. 제 몸에는 76정도가 딱인듯 합니다.

이제 이걸 가지고 에어컨 자동화(설정온도, 냉방/제습, 풍속 등) 을 진행해야 하겠습니다...!

이건 또 나중에 들고 올께요~~

 
728x90
반응형