File: dstat_battery.py

package info (click to toggle)
dstat 0.7.4-6.1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 1,608 kB
  • sloc: python: 5,964; makefile: 70; sh: 3
file content (71 lines) | stat: -rw-r--r-- 2,648 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
### Author: Dag Wieers <dag$wieers,com>
### Author: Sven-Hendrik Haase <sh@lutzhaase.com>

class dstat_plugin(dstat):
    """
    Percentage of remaining battery power as reported by ACPI.
    """
    def __init__(self):
        self.name = 'battery'
        self.type = 'p'
        self.width = 4
        self.scale = 34
        self.battery_type = "none"

    def check(self):
        if os.path.exists('/proc/acpi/battery/'):
            self.battery_type = "procfs"
        elif glob.glob('/sys/class/power_supply/BAT*'):
            self.battery_type = "sysfs"
        else:
            raise Exception('No ACPI battery information found.')

    def vars(self):
        ret = []
        if self.battery_type == "procfs":
            for battery in os.listdir('/proc/acpi/battery/'):
                for line in dopen('/proc/acpi/battery/'+battery+'/state').readlines():
                    l = line.split()
                    if len(l) < 2: continue
                    if l[0] == 'present:' and l[1] == 'yes':
                        ret.append(battery)
        elif self.battery_type == "sysfs":
            for battery in glob.glob('/sys/class/power_supply/BAT*'):
                for line in dopen(battery+'/present').readlines():
                    if int(line[0]) == 1:
                        ret.append(os.path.basename(battery))
        ret.sort()
        return ret

    def nick(self):
        return [name.lower() for name in self.vars]

    def extract(self):
        for battery in self.vars:
            if self.battery_type == "procfs":
                for line in dopen('/proc/acpi/battery/'+battery+'/info').readlines():
                    l = line.split()
                    if len(l) < 4: continue
                    if l[0] == 'last':
                        full = int(l[3])
                        break
                for line in dopen('/proc/acpi/battery/'+battery+'/state').readlines():
                    l = line.split()
                    if len(l) < 3: continue
                    if l[0] == 'remaining':
                        current = int(l[2])
                        break
                if current:
                    self.val[battery] = current * 100.0 / full
                else:
                    self.val[battery] = -1
            elif self.battery_type == "sysfs":
                for line in dopen('/sys/class/power_supply/'+battery+'/capacity').readlines():
                    current = int(line)
                    break
                if current:
                    self.val[battery] = current
                else:
                    self.val[battery] = -1

# vim:ts=4:sw=4:et