first commit; screen.py works. actually in test on my machine
This commit is contained in:
parent
38619a7c16
commit
16e030a943
4 changed files with 173 additions and 1 deletions
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) <year> <owner>
|
Copyright (c) 2023 Claudio Maradonna
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
|
0
odroid_hc4_oled/__init__.py
Normal file
0
odroid_hc4_oled/__init__.py
Normal file
150
odroid_hc4_oled/screen.py
Normal file
150
odroid_hc4_oled/screen.py
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2023 Claudio Maradonna
|
||||||
|
|
||||||
|
# PYTHON_ARGCOMPLETE_OK
|
||||||
|
|
||||||
|
from luma.core.interface.serial import i2c
|
||||||
|
from luma.core.render import canvas
|
||||||
|
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
|
||||||
|
from PIL import ImageFont, ImageDraw, Image
|
||||||
|
|
||||||
|
from time import sleep
|
||||||
|
import time
|
||||||
|
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
from shutil import which
|
||||||
|
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
|
serial = i2c(port=0, address=0x3C)
|
||||||
|
device = ssd1306(serial, rotate=2)
|
||||||
|
|
||||||
|
s_width = 128
|
||||||
|
s_height = 64
|
||||||
|
|
||||||
|
def zpool_parse_data(data):
|
||||||
|
parts = re.split(r'(?:\n|^)\s*(\w*):\s*', data.strip(), re.MULTILINE)[1:]
|
||||||
|
parsed = dict(zip(parts[::2], parts[1::2]))
|
||||||
|
return {
|
||||||
|
**parsed,
|
||||||
|
'config': zpool_parse_config(parsed.get('config', ''))
|
||||||
|
}
|
||||||
|
|
||||||
|
def zpool_parse_config(data):
|
||||||
|
lines = [v.strip().split() for v in data.splitlines() if v.strip()]
|
||||||
|
if lines:
|
||||||
|
return [
|
||||||
|
dict(zip(lines[0], v))
|
||||||
|
for v in lines[1:]
|
||||||
|
]
|
||||||
|
return []
|
||||||
|
|
||||||
|
def upsc_parse_data(data):
|
||||||
|
lines = data.strip().split("\n")
|
||||||
|
result = {}
|
||||||
|
for line in lines:
|
||||||
|
key, value = line.split(": ")
|
||||||
|
result[key] = value
|
||||||
|
return result
|
||||||
|
|
||||||
|
def zpool_print_status():
|
||||||
|
zpool_status = os.popen('zpool status')
|
||||||
|
zpool_output = zpool_status.read()
|
||||||
|
|
||||||
|
zpool_status_data = zpool_parse_data(zpool_output)
|
||||||
|
|
||||||
|
zpool_list_size = os.popen('zpool list -o name,size,free')
|
||||||
|
zpool_list_output = zpool_list_size.read()
|
||||||
|
zpool_list_size_data = zpool_parse_config(zpool_list_output)
|
||||||
|
|
||||||
|
with canvas(device) as draw:
|
||||||
|
draw.text((0,0), "ZFS ->", fill=1)
|
||||||
|
|
||||||
|
pool_name = zpool_status_data["pool"]
|
||||||
|
pool_status = "ON" if zpool_status_data["state"] == "ONLINE" else "OFF"
|
||||||
|
final_pool_name = pool_name + ": " + pool_status
|
||||||
|
|
||||||
|
pool_name_width = draw.textlength(final_pool_name)
|
||||||
|
draw.text((s_width - pool_name_width, 0), final_pool_name, fill=1)
|
||||||
|
|
||||||
|
starting_height = 0
|
||||||
|
for drive in zpool_status_data["config"]:
|
||||||
|
if drive["NAME"] == pool_name:
|
||||||
|
for drive in zpool_list_size_data:
|
||||||
|
if drive["NAME"] == pool_name:
|
||||||
|
starting_height += 9
|
||||||
|
|
||||||
|
final_string = drive["FREE"] + "/" + drive["SIZE"]
|
||||||
|
fs_width = draw.textlength(final_string)
|
||||||
|
draw.text((s_width - fs_width,starting_height), final_string, fill=1)
|
||||||
|
continue
|
||||||
|
|
||||||
|
starting_height += 9
|
||||||
|
|
||||||
|
draw.text((0,starting_height), drive["NAME"], fill=1)
|
||||||
|
drive_state_width = draw.textlength(drive["STATE"])
|
||||||
|
draw.text((s_width - drive_state_width,starting_height), drive["STATE"], fill=1)
|
||||||
|
|
||||||
|
draw.text((0, s_height - 10), zpool_status_data["errors"], fill=1)
|
||||||
|
|
||||||
|
def ups_print_status():
|
||||||
|
ups_name_finder = os.popen('upsc -l 127.0.0.1')
|
||||||
|
ups_name_finder_output = ups_name_finder.read().split("\n")
|
||||||
|
|
||||||
|
ups_name = ups_name_finder_output[0]
|
||||||
|
|
||||||
|
upsc_status = os.popen('upsc ' + ups_name + '@127.0.0.1:3493')
|
||||||
|
upsc_output = upsc_status.read()
|
||||||
|
|
||||||
|
upsc_status_data = upsc_parse_data(upsc_output)
|
||||||
|
|
||||||
|
with canvas(device) as draw:
|
||||||
|
draw.text((0,0), "UPS ->", fill=1)
|
||||||
|
|
||||||
|
ups_name_width = draw.textlength(ups_name)
|
||||||
|
draw.text((s_width - ups_name_width, 0), ups_name, fill=1)
|
||||||
|
|
||||||
|
battery_charge = upsc_status_data["battery.charge"]
|
||||||
|
|
||||||
|
used_width = draw.textlength("[]%")
|
||||||
|
bar_width = (128 - used_width)
|
||||||
|
real_width = (int(battery_charge) * bar_width) / 100
|
||||||
|
|
||||||
|
draw.text((0,9), "[", fill=1)
|
||||||
|
draw.rectangle((5,13, real_width, 17), fill=1)
|
||||||
|
draw.text((bar_width, 9), "]%", fill=1)
|
||||||
|
|
||||||
|
draw.text((0, 20), upsc_status_data["device.model"], fill=1)
|
||||||
|
draw.text((0, 28), upsc_status_data["outlet.power"] + "W", fill=1)
|
||||||
|
draw.text((0, 36), upsc_status_data["output.voltage"] + "V", fill=1)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if which('zpool') is None:
|
||||||
|
print("Cannot find `zpool` executable.")
|
||||||
|
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
if which('upsc') is None:
|
||||||
|
print("Cannot find `upsc` executable.")
|
||||||
|
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
start_count = 0
|
||||||
|
while True:
|
||||||
|
device.clear()
|
||||||
|
|
||||||
|
if (start_count % 2) == 0:
|
||||||
|
zpool_print_status()
|
||||||
|
else:
|
||||||
|
ups_print_status()
|
||||||
|
|
||||||
|
start_count += 1
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
main()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
22
setup.py
Normal file
22
setup.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name = 'odroid-hc4-oled',
|
||||||
|
version = '0.1',
|
||||||
|
description = 'ODROID LCD panel script',
|
||||||
|
author = 'Claudio Maradonna',
|
||||||
|
author_email = 'claudio@unitoo.pw',
|
||||||
|
license = 'BSD2',
|
||||||
|
install_requires = [
|
||||||
|
'luma.core >= 1.17.1',
|
||||||
|
'luma.oled >= 3.6.0',
|
||||||
|
'luma.lcd >= 2.5.0',
|
||||||
|
],
|
||||||
|
packages = [
|
||||||
|
'odroid_hc4_oled'
|
||||||
|
],
|
||||||
|
entry_points = {
|
||||||
|
'console_scripts' : [
|
||||||
|
'odroid_hc4_oled = odroid_hc4_oled.screen:main']
|
||||||
|
},
|
||||||
|
zip_safe = False)
|
Loading…
Reference in a new issue