Drive temps (#135)

* add drives temp sensors

* add drives temp sensors
This commit is contained in:
Masoko
2024-10-18 18:57:18 +03:00
committed by GitHub
parent 0e213c9797
commit ce5dc05493
2 changed files with 73 additions and 13 deletions

View File

@@ -42,13 +42,14 @@ retain = True
# QOS setting for published topics: 0,1,2 are acceptable values # QOS setting for published topics: 0,1,2 are acceptable values
qos = 0 qos = 0
# Random delay in seconds before measuring the values # Random delay in seconds before taking probes
# - this is used for de-synchronizing message if you run this script on many hosts. # - this is used for de-synchronizing message if you run this script on many hosts.
# - if you want a fixed delay you can remove the randrange function and just set the needed value. # - if you want a fixed delay you can remove the randrange function and just set the needed value.
# random_delay = randrange(10) # random_delay = randrange(10)
# this is the time between executiuons if the script is used as service (--service option) # Interval in seconds between probes when running the script as a service (--service option)
service_sleep_time = 120 service_sleep_time = 120
update_check_interval = 3600 # 1 hour update_check_interval = 3600 # 1 hour
cpu_load = True cpu_load = True
cpu_temp = True cpu_temp = True
@@ -61,9 +62,12 @@ memory = True
uptime = True uptime = True
uptime_seconds = False uptime_seconds = False
# Check storage devices temperatures - experimental feature, disabled by default
drive_temps = False
# Enable wifi_signal for unit of measuring % or wifi_signal_dbm for unit of meaning dBm # Enable wifi_signal for unit of measuring % or wifi_signal_dbm for unit of meaning dBm
wifi_signal = False wifi_signal = False
wifi_signal_dbm = False wifi_signal_dbm = False
# this works only on raspbery pi version 5 with stock fan # This works only on raspbery pi version 5 with stock fan
rpi5_fan_speed = False rpi5_fan_speed = False

View File

@@ -19,7 +19,7 @@ import config
import re import re
import html import html
import uuid import uuid
import glob
def check_wifi_signal(format): def check_wifi_signal(format):
try: try:
@@ -206,8 +206,41 @@ def get_mac_address():
return mac return mac
def get_hwmon_device_name(hwmon_path):
try:
with open(os.path.join(hwmon_path, 'name'), 'r') as f:
return f.read().strip()
except Exception as e:
print(f"Error reading name for {hwmon_path}: {e}")
return None
def get_hwmon_temp(hwmon_path):
try:
temp_files = glob.glob(os.path.join(hwmon_path, 'temp*_input'))
for temp_file in temp_files:
with open(temp_file, 'r') as tf:
temp = int(tf.read().strip()) / 1000.0
return temp
except Exception as e:
print(f"Error reading temperature for {hwmon_path}: {e}")
return None
def check_all_drive_temps():
drive_temps = {}
hwmon_devices = glob.glob('/sys/class/hwmon/hwmon*')
for hwmon in hwmon_devices:
device_name = get_hwmon_device_name(hwmon)
if device_name and any(keyword in device_name.lower() for keyword in ['nvme', 'sd']):
temp = get_hwmon_temp(hwmon)
if temp is not None:
drive_temps[device_name] = temp
return drive_temps
def print_measured_values(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_clock_speed=0, swap=0, memory=0, def print_measured_values(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_clock_speed=0, swap=0, memory=0,
uptime_days=0, uptime_seconds=0, wifi_signal=0, wifi_signal_dbm=0, rpi5_fan_speed=0): uptime_days=0, uptime_seconds=0, wifi_signal=0, wifi_signal_dbm=0, rpi5_fan_speed=0, drive_temps=0):
remote_version = update.check_git_version_remote(script_dir) remote_version = update.check_git_version_remote(script_dir)
output = """ output = """
:: rpi-mqtt-monitor :: rpi-mqtt-monitor
@@ -241,11 +274,19 @@ def print_measured_values(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_c
RPI5 Fan Speed: {} RPM RPI5 Fan Speed: {} RPM
Update: {} Update: {}
""".format(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, wifi_signal, wifi_signal_dbm, rpi5_fan_speed, check_git_update(script_dir)) """.format(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, wifi_signal, wifi_signal_dbm, rpi5_fan_speed, check_git_update(script_dir))
output += """Installation directory: {}
drive_temps = check_all_drive_temps()
if len(drive_temps) > 0:
for device, temp in drive_temps.items():
output += f"{device.capitalize()} Temp: {temp:.2f}°C\n"
output += """\nInstallation directory: {}
:: Release notes {}: :: Release notes {}:
{}""".format(script_dir, remote_version, get_release_notes(remote_version).strip()) {}""".format(script_dir, remote_version, get_release_notes(remote_version).strip())
print(output) print(output)
def extract_text(html_string): def extract_text(html_string):
@@ -280,7 +321,7 @@ def get_release_notes(version):
return release_notes return release_notes
def config_json(what_config): def config_json(what_config, device=0):
model_name = check_model_name() model_name = check_model_name()
manufacturer = get_manufacturer() manufacturer = get_manufacturer()
os = get_os() os = get_os()
@@ -412,6 +453,12 @@ def config_json(what_config):
data["command_topic"] = "homeassistant/update/" + hostname + "/command" data["command_topic"] = "homeassistant/update/" + hostname + "/command"
data["payload_press"] = "display_off" data["payload_press"] = "display_off"
data["device_class"] = "restart" data["device_class"] = "restart"
elif what_config == device + "_temp":
data["icon"] = "hass:thermometer"
data["name"] = device + " Temperature"
data["unit_of_measurement"] = "°C"
data["state_class"] = "measurement"
else: else:
return "" return ""
# Return our built discovery config # Return our built discovery config
@@ -471,7 +518,7 @@ def publish_update_status_to_mqtt(git_update):
def publish_to_mqtt(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_clock_speed=0, swap=0, memory=0, def publish_to_mqtt(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_clock_speed=0, swap=0, memory=0,
uptime_days=0, uptime_seconds=0, wifi_signal=0, wifi_signal_dbm=0, rpi5_fan_speed=0): uptime_days=0, uptime_seconds=0, wifi_signal=0, wifi_signal_dbm=0, rpi5_fan_speed=0, drive_temps=0):
client = create_mqtt_client() client = create_mqtt_client()
if client is None: if client is None:
return return
@@ -553,6 +600,13 @@ def publish_to_mqtt(cpu_load=0, cpu_temp=0, used_space=0, voltage=0, sys_clock_s
config_json('display_on'), qos=config.qos) config_json('display_on'), qos=config.qos)
client.publish("homeassistant/button/" + config.mqtt_topic_prefix + "/" + hostname + "_display_off/config", client.publish("homeassistant/button/" + config.mqtt_topic_prefix + "/" + hostname + "_display_off/config",
config_json('display_off'), qos=config.qos) config_json('display_off'), qos=config.qos)
if config.drive_temps:
for device, temp in drive_temps.items():
if config.discovery_messages:
client.publish("homeassistant/sensor/" + config.mqtt_topic_prefix + "/" + hostname + "_" + device + "_temp/config",
config_json(device + "_temp", device), qos=config.qos)
client.publish(config.mqtt_topic_prefix + "/" + hostname + "/" + device + "_temp", temp, qos=config.qos, retain=config.retain)
status_sensor_topic = "homeassistant/sensor/" + config.mqtt_topic_prefix + "/" + hostname + "_status/config" status_sensor_topic = "homeassistant/sensor/" + config.mqtt_topic_prefix + "/" + hostname + "_status/config"
client.publish(status_sensor_topic, config_json('status'), qos=config.qos) client.publish(status_sensor_topic, config_json('status'), qos=config.qos)
@@ -641,7 +695,7 @@ def parse_arguments():
def collect_monitored_values(): def collect_monitored_values():
cpu_load = cpu_temp = used_space = voltage = sys_clock_speed = swap = memory = uptime_seconds = uptime_days = wifi_signal = wifi_signal_dbm = rpi5_fan_speed = False cpu_load = cpu_temp = used_space = voltage = sys_clock_speed = swap = memory = uptime_seconds = uptime_days = wifi_signal = wifi_signal_dbm = rpi5_fan_speed = drive_temps = False
if config.cpu_load: if config.cpu_load:
cpu_load = check_cpu_load() cpu_load = check_cpu_load()
@@ -667,24 +721,26 @@ def collect_monitored_values():
wifi_signal_dbm = check_wifi_signal('dbm') wifi_signal_dbm = check_wifi_signal('dbm')
if config.rpi5_fan_speed: if config.rpi5_fan_speed:
rpi5_fan_speed = check_rpi5_fan_speed() rpi5_fan_speed = check_rpi5_fan_speed()
if config.drive_temps:
drive_temps = check_all_drive_temps()
return cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed return cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed, drive_temps
def gather_and_send_info(): def gather_and_send_info():
while not stop_event.is_set(): while not stop_event.is_set():
cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed = collect_monitored_values() cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed, drive_temps = collect_monitored_values()
if hasattr(config, 'random_delay'): if hasattr(config, 'random_delay'):
time.sleep(config.random_delay) time.sleep(config.random_delay)
if args.display: if args.display:
print_measured_values(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed) print_measured_values(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed, drive_temps)
if hasattr(config, 'group_messages') and config.group_messages: if hasattr(config, 'group_messages') and config.group_messages:
bulk_publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed) bulk_publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed)
else: else:
publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed) publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days, uptime_seconds, wifi_signal, wifi_signal_dbm, rpi5_fan_speed, drive_temps)
if not args.service: if not args.service:
break break