홈어시스턴트 베이지안 센서 소개 (확률형 센서)
홈 어시스턴트의 '베이지안 센서(Bayesian Sensor)를 소개하는 글입니다.
베이지안 센서는 하나의 센서 고장으로 인한 오작동을 막기 위해, 여러 근서를 모아 확률적으로 상황을 판단하는 가상 센서입니다. 센서 하나로만 모든 것을 판단하면 해당 센서가 고장났을 때 잘못 판단하는 경우가 생기는데, 이를 방지하기 위한 것입니다.
수학적 논의가 궁금하시다면 나무위키의 베이즈 정리 항목 등을 살펴 보시면 좋을 것 같고, 이 글에서는 간단한 예시를 통해 확률 계산 방법을 알아 보고, 홈 어시스턴트에 적용하는 방법을 살펴 보도록 하겠습니다.
관련 글
◆ 1. 예시: 내가 수면 중일 확률
홈 어시스턴트에 적용하는 방법에 앞서서, 실제로 계산이 어떻게 이루어지는지 예시를 통해 보여 드립니다. 수학적인 논의라서 재미가 없을 수 있습니다만, 센서를 정확하게 이용하려면 어느 정도는 이해를 해야 합니다.
▶ 수면 중일 확률을 계산하기 위한 자료
- 단서가 아무것도 없을 때 수면 중일 확률 0.25 (24시간 중 6시간 잔다고 가정).
- 수면 중 폰이 충전 중일 확률 0.9, 비수면 중 폰이 충전 중일 확률 0.2
- 수면 중 침대 압력 감지 확률 0.8, 비수면 중 침대 압력 감지 확률 0.1
- 수면 중 침실 불 꺼졌을 확률 0.9, 비수면 중 불 꺼졌을 확률 0.15
이런 확률 자료가 있으면, 역으로 이런 확률 값을 토대로 수면 중일 확률을 구할 수 있습니다.
▶ 폰이 충전 중, 침대 압력 감지, 불 꺼졌을 때 잠 자고 있을 확률
- 단계 1: '수면 중' 이 조건들이 동시에 나타날 가능성 계산 (분자)
기본 수면 확률 * 수면 중 폰 충전 * 수면 중 침대 압력 * 수면 중 침실 불 꺼짐
0.25 * 0.9 * 0.8 * 0.9 = 0.162
- 단계 2: '비수면 중' 이 조건들이 동시에 나타날 가능성 계산
기본 비수면 확률 * 비수면 중 폰 충전 * 비수면 중 침대 압력 * 비수면 중 침실 불 꺼짐
0.75 * 0.2 * 0.1 * 0.15 = 0.00225
- 단계 3: 최종 확률 도출하기 (베이즈 정리 공식 적용)
최종 확률은 [단계 1의 값]을 [단계 1 + 단계 2의 전체 값]으로 나누어 백분율을 구합니다.
즉 [수면 중에 이럴 확률]을 [수면 중에 이럴 확률 + 비수면 중에 이럴 확률]로 나누는 것입니다.
최종 확률 = 0.162 / (0.162 + 0.00225) = 0.162 / 0.16425 ≒ 0.9863
최종 수면 확률: 약 98.63%
▶ 다른 것은 똑같은데, 불이 켜져 있을 때 수면 중일 확률을 구해보겠습니다.
불이 꺼져있을 확률의 반대이므로 아래와 같이 값이 바뀝니다.
수면 중 불이 켜져 있을 확률: 1 - 0.9 = 0.1 (수면 중 침실 불 꺼졌을 확률 0.9의 반대)
비수면 중 불이 켜져 있을 확률: 1 - 0.15 = 0.85 (비수면 중 침실 불 꺼졌을 확률 0.15의 반대)
- 단계 1: '수면 중 이 조건들이 동시에 나타날 가능성 계산 (분자)
기본 수면 확률(0.25) * 폰 충전(0.9) * 침대 압력(0.8) * 수면 중 침실 불 켜짐(0.1)
0.25 * 0.9 * 0.8 * 0.1 = 0.018
- 단계 2: '안 자고 있을 때' 이 정황이 나타날 가능성
기본 비수면 확률(0.75) * 폰 충전(0.2) * 침대 압력(0.1) * 비수면 중 침실 불 켜짐(0.85)
0.75 * 0.2 * 0.1 * 0.85 = 0.01275
- 단계 3: 최종 확률 도출하기 (베이즈 정리 공식 적용)
[단계 1 값]을 [단계 1 + 단계 2 값]으로 나눕니다.
즉 [수면 중에 이럴 확률]을 [수면 중에 이럴 확률 + 비수면 중에 이럴 확률]로 나누는 것입니다.
최종 확률 = 0.018 / (0.018 + 0.01275) = 0.018 / 0.03075 ≒ 0.5854
최종 수면 확률: 약 58.54%
3개 중 2개 센서(폰 충전, 침대 압력)가 "이 사람 자고 있다"라고 주장하고 있지만, 침실 불이 켜져 있다는 강력한 반대 증거 하나 때문에 확률이 98.63%에서 58.54%로 낮아졌습니다.
◆ 2. 베이지안 센서의 장단점
▶ 장점
위 예시에서 베이지안 센서의 기준치(threshold)를 0.75 (75%)로 설정해 두었다면? 확률이 58.54%에 그쳤기 때문에 이 센서는 off(비수면) 상태를 유지합니다.
침대에 누워서 폰을 충전하며 불을 켜놓은 상태에서 폰을 보고 있을 때, 허브가 '수면 중'으로 판단해 집안 조명을 다 꺼버리는 오작동을 막을 수 있습니다.
단순 and 조건문으로는 구현하기 힘든, 베이지안 센서로만 가능한 방식입니다.
▶ 단점
1. 기반 확률이나 기준치(threshold)를 모두 직접 설정해야 합니다. 베이지안 센서가 원하지 않는 방향으로 작동할 떄, 각 항목의 확률을 조정하거나 기준치를 미세 조정하면서 실제 상황에 맞춰야 합니다.
- 사람이 한 명이라면 그나마 낫지만, 사람이 여러 명이라면 훨씬 어려워집니다. 굉장히 다양한 상황이 생기기 때문에 센서도 많이 설치해야 하고, 센서마다 확률을 따로 고려해야 하는 등 상당히 어려운 일이 될 것입니다.
2. 베이지안 센서 계산법은 "모든 단서가 서로 영향을 주지 않고 독립적으로 일어난다"고 가정하고 확률을 곱합니다. 하지만 실제로는 단서끼리 연관이 있는 경우가 존재합니다.
- 예를 들어 위 예시에서 침실에 PIR 모션 센서를 추가했다고 해봅시다. 하지만 이미 침대 압력 센서가 있는 상황입니다. 침대에 누워 있으면(=압력 센서가 감지) PIR 센서에 모션이 감지되지 않을 확률이 높습니다. 누워서 PIR 센서에 감지될 만큼 움직이는 경우는 적기 때문입니다.
- 이러면 누워 있다는 하나의 행동이 두 번 계산되면서 수면 확률을 과도하게 산정하는 문제가 생깁니다. 그래도 PIR 센서를 같이 사용하고 싶다면, 기준치를 더 높게 설정하거나 개별 센서의 가중치(확률)을 살짝 낮게 잡는 등 수정이 필요합니다.
논리적으로는 꽤 괜찮지만, 실제로 사용하려고 하면 이런 미세 조정이 굉장히 많이 필요하기 때문에, 베이지안 센서를 실제로 활용하는 것은 쉽지 않습니다.
◆ 3. 홈 어시스턴트에 베이지안 센서 만드는 방법
설정(Settings)으로 들어갑니다.
→ 기기 및 서비스(Devices & services)로 들어갑니다.
→ 우하단 통합구성요소 추가(Add integration) 클릭하고, bayesian 검색하여 클릭합니다. 'bay'까지만 검색해도 나옵니다.
→ 이름을 정하고, 확률이 얼마를 넘으면 베이지안 센서가 on으로 바뀔지 선택합니다.
→ 아무런 근거가 없을 때의 확률도 설정합니다. 예를 들어 24시간 중 6시간 수면 중이라면 0.25입니다.
→ Device Class에서 원하는 것을 선택합니다. 다만 이건 선택을 안 해도 됩니다. 어차피 Binary Sensor이기 때문에 O와 X만 있어서, 논리적으로는 무엇을 골라도 같기 때문입니다.
- Sleeping은 따로 없기 때문에, 그냥 Device Class를 지정하지 않는 것이 깔끔할 수도 있습니다.
→ 아래의 Submit 눌러서 추가합니다.
→ Add an observation에서 판단 기준으로 사용할 센서를 선택합니다.
- sensor's state: entity를 고르고, state의 이름을 직접 입력합니다. 장치 상태창에 가서 직접 상태의 이름을 봐야 합니다. 대개 소문자로 on이나 off입니다만, occupied처럼 다른 이름일 수도 있고, '재실'처럼 한글로 나올 수도 있습니다.
- numeric state: entity를 고르고, 얼마 초과여야 하는지(above) 또는 얼마 미만이어야 하는지(below) 수치를 입력합니다. 조도, 이산화탄소 수치 등에 사용할 수 있습니다.
→ Probability when Bayesian Binary Sensor is 감지: 예를 들자면, 수면 중일 때 침실 조명이 켜져 있을 확률입니다.
→ Probability when Bayesian Binary Sensor is 꺼짐: 예를 들자면, 비수면 중일 때 침실 조명이 켜져 있을 확률입니다.
→ 아래의 Name을 정하고 Submit을 눌러 저장하면 설정 완료입니다.
이후에 수정하거나 추가를 하고 싶다면 Settings의 Devices & services에서, integration의 Bayesian으로 들어가 작업을 할 수 있습니다.
- Add service가 새로운 베이지안 센서를 추가하는 것이고, Add an observation이 베이지안 센서의 근거 자료를 추가하는 것입니다.
◆ 4. 베이지안 센서를 이용한 자동화
▶ 수면 상태
위와 같이 '폰 충전, 침대 압력 센서, 침실 조명 상태를 기반으로 수면 중일 확률'을 계산하고, 이를 기반으로 하는 베이지안 센서를 만들었다고 해봅니다.
- 수면 중이라면 거실 TV, 컴퓨터 멀티탭(스마트 플러그), 실내 조명을 모두 끕니다.
- 에어컨이나 보일러를 평소 온도가 아닌 '수면 적정 온도'로 맞추고, 침실 가습기를 가동합니다.
- 스마트 공기청정기는 소음이 없는 '취침 모드'로 변경합니다.
▶ 재실 여부
스마트폰의 GPS 위치, 공유기에 스마트폰 MAC 주소가 연결되어 있는지 여부, 현관문 도어락이 방금 전 열렸는지 여부, 집안의 모션 센서가 움직임을 감지했는지 여부 등을 묶어서 '재실 확률'을 계산하고, 이를 기반으로 하는 베이지안 센서를 만들었다고 해봅니다.
- 집에서 사람이 모두 나가면 로봇 청소기를 작동하고, 대기 전력을 많이 소비하는 가전 제품의 전기를 차단하고, 집안의 조명을 모두 끕니다.
- 집에 사람이 들어왔을 때 조도 센서의 값이 일정 이하라면 거실 불을 켭니다. 그리고 로봇 청소기의 청소를 중단합니다.
이외에도 여러 방향으로 사용 가능합니다.
- 미세먼지 센서, 외부 미세먼지 수치, CO2 센서 등 여러 센서를 묶어 환기 필요 여부를 판단하고, 환기를 자동화
- 재실 센서, 모션 센서, TV 전력 소비량 변화, 냉장고 열림 센서 등 여러 센서를 묶어 노인의 활동 여부를 판단하고, 위험한 상태라고 판단이 되면 보호자의 휴대전화에 알람이 울리게 함
◆ 5. 마무리
개별 센서는 오작동하는 경우가 꽤 있지만, 여러 센서가 동시에 오작동하는 경우는 적다는 것을 전제로, 여러 센서의 값을 통해 사실을 확률적으로 판단하는 것이 베이지안 센서입니다.
제대로 만들어 놓으면 정말 좋은 기능입니다만, 꽤 많은 센서를 설치해야 하고, 그 여러 센서에 기반한 확률을 직접 조정해야 한다는 가장 큰 단점이 있습니다.
번거롭지만 판단의 정확도를 올릴 수 있는 만큼, 중요한 것이 있을 때 활용해 보시면 좋을 것 같습니다.
관련 글
댓글
댓글 쓰기