Standalone sensor monitor working again
This commit is contained in:
parent
46080b4363
commit
5405b97eb1
4 changed files with 56 additions and 164 deletions
|
|
@ -5,7 +5,7 @@ import json
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from functions.common import *
|
from functions.tmux import *
|
||||||
|
|
||||||
# STATIC VARIABLES
|
# STATIC VARIABLES
|
||||||
TEMP_LIMITS = {
|
TEMP_LIMITS = {
|
||||||
|
|
@ -153,6 +153,18 @@ def get_temp_str(temp, colors=True):
|
||||||
'-' if temp < 0 else '',
|
'-' if temp < 0 else '',
|
||||||
temp)
|
temp)
|
||||||
|
|
||||||
|
def monitor_sensors(monitor_pane, monitor_file):
|
||||||
|
"""Continually update sensor data and report to screen."""
|
||||||
|
sensor_data = get_sensor_data()
|
||||||
|
while True:
|
||||||
|
update_sensor_data(sensor_data)
|
||||||
|
with open(monitor_file, 'w') as f:
|
||||||
|
report = generate_report(sensor_data, 'Current', 'Max')
|
||||||
|
f.write('\n'.join(report))
|
||||||
|
sleep(1)
|
||||||
|
if not tmux_poll_pane(monitor_pane):
|
||||||
|
break
|
||||||
|
|
||||||
def save_average_temp(sensor_data, temp_label, seconds=10):
|
def save_average_temp(sensor_data, temp_label, seconds=10):
|
||||||
"""Calculate average temps and record under temp_label, returns dict."""
|
"""Calculate average temps and record under temp_label, returns dict."""
|
||||||
clear_temps(sensor_data)
|
clear_temps(sensor_data)
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,13 @@ def tmux_kill_pane(*panes):
|
||||||
print(pane_id)
|
print(pane_id)
|
||||||
run_program(cmd+[pane_id], check=False)
|
run_program(cmd+[pane_id], check=False)
|
||||||
|
|
||||||
|
def tmux_poll_pane(pane_id):
|
||||||
|
"""Check if pane exists, returns bool."""
|
||||||
|
cmd = ['tmux', 'list-panes', '-F', '#D']
|
||||||
|
result = run_program(cmd, check=False)
|
||||||
|
panes = result.stdout.decode().splitlines()
|
||||||
|
return pane_id in panes
|
||||||
|
|
||||||
def tmux_split_window(
|
def tmux_split_window(
|
||||||
lines=None, percent=None,
|
lines=None, percent=None,
|
||||||
behind=False, vertical=False,
|
behind=False, vertical=False,
|
||||||
|
|
|
||||||
|
|
@ -1,168 +1,10 @@
|
||||||
#!/bin/python3
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
## Wizard Kit: Sensor monitoring tool
|
## Wizard Kit: Sensor monitoring tool
|
||||||
|
|
||||||
import itertools
|
WINDOW_NAME="Hardware Sensors"
|
||||||
import os
|
MONITOR="hw-sensors-monitor"
|
||||||
import shutil
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Init
|
# Start session
|
||||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
tmux new-session -n "$WINDOW_NAME" "$MONITOR"
|
||||||
sys.path.append(os.getcwd())
|
|
||||||
from functions.common import *
|
|
||||||
from borrowed import sensors
|
|
||||||
|
|
||||||
# STATIC VARIABLES
|
|
||||||
COLORS = {
|
|
||||||
'CLEAR': '\033[0m',
|
|
||||||
'RED': '\033[31m',
|
|
||||||
'GREEN': '\033[32m',
|
|
||||||
'YELLOW': '\033[33m',
|
|
||||||
'ORANGE': '\033[31;1m',
|
|
||||||
'BLUE': '\033[34m'
|
|
||||||
}
|
|
||||||
TEMP_LIMITS = {
|
|
||||||
'GREEN': 60,
|
|
||||||
'YELLOW': 70,
|
|
||||||
'ORANGE': 80,
|
|
||||||
'RED': 90,
|
|
||||||
}
|
|
||||||
|
|
||||||
# REGEX
|
|
||||||
REGEX_COLORS = re.compile(r'\033\[\d+;?1?m')
|
|
||||||
|
|
||||||
def color_temp(temp):
|
|
||||||
try:
|
|
||||||
temp = float(temp)
|
|
||||||
except ValueError:
|
|
||||||
return '{YELLOW}{temp}{CLEAR}'.format(temp=temp, **COLORS)
|
|
||||||
if temp > TEMP_LIMITS['RED']:
|
|
||||||
color = COLORS['RED']
|
|
||||||
elif temp > TEMP_LIMITS['ORANGE']:
|
|
||||||
color = COLORS['ORANGE']
|
|
||||||
elif temp > TEMP_LIMITS['YELLOW']:
|
|
||||||
color = COLORS['YELLOW']
|
|
||||||
elif temp > TEMP_LIMITS['GREEN']:
|
|
||||||
color = COLORS['GREEN']
|
|
||||||
elif temp > 0:
|
|
||||||
color = COLORS['BLUE']
|
|
||||||
else:
|
|
||||||
color = COLORS['CLEAR']
|
|
||||||
return '{color}{prefix}{temp:2.0f}°C{CLEAR}'.format(
|
|
||||||
color = color,
|
|
||||||
prefix = '-' if temp < 0 else '',
|
|
||||||
temp = temp,
|
|
||||||
**COLORS)
|
|
||||||
|
|
||||||
def get_feature_string(chip, feature):
|
|
||||||
sfs = list(sensors.SubFeatureIterator(chip, feature)) # get a list of all subfeatures
|
|
||||||
label = sensors.get_label(chip, feature)
|
|
||||||
skipname = len(feature.name)+1 # skip common prefix
|
|
||||||
data = {}
|
|
||||||
|
|
||||||
if feature.type != sensors.feature.TEMP:
|
|
||||||
# Skip non-temperature sensors
|
|
||||||
return None
|
|
||||||
|
|
||||||
for sf in sfs:
|
|
||||||
name = sf.name[skipname:].decode("utf-8").strip()
|
|
||||||
try:
|
|
||||||
val = sensors.get_value(chip, sf.number)
|
|
||||||
except Exception:
|
|
||||||
# Ignore upstream sensor bugs and lie instead
|
|
||||||
val = -123456789
|
|
||||||
if 'alarm' in name:
|
|
||||||
# Skip
|
|
||||||
continue
|
|
||||||
if '--nocolor' in sys.argv:
|
|
||||||
try:
|
|
||||||
temp = float(val)
|
|
||||||
except ValueError:
|
|
||||||
data[name] = ' {}°C'.format(val)
|
|
||||||
else:
|
|
||||||
data[name] = '{}{:2.0f}°C'.format(
|
|
||||||
'-' if temp < 0 else '',
|
|
||||||
temp)
|
|
||||||
else:
|
|
||||||
data[name] = color_temp(val)
|
|
||||||
|
|
||||||
main_temp = data.pop('input', None)
|
|
||||||
if main_temp:
|
|
||||||
list_data = []
|
|
||||||
for item in ['max', 'crit']:
|
|
||||||
if item in data:
|
|
||||||
list_data.append('{}: {}'.format(item, data.pop(item)))
|
|
||||||
list_data.extend(
|
|
||||||
['{}: {}'.format(k, v) for k, v in sorted(data.items())])
|
|
||||||
data_str = '{:18} {} {}'.format(
|
|
||||||
label, main_temp, ', '.join(list_data))
|
|
||||||
else:
|
|
||||||
list_data.extend(sorted(data.items()))
|
|
||||||
list_data = ['{}: {}'.format(item[0], item[1]) for item in list_data]
|
|
||||||
data_str = '{:18} {}'.format(label, ', '.join(list_data))
|
|
||||||
return data_str
|
|
||||||
|
|
||||||
def join_columns(column1, column2, width=55):
|
|
||||||
return '{:<{}}{}'.format(
|
|
||||||
column1,
|
|
||||||
55+len(column1)-len(REGEX_COLORS.sub('', column1)),
|
|
||||||
column2)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
# Prep
|
|
||||||
sensors.init()
|
|
||||||
|
|
||||||
# Get sensor data
|
|
||||||
chip_temps = {}
|
|
||||||
for chip in sensors.ChipIterator():
|
|
||||||
chip_name = '{} ({})'.format(
|
|
||||||
sensors.chip_snprintf_name(chip),
|
|
||||||
sensors.get_adapter_name(chip.bus))
|
|
||||||
chip_feats = [get_feature_string(chip, feature)
|
|
||||||
for feature in sensors.FeatureIterator(chip)]
|
|
||||||
# Strip empty/None items
|
|
||||||
chip_feats = [f for f in chip_feats if f]
|
|
||||||
|
|
||||||
if chip_feats:
|
|
||||||
chip_temps[chip_name] = [chip_name, *chip_feats, '']
|
|
||||||
|
|
||||||
# Sort chips
|
|
||||||
sensor_temps = []
|
|
||||||
for chip in [k for k in sorted(chip_temps.keys()) if 'coretemp' in k]:
|
|
||||||
sensor_temps.extend(chip_temps[chip])
|
|
||||||
for chip in sorted(chip_temps.keys()):
|
|
||||||
if 'coretemp' not in chip:
|
|
||||||
sensor_temps.extend(chip_temps[chip])
|
|
||||||
|
|
||||||
# Wrap columns as needed
|
|
||||||
screen_size = shutil.get_terminal_size()
|
|
||||||
rows = screen_size.lines - 1
|
|
||||||
if len(sensor_temps) > rows and screen_size.columns > 55*2:
|
|
||||||
sensor_temps = list(itertools.zip_longest(
|
|
||||||
sensor_temps[:rows], sensor_temps[rows:], fillvalue=''))
|
|
||||||
sensor_temps = [join_columns(a, b) for a, b in sensor_temps]
|
|
||||||
|
|
||||||
# Print data
|
|
||||||
if sensor_temps:
|
|
||||||
for line in sensor_temps:
|
|
||||||
print_standard(line)
|
|
||||||
else:
|
|
||||||
if '--nocolor' in sys.argv:
|
|
||||||
print_standard('WARNING: No sensors found')
|
|
||||||
print_standard('\nPlease monitor temps manually')
|
|
||||||
else:
|
|
||||||
print_warning('WARNING: No sensors found')
|
|
||||||
print_standard('\nPlease monitor temps manually')
|
|
||||||
|
|
||||||
# Done
|
|
||||||
sensors.cleanup()
|
|
||||||
exit_script()
|
|
||||||
except SystemExit:
|
|
||||||
sensors.cleanup()
|
|
||||||
pass
|
|
||||||
except:
|
|
||||||
sensors.cleanup()
|
|
||||||
major_exception()
|
|
||||||
|
|
||||||
|
|
|
||||||
31
.bin/Scripts/hw-sensors-monitor
Executable file
31
.bin/Scripts/hw-sensors-monitor
Executable file
|
|
@ -0,0 +1,31 @@
|
||||||
|
#!/bin/python3
|
||||||
|
#
|
||||||
|
## Wizard Kit: Sensor monitoring tool
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Init
|
||||||
|
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||||
|
sys.path.append(os.getcwd())
|
||||||
|
from functions.sensors import *
|
||||||
|
from functions.tmux import *
|
||||||
|
init_global_vars()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
result = run_program(['mktemp'])
|
||||||
|
monitor_file = result.stdout.decode().strip()
|
||||||
|
print(monitor_file)
|
||||||
|
monitor_pane = tmux_split_window(
|
||||||
|
percent=1, vertical=True, watch=monitor_file)
|
||||||
|
cmd = ['tmux', 'resize-pane', '-Z', '-t', monitor_pane]
|
||||||
|
run_program(cmd, check=False)
|
||||||
|
monitor_sensors(monitor_pane, monitor_file)
|
||||||
|
exit_script()
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
except:
|
||||||
|
major_exception()
|
||||||
|
|
||||||
|
# vim: sts=2 sw=2 ts=2
|
||||||
Loading…
Reference in a new issue