Raspberry Pi, Prometheus 및 Grafana로 아파트 온도 및 습도 모니터링

꽤 오랫동안 나는 여분의 Raspberry Pi를 내 집에 두었습니다. 그리고 어느 주말에 저는 제 아파트를 "더 똑똑하게"만들 아이디어를 생각해 냈습니다. "더 똑똑하다"는 말의 의미는 내 주변 환경의 일부 메트릭을 추적하는 것입니다.

나는 PrometheusGrafana 작업에 약간의 경험이 있으므로 이러한 도구를 내 솔루션에 통합하기로 결정했습니다. 예, 간단한 작업을 과도하게 엔지니어링하는 것처럼 들립니다. 아마도 훨씬 더 간단한 방법으로 동일한 결과를 얻을 수 있습니다 :). 하지만 저에게는 즐거운 주말 프로젝트였습니다.

이 게시물에서는 실내 온도 및 습도 모니터링을 위한 설정에 대해 설명합니다.

하드웨어 구성 요소



다음은 내 프로젝트에서 사용한 모든 구성 요소입니다.
  • Raspberry Pi 3 Model B
  • 16GB microSD 카드
  • DHT11 Temperature And Humidity Sensor
  • 라즈베리 파이에 전원을 공급하기 위한 휴대폰 충전기

  • 라즈베리 파이에 센서 연결하기



    Ground 핀을 Raspberry PI의 Ground에, Data Pin을 GPIO 14핀에, Vcc 핀을 3.3V 전원 공급 장치 핀에 연결했습니다.

    센서 데이터 읽기



    센서 데이터를 읽고 Prometheus에 제공하기 위해 저는 DHT11_Python 라이브러리를 선택했습니다. 이 라이브러리는 매우 불안정하고 때때로 유효한 결과를 반환하지 않으므로 그래프에 약간의 차이가 있을 수 있습니다.

    또한 Prometheus에 대한 메트릭을 제공하기 위해 간단한 Flask API를 만들었습니다.

    from flask import Flask
    import dht11
    import RPi.GPIO as GPIO
    
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    instance = dht11.DHT11(pin=14)
    
    app = Flask(__name__)
    
    @app.route("/metrics")
    def metrics():
        dht11_data = ""
        result = instance.read()
        if result.is_valid():
            dht11_data = f"""pihome_temperature {result.temperature}
    pihome_humidity {result.humidity}"""
    
        return f"{dht11_data}", 200, {'Content-Type': 'text/plain; charset=utf-8'}
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0')
    

    프로메테우스 구성



    Flask API에서 메트릭을 스크랩하기 위해 prometheus.yml에 구성을 추가했습니다.

    global:
        scrape_interval: 30s
    scrape_configs:
        - job_name: 'pihome'
          static_configs:
            - targets: [pihome:5000]
    

    Grafana 구성



    그런 다음 /etc/grafana/provisioning에서 데이터 소스 구성을 추가했습니다.

    apiVersion: 1
    datasources:
      - name: Prometheus
        type: prometheus
        url: http://prometheus:9090/
        access: proxy
        isDefault: true
    

    Grafana 대시보드를 프로비저닝 폴더에 json 파일로 추가할 수도 있으므로 Grafana를 재배포할 때마다 새 대시보드를 생성할 필요가 없습니다.

    모든 것을 함께 연결



    모든 것을 이식 가능하고 쉽게 설치할 수 있도록 Flask API를 Docker 이미지에 압축하고 docker-compose.yaml에서 모든 서비스를 구성했습니다.

    
    version: '3'
    
    services:
      pihome:
        image: pihome
        build: .
        restart: always
        devices:
          - "/dev/mem:/dev/mem"
        privileged: true
        ports:
          - 5000:5000
    
      prometheus:
        image: prom/prometheus:v2.16.0
        user: root
        volumes:
          - ./prometheus/:/etc/prometheus/
          - /var/prometheus:/prometheus
        command:
          - '--config.file=/etc/prometheus/prometheus.yml'
          - '--storage.tsdb.path=/prometheus'
          - '--storage.tsdb.retention.time=30d'
          - '--web.console.libraries=/usr/share/prometheus/console_libraries'
          - '--web.console.templates=/usr/share/prometheus/consoles'
        ports:
          - 9090:9090
        depends_on:
          - pihome
        restart: always
    
      grafana:
        image: grafana/grafana:6.6.2
        depends_on:
          - prometheus
        ports:
          - 80:3000
        volumes:
          - ./grafana/:/etc/grafana
        restart: always
    

    결과



    일부 기록 데이터를 수집하기 위해 얼마 동안 내 스택을 실행 상태로 두었고 대시보드는 다음과 같이 표시되었습니다.


    힘내 프로젝트



    Github에서 전체 구성 및 코드를 찾을 수 있습니다. https://github.com/pdambrauskas/pihome

    좋은 웹페이지 즐겨찾기