git.sophuwu.com > hwmongo
added thiny to git after seeing it's useful
sophuwu sophie@sophuwu.com
Sun, 02 Nov 2025 12:56:10 +0100
commit

8283d340f4b3531d2a8daa69f2659661d3eef0a2

4 files changed, 172 insertions(+), 0 deletions(-)

jump to
A .gitignore

@@ -0,0 +1,1 @@

+build
A bat.py

@@ -0,0 +1,42 @@

+#!/bin/python3 +import os + +os.chdir("/sys/class/hwmon") + +def ezrd(file): + with open(file,"r") as f: + s=f.read() + return s.strip() + +battery="" + +for i in os.listdir(): + if "bat" in ezrd(i+"/name").lower(): + battery=i + break + +if len(battery)==0: exit(1) + +try: os.chdir(battery+"/device/") +except: exit(1) + +n=0 +def maxtally(c): + global n + if len(c)>n: n = len(c) + return c + +def notDirLink(i): + return os.st.S_ISREG(i) + #return not (os.st.S_ISDIR(i) or os.st.S_ISLNK(i)) + +l=[maxtally(i) for i in os.listdir() if notDirLink(os.stat(i).st_mode)] +l.sort() + +n=n+2 + + +for i in l: + cont = ezrd(i) + if "\n" in cont: continue + print(i.rjust(n),cont,sep=": ")
A go.mod

@@ -0,0 +1,3 @@

+module hwmon + +go 1.25.1
A hwmon.go

@@ -0,0 +1,126 @@

+package main + +import ( + "encoding/json" + "fmt" + "os" + "strings" +) + +const HWPATH = "/sys/class/hwmon" + +func ReadHwDir(path string) (map[string]string, error) { + dir, err := os.ReadDir(path) + if err != nil { + return nil, err + } + h := make(map[string]string) + var f *os.File + var n int + var r rune + var s string + buff := make([]byte, 32) + for _, d := range dir { + if d.Type().IsRegular() && d.Name() != "uevent" { + f, err = os.OpenFile(path+"/"+d.Name(), os.O_RDONLY, 0) + if err != nil { + continue + } + n, err = f.Read(buff) + if err != nil { + continue + } + // only ascii values + s = "" + for _, r = range string(buff[:n]) { + if r == '\n' || r == '\r' || r < 32 || r > 126 { + continue + } + s += string(r) + } + h[d.Name()] = strings.TrimSuffix(s, "\n") + } + } + return h, nil +} + +var doExtra bool = false +var doJson bool = false + +func ReadHwMon() (map[string]map[string]string, error) { + dir, err := os.ReadDir(HWPATH) + if err != nil { + return nil, err + } + var hwDir = make(map[string]string) + var hwMon = make(map[string]map[string]string) + var name string + for _, d := range dir { + hwDir, err = ReadHwDir(HWPATH + "/" + d.Name()) + if err != nil { + continue + } + if doExtra { + var hwDir2 map[string]string + hwDir2, err = ReadHwDir(HWPATH + "/" + d.Name() + "/device/") + if err != nil { + continue + } + for k, v := range hwDir2 { + hwDir["device_"+k] = v + } + } + hwDir["path"] = HWPATH + "/" + d.Name() + if name = hwDir["name"]; name == "" { + name = d.Name() + } + hwMon[name] = hwDir + } + return hwMon, nil +} + +func init() { + for _, arg := range os.Args[1:] { + if arg == "--extra" { + doExtra = true + } + if arg == "--help" || arg == "-h" { + fmt.Println("Usage: hwmon [--extra] [--json] [--help|-h]") + fmt.Println("Read hardware monitoring information from /sys/class/hwmon") + fmt.Println("--extra: get extra details from device subdirectory") + fmt.Println("--json: output in JSON format") + fmt.Println("--help|-h: show this help message") + os.Exit(0) + } + if arg == "--json" { + doJson = true + } + } +} + +func main() { + hwMon, err := ReadHwMon() + if err != nil { + fmt.Println(err) + } + if doJson { + var b []byte + b, err = json.MarshalIndent(hwMon, "", " ") + if err != nil { + fmt.Println(err) + } + fmt.Println(string(b)) + return + } + + var key, val string + for i := range hwMon { + fmt.Printf("%s:\n", i) + for key, val = range hwMon[i] { + fmt.Printf("\t%s: %s\n", key, val) + } + } + if !doExtra { + fmt.Println("\nuse flag --extra to get more details") + } +}