vault backup: 2026-09-19 19:31:49
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import time, os
|
||||
from luma.core.interface.serial import i2c
|
||||
from luma.oled.device import ssd1306
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
serial = i2c(port=1, address=0x3C)
|
||||
device = ssd1306(serial)
|
||||
font = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf', 10)
|
||||
font_big = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 16)
|
||||
device.cleanup = lambda: None
|
||||
|
||||
|
||||
def get_cpu():
|
||||
with open('/proc/loadavg') as f:
|
||||
parts = f.read().split()
|
||||
load = float(parts[0])
|
||||
cores = os.cpu_count() or 4
|
||||
percent = (load / cores) * 100
|
||||
return min(percent, 100), load
|
||||
|
||||
|
||||
def get_ram():
|
||||
with open('/proc/meminfo') as f:
|
||||
lines = f.readlines()
|
||||
mem_total = int([l for l in lines if 'MemTotal' in l][0].split()[1])
|
||||
mem_avail = int([l for l in lines if 'MemAvailable' in l][0].split()[1])
|
||||
used = mem_total - mem_avail
|
||||
return used / mem_total * 100, used // 1024, mem_total // 1024
|
||||
|
||||
|
||||
def get_temp():
|
||||
try:
|
||||
with open('/sys/class/thermal/thermal_zone0/temp') as f:
|
||||
return int(f.read()) / 1000
|
||||
except:
|
||||
return 0
|
||||
|
||||
|
||||
while True:
|
||||
cpu_pct, load = get_cpu()
|
||||
ram_pct, used_mb, total_mb = get_ram()
|
||||
temp = get_temp()
|
||||
|
||||
img = Image.new('1', device.size, 'black')
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
draw.rectangle((0, 0, 127, 63), outline='white', fill='black')
|
||||
|
||||
bar_w = 90
|
||||
bar_h = 12
|
||||
|
||||
# CPU bar
|
||||
draw.rectangle((32, 4, 32 + bar_w, 4 + bar_h), outline='white', fill='black')
|
||||
fill_w = int(bar_w * cpu_pct / 100)
|
||||
if fill_w > 0:
|
||||
draw.rectangle((32 + 1, 4 + 1, 32 + fill_w, 4 + bar_h - 1), fill='white')
|
||||
draw.text((2, 5), 'CPU', font=font, fill='white')
|
||||
draw.text((32 + bar_w + 4, 3), f'{cpu_pct:.0f}%', font=font_big, fill='white')
|
||||
draw.text((2, 20), f'Load: {load:.2f}', font=font, fill='white')
|
||||
|
||||
# RAM bar
|
||||
draw.rectangle((32, 36, 32 + bar_w, 36 + bar_h), outline='white', fill='black')
|
||||
fill_w2 = int(bar_w * ram_pct / 100)
|
||||
if fill_w2 > 0:
|
||||
draw.rectangle((32 + 1, 36 + 1, 32 + fill_w2, 36 + bar_h - 1), fill='white')
|
||||
draw.text((2, 38), 'RAM', font=font, fill='white')
|
||||
draw.text((32 + bar_w + 4, 36), f'{ram_pct:.0f}%', font=font_big, fill='white')
|
||||
|
||||
# Temp and PID at bottom
|
||||
draw.text((2, 52), f'Temp: {temp:.1f}C', font=font, fill='white')
|
||||
draw.text((72, 52), f'PID: {os.getpid()}', font=font, fill='white')
|
||||
|
||||
device.display(img)
|
||||
time.sleep(1)
|
||||
Reference in New Issue
Block a user