MCP9808, InfluxDB, Grafana로 라즈베리 파이 홈 온도 모니터 구축하기
라즈베리 파이를 구입하고 에벤 업튼의 라즈베리 파이 사용자 가이드(특히 GPIO 섹션)를 검토한 후, 첫 프로젝트로 홈 온도 모니터링 시스템에 착수했습니다. 이 글은 라즈베리 파이, Adafruit MCP9808 브레이크아웃, 구형 맥 미니, InfluxDB, Grafana, 파이썬, runit 프로세스 슈퍼바이저를 사용한 초기 구현을 상세히 다룹니다.
센서 하드웨어
온도 센서로 Adafruit MCP9808 브레이크아웃 보드를 선택했습니다. 선택 이유:
- 네이티브 I²C 인터페이스 – 파이 GPIO 핀 3(SDA)과 5(SCL)가 필요 버스를 지원.
- 넓은 전압 범위(2.7V~5.5V) – 파이의 3.3V와 5V 레일과 호환.
- 비용 효율적 – $5 미만으로 초보자 첫 프로젝트에 이상적.
회로 조립
MCP9808 보드는 대부분 조립된 상태로 도착하며, 필요한 납땜은 8핀 헤더 부착뿐입니다. GPIO 브레이크아웃과 브레드보드로 파이와 센서를 연결해 배선을 단순화하고 향후 조정 용이하게 했습니다. 필수 연결:
- 전원 (VDD)
- 접지 (GND)
- 데이터 (SDA)
- 클록 (SCL)
주소 선택과 알림용 남은 핀들은 단일 디바이스 설정에서 미연결로 두었습니다.
데이터 저장소
시간 경과에 따른 데이터 수집은 추세 분석과 외부 이벤트 상관관계 파악을 가능케 합니다. 시계열 특화와 직관적 쿼리 언어로 InfluxDB를 선택했습니다. 데이터베이스는 2009년 초 맥 미니(OS X 10.10)에서 Homebrew로 실행:
brew install influxdb
설치 후 웹 콘솔(기본 포트 8083)로 데이터베이스와 전용 사용자 생성. 센서 판독값 저장을 위해 mcp9808_test 데이터베이스도 설정했습니다.
라즈베리 파이 설정
I²C 활성화
파이는 기본적으로 I²C 모듈을 로드하지 않습니다. /etc/modules에 다음 줄 추가 후 재부팅:
i2c-bcm2708
i2c-dev
센서 감지 확인:
sudo i2cdetect 1
센서 소프트웨어
Adafruit의 MCP9808 파이썬 래퍼를 활용했는데, I²C 추상화 레이어도 함께 가져옵니다.
빌드 의존성 설치
sudo apt-get update
sudo apt-get install build-essential python-dev python-smbus
Adafruit MCP9808 래퍼 설치
cd ~/Downloads
git clone https://github.com/adafruit/Adafruit_Python_MCP9808
cd Adafruit_Python_MCP9808
sudo python setup.py install
읽기, 보고, 반복
아래 poll.py 스크립트는 매 분마다 온도를 읽고 InfluxDB에 기록합니다:
#!/usr/bin/python
import time
import Adafruit_MCP9808.MCP9808 as MCP9808
from influxdb import InfluxDBClient
# InfluxDB 페이로드 준비
def temperature_data(degrees_c):
return [{
'points': [[c_to_f(degrees_c)]],
'name': 'Temperature Readings',
'columns': ['degrees_f']
}]
# 섭씨를 화씨로 변환
def c_to_f(c):
return c * 9.0 / 5.0 + 32.0
# 센서 초기화
sensor = MCP9808.MCP9808()
sensor.begin()
# 캡처 간격(초)
capture_interval = 60.0
# InfluxDB 연결 (플레이스홀더를 실제 값으로 교체)
influxClient = InfluxDBClient('', 8086, 'mcp9808', '', 'mcp9808_test')
# 연속 루프
while True:
temp_c = sensor.readTempC()
print('Temperature {0:0.3} F'.format(c_to_f(temp_c)))
influxClient.write_points(temperature_data(temp_c))
time.sleep(capture_interval)
GPIO 핀 접근을 위해 root로 실행:
sudo python /path/to/poll.py
runit으로 프로세스 감독
poll.py가 재부팅과 정전에도 살아있도록 runit을 프로세스 슈퍼바이저로 구성했습니다. 자세한 설정 단계는 원본 프로젝트 문서에 있습니다.
요약
센서, 데이터베이스, 모니터링 스택이 갖춰져 이제 신뢰할 수 있는 저비용 홈 온도 로거를 보유하게 됐습니다. Grafana로 데이터 시각화, 알림 설정, 환경에 대한 실행 가능한 통찰을 얻으세요.