본문 바로가기
Home Assistant

cpu/hdd의 온도 정보를 home assistant로 모니터링하기

by binary012 2025. 8. 1.
반응형

 

 

 

 

 

1. Proxmox에 필요한 패키지 설치

sudo apt update

sudo apt install python3-paho-mqtt

 

 

2. Python 스크립트 작성

 

#!/usr/bin/env python3
import os
import subprocess
import paho.mqtt.client as mqtt
import time
import json
import re

MQTT_BROKER = "192.168.0.5" # Home Assistant IP
MQTT_PORT = 1883
MQTT_TOPIC = "n100/sensors"
MQTT_CLIENT_ID = ""

# Add MQTT username and password here
MQTT_USERNAME = "mqttuser"
MQTT_PASSWORD = "01020053158"


def read_cpu_temp():
    """
    'sensors' 명령어를 사용하여 CPU 패키지 온도만 읽어옵니다.
    """
    try:
        output = subprocess.check_output(["sensors"]).decode()
        for line in output.splitlines():
            # 'Package id 0:'로 시작하는 라인을 찾습니다.
            if line.strip().startswith("Package id 0:"):
                # 해당 라인에서 '+숫자.숫자°C' 패턴을 찾습니다.
                match = re.search(r'\+([0-9]+\.[0-9])°C', line)
                if match:
                    return float(match.group(1))
    except Exception as e:
        print(f"Error reading CPU temperature: {e}")
        return None
    return None



def read_disk_temps():
    """
    'hddtemp-lt' 명령어를 사용하여 모든 디스크의 온도를 읽어옵니다.
    정확한 장치 이름과 온도 값을 파싱하여 반환합니다.
    """
    temps = {}
    try:
        output = subprocess.check_output(["sudo", "/usr/local/bin/hddtemp-lt"]).decode()
        for line in output.strip().splitlines():
            parts = line.split()
            if len(parts) >= 3:
                # 첫 번째 요소인 장치 이름만 가져옵니다.
                device_name = parts[0]
                temp_value = parts[-1]
                
                if temp_value.isdigit():
                    temps[device_name] = int(temp_value)
                elif temp_value == "NA":
                    temps[device_name] = "NA"
    except Exception as e:
        print(f"Error reading disk temperatures: {e}")
        pass
    return temps


def read_cpu_usage():
    """
    'top' 명령어 출력에서 CPU 사용률을 계산합니다.
    """
    try:
        output = subprocess.check_output(["top", "-bn1"]).decode()
        for line in output.splitlines():
            if "Cpu(s):" in line or "%Cpu" in line:
                match = re.search(r'(\d+\.?\d*)\s*id', line)
                if match:
                    idle_percentage = float(match.group(1))
                    usage = 100.0 - idle_percentage
                    return round(usage, 1)
    except Exception as e:
        print(f"Error reading CPU usage from top: {e}")
        return None

def main():
    """
    모든 센서 정보를 읽어 MQTT 브로커로 전송합니다.
    """
    client = mqtt.Client()

    if MQTT_USERNAME and MQTT_PASSWORD:
        client.username_pw_set(MQTT_USERNAME, MQTT_PASSWORD)

    try:
        client.connect(MQTT_BROKER, MQTT_PORT, 60)
    except Exception as e:
        print(f"Failed to connect to MQTT broker: {e}")
        return

    data = {
        "cpu_temp": read_cpu_temp(),
        "cpu_usage": read_cpu_usage()
    }

    data.update(read_disk_temps())
    
    json_payload = json.dumps(data)
    print(f"Publishing to {MQTT_TOPIC}: {json_payload}")
    client.publish(MQTT_TOPIC, json_payload, qos=1)
    
    client.disconnect()

if __name__ == "__main__":
    main()

 

 

기존에 hddtemp 정보를 가져오는 프로그램은 아래를 참고하여 설치하자.

https://github.com/slowpeek/hddtemp#

 

 

 

 

3. 크론으로 30초마다 실행

 

sudo crontab -e
* * * * * /usr/bin/python3 /home/경로/send_metrics.py
* * * * * sleep 30 && /usr/bin/python3 /home/경로/send_metrics.py

 

4. Home Assistant 설정

configuration.yaml에 다음 추가:

 

mqtt:
  sensor:
    - name: "n100 CPU Temp"
      state_topic: "n100/sensors"
      unit_of_measurement: "°C"
      value_template: "{{ value_json.cpu_temp }}"
    - name: "n100 CPU Usage"
      state_topic: "n100/sensors"
      unit_of_measurement: "%"
      value_template: "{{ value_json.cpu_usage }}"
    - name: "Disk Temp SDA"
      state_topic: "n100/sensors"
      unit_of_measurement: "°C"
      value_template: "{{ value_json['/dev/sda'] }}"
    - name: "Disk Temp SDB"
      state_topic: "n100/sensors"
      unit_of_measurement: "°C"
      value_template: "{{ value_json['/dev/sdb'] }}"
    - name: "Disk Temp SDC"
      state_topic: "n100/sensors"
      unit_of_measurement: "°C"
      value_template: "{{ value_json['/dev/sdc'] }}"
    - name: "Disk Temp NVMe0"
      state_topic: "n100/sensors"
      unit_of_measurement: "°C"
      value_template: "{{ value_json['/dev/nvme0'] }}"

 

 

재시작하여 home assistant에서 data가 올라오는지 확인하자.

 

 

반응형

댓글