반응형
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가 올라오는지 확인하자.
반응형
댓글