2024. 1. 26. 18:10ㆍWEB
겨울철이 되면 실내와 바깥의 온도 차이로 인해 결로현상이 발생하고, 실내 습도가 올라가 곰팡이가 번식하기 좋은 환경이 됩니다.
물론 제 방도 예외는 아니구요.
한 2주 전부터 초기 값을 (0, 0, 0)으로 가지는 곰팡이가 너비 우선 탐색을 시작했습니다.
어떻게 막아야 할까요..
곰팡이를 막기 위한 방법을 찾아보니 실내 온도를 18~21도, 습도는 40~60%로 유지하라고 합니다.
얼어 죽지 않기 위해 온도는 어쩔 수 없더라도 습도라도 낮게 유지한다면, 곰팡이 번식을 막을 수 있을 것입니다.
습도를 낮추는 가장 쉬운 방법은 제습기를 사는 것이죠.
LG나 캐리어 같은 네임드는 40만 원에 육박하고, 저렴한 중소기업의 제습기도 20만 원을 호가합니다.
유명해져서 제습기 협찬을 받았으면 좋겠지만, 더 싸게 해결할 수 있으면 좋을 것 같습니다.
실내 온/습도 확인
우선 현재 실내 온도를 확인하기 위한 준비물이 필요합니다.
준비물은 알리 익스프레스에서 3천 원 정도로 구매할 수 있습니다.
센서 데이터를 수신할 브로커를 띄우고, 센서를 사용하기 위한 간단한 코드를 작성합니다.
기본적으로 부팅 시에
- WiFi 연결
- 수집한 데이터를 전송할 브로커 서버의 IP 또는 도메인, 포트로 연결합니다. (저는 3 달마다 구글 계정 만들어서 무료로 클라우드를 이용하기에 DNS를 이용했습니다 .. ㅜ)
- 온, 습도 수집을 시작하고
- 쉬운 확인을 위해 디스플레이도 세팅
깊게 들어가기에는 MCU부터, 세팅까지 설명할게 많은데 해당 카테고리가 WEB인 관계로 해당 글에서는 디테일은 생략하고,
추후 관련 글을 따로 작성하거나 댓글 등으로 문의 주시면 알려드리겠습니다.
이제 확인해 볼까요?
습도 85%?
이러니까 곰팡이가 생기죠? 국에 밥을 말면 국밥이니까, 이제 이 집은 물집이라고 부르겠습니다. 깔깔쓰~
이제 이 습도가 변화하는 모습을 지켜보기 위한 모니터링 시스템을 구축하면 좋을 것 같습니다.
사실 전에 MQTT 브로커를 subscribe하는 서버를 만들고, 차트로 보여주는 페이지를 작성한 경험이 있는데, 이번엔 더 효율적으로 모니터링하기 위해 기존 k8s 클러스터에서 사용하던 프로메테우스라는 모니터링 툴과 Grafana를 이용해 간단히 온/습도를 모아 시각화해 보도록 하겠습니다.
간단하게 프로메테우스와 MQTT 프로토콜에 대해 설명하자면 프로메테우스는 CPU, 메모리 사용률과 같은 시간에 따라 변화하는 소수형 데이터(float64), 즉 메트릭 데이터를 수집하고, 레이블을 통해 분류하며 promQL이라는 쿼리를 통해 효율적으로 데이터를 조회, 집계할 수 있습니다.
MQTT 프로토콜은 흔히 쓰는 HTTP/HTTPS처럼 메시지의 전송에 관한 규약으로, HTTP보다 훨씬 적은 트래픽을 필요로 하며 저전력/낮은 대역이라는 제약이 있는 IoT 기기에서는 효율적인 전송을 위해 사용합니다.
실내 온/습도 수집
현재 Prometheus와 Grafana, Mqtt 브로커가 준비되어 있으니 MQTT 브로커가 받은 메시지를 프로메테우스에서 수집할 수 있게 해주어야 합니다.
프로메테우스는 scrape job에 등록된 url로 직접 요청을 보내 프로메테우스 형식의 메트릭 데이터를 직접 읽어오기 때문에, MQTT 브로커로 전달된 메시지를 수집하기 위해서는 MQTT 브로커의 데이터를 프로메테우스 형식으로 변환해 주는 미들웨어가 필요합니다.
프로메테우스에서는 이를 Exporter라고 부르는데, 직접 데이터 변환 로직을 작성할 필요 없이 기존의 exporter를 사용해 손쉽게 프로메테우스에서 해당 데이터를 수집할 수 있습니다.
- name: mqtt-exporter
image: kpetrem/mqtt-exporter
env:
- name: MQTT_ADDRESS
value: "broker.mqtt.svc.cluster.local" # MQTT 브로커의 주소
- name: MQTT_PORT
value: "1883" # MQTT 브로커의 포트
---
apiVersion: v1
kind: Service
metadata:
name: mqtt-exporter
namespace: monitoring
labels:
app: mqtt-exporter # 서비스 레이블
spec:
selector:
app: mqtt-exporter
ports:
- name: exporter # 포트 이름
protocol: TCP
port: 9000
targetPort: 9000
MQTT exporter를 띄워주고, 프로메테우스에서 해당 서비스를 통해 메트릭을 수집하도록 구성해 줍니다.
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mqtt-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: mqtt-exporter # exporter의 레이블
endpoints:
- port: exporter # exporter의 포트
path: /
저는 쿠버네티스 네이티브 환경에서 Prometheus-Operator를 사용했는데, 쿠버네티스를 사용하지 않는다면 직접 config 파일을 작성하셔야 합니다.
여기까지 완료했다면
- 센서를 통해 데이터 수집
- 수집된 데이터가 MQTT 브로커에게 Publish
- MQTT Exporter에서 해당 데이터를 프로메테우스 형식으로 변환
- 프로메테우스 서버가 주기적으로 MQTT Exporter로부터 메트릭 데이터를 수집해 저장
되고 있습니다.
프로메테우스에서 한 번 확인해 볼까요?
promQL은 메트릭의 이름{조건}의 포맷을 가집니다. 여기서 topic=~'^humid.*'는 표현식을 통해 humid로 시작하는 패턴과 매칭되는 조건식을 사용했습니다.
MQTT는 '/'를 구분자로 토픽을 트리 형태로 관리하는데, exporter에서 변환할 때, a/b/c라는 토픽은 a_b_c로 변환되며, 오른쪽의 76이라는 값은, 마지막에 수집한 메트릭 값이 76임을 뜻합니다.
시계열 메트릭을 다루는 모니터링 툴인만큼, 온도를 포함해 30분 동안의 변화도 한 번 보도록 하겠습니다.
humid 또는 temp로 시작하는 토픽을 그래프에 표시합니다.
지금까지 센서를 통해 데이터를 수집하고, 변화를 확인할 수 있도록 설정해 보았습니다.
그런데 뭔가 보기도 불편하고, 무엇보다 다 제쳐두고 계속 그래프만 보고 있을 수도 없는 노릇입니다..
다음 글에서는 시각화 툴인 Grafana를 통해 더 보기 좋게 하고, 일정 수준 이상 습도가 올라가면 외부로 알림을 전송하는 방법에 대해 다루겠습니다.
'WEB' 카테고리의 다른 글
[서비스] 3천원으로 실내 곰팡이 방지한 후기 -2 (6) | 2024.01.27 |
---|---|
[서비스] AI 요리 블로거 챗종원 개발기 -完 (2) | 2023.10.28 |
[서비스] AI 요리 블로거 챗종원 개발기 -6 (0) | 2023.10.27 |
[서비스] AI 요리 블로거 챗종원 개발기 -5 (2) | 2023.10.27 |
[서비스] AI 요리 블로거 챗종원 개발기 -4 (5) | 2023.10.27 |