[+] update Battery service

This commit is contained in:
Siarhei Siniak 2025-09-11 13:43:45 +03:00
parent a666658e0b
commit f4f579b8f1
2 changed files with 147 additions and 122 deletions

@ -5,7 +5,7 @@ project(
).stdout().strip('\n'), ).stdout().strip('\n'),
# 'online.fxreader.uv', # 'online.fxreader.uv',
# ['c', 'cpp'], # ['c', 'cpp'],
version: '0.1.5.27', version: '0.1.5.28',
# default_options: [ # default_options: [
# 'cpp_std=c++23', # 'cpp_std=c++23',
# # 'prefer_static=true', # # 'prefer_static=true',

@ -2047,6 +2047,152 @@ def loginctl(argv: list[str]) -> None:
raise NotImplementedError raise NotImplementedError
class Battery:
def __init__(
self,
should_start=None,
):
if should_start is None:
should_start = False
assert isinstance(should_start, bool)
self.last_check = None
self.period = 10
self.is_running = should_start
def check_is_needed(self):
now = datetime.datetime.now(tz=datetime.timezone.utc)
is_needed = None
if self.last_check is None:
is_needed = True
else:
if (now - self.last_check).total_seconds() >= self.period:
is_needed = True
else:
is_needed = False
if is_needed:
self.last_check = now
return is_needed
def run(self):
while True:
self.check()
time.sleep(self.period)
def terminate(self):
self.is_running = False
def wait(self, *args, **kwargs):
if self.is_running:
raise NotImplementedError
def poll(self):
if self.is_running:
return None
else:
return 0
@property
def percentage_low(self) -> int:
try:
return int(
subprocess.check_output(
r"""
cat /etc/UPower/UPower.conf | grep -Po '^PercentageLow=\d+'
""",
shell=True,
)
.decode('utf-8')
.strip()
.split('=')[1]
)
except:
logger.exception('')
return 15
@property
def percentage_critical(self) -> int:
try:
return int(
subprocess.check_output(
r"""
cat /etc/UPower/UPower.conf | grep -Po '^PercentageCritical=\d+'
""",
shell=True,
)
.decode('utf-8')
.strip()
.split('=')[1]
)
except:
logger.exception('')
return 10
def check(self):
try:
if not self.check_is_needed():
return
t1 = subprocess.check_output(
['upower', '-d'],
timeout=1,
).decode('utf-8')
t2 = [o for o in t1.splitlines() if 'percentage' in o.lower()]
t4 = [o for o in t1.splitlines() if 'state' in o.lower()]
t3 = float(t2[0].split(':')[1].strip()[:-1])
# t5 = any(['discharging' in o.lower() for o in t4])
state = [[o2.strip() for o2 in o.lower().split()][1] for o in t4][1]
t5 = state != 'charging'
# t5 = True
if t3 < self.percentage_critical:
logging.error(
json.dumps(
dict(
msg='too low',
t3=t3,
t5=t5,
state=state,
)
)
)
if t5:
subprocess.check_call(['systemctl', 'suspend'])
elif t3 < self.percentage_low:
msg = 'battery near low'
logging.error(
json.dumps(
dict(
msg=msg,
t3=t3,
t5=t5,
state=state,
)
)
)
if t5:
subprocess.check_call(
[
'notify-send',
'-t',
'%d' % (5 * 1000),
msg,
'% 5.2f' % t3,
]
)
else:
pass
print('\r%s % 5.2f%% %s' % (datetime.datetime.now().isoformat(), t3, str(t5)), end='')
except Exception:
logging.error(traceback.format_exc())
def desktop_services(argv): def desktop_services(argv):
parser = optparse.OptionParser() parser = optparse.OptionParser()
parser.add_option( parser.add_option(
@ -2185,127 +2331,6 @@ def desktop_services(argv):
return len(t3) > 0 and t4 return len(t3) > 0 and t4
class Battery:
def __init__(
self,
should_start=None,
):
if should_start is None:
should_start = False
assert isinstance(should_start, bool)
self.last_check = None
self.period = 10
self.is_running = should_start
def check_is_needed(self):
now = datetime.datetime.now(tz=datetime.timezone.utc)
is_needed = None
if self.last_check is None:
is_needed = True
else:
if (now - self.last_check).total_seconds() >= self.period:
is_needed = True
else:
is_needed = False
if is_needed:
self.last_check = now
return is_needed
def run(self):
while True:
self.check()
time.sleep(self.period)
def terminate(self):
self.is_running = False
def wait(self, *args, **kwargs):
if self.is_running:
raise NotImplementedError
def poll(self):
if self.is_running:
return None
else:
return 0
@property
def percentage_low(self) -> int:
try:
return int(
subprocess.check_output(
r"""
cat /etc/UPower/UPower.conf | grep -Po '^PercentageLow=\d+'
""",
shell=True,
)
.decode('utf-8')
.strip()
.split('=')[1]
)
except:
logger.exception('')
return 15
@property
def percentage_critical(self) -> int:
try:
return int(
subprocess.check_output(
r"""
cat /etc/UPower/UPower.conf | grep -Po '^PercentageCritical=\d+'
""",
shell=True,
)
.decode('utf-8')
.strip()
.split('=')[1]
)
except:
logger.exception('')
return 10
def check(self):
try:
if not self.check_is_needed():
return
t1 = subprocess.check_output(
['upower', '-d'],
timeout=1,
).decode('utf-8')
t2 = [o for o in t1.splitlines() if 'percentage' in o.lower()]
t4 = [o for o in t1.splitlines() if 'state' in o.lower()]
t3 = float(t2[0].split(':')[1].strip()[:-1])
t5 = any(['discharging' in o.lower() for o in t4])
if t3 < self.percentage_critical and t5:
logging.error(json.dumps(dict(msg='too low', t3=t3, t5=t5)))
subprocess.check_call(['systemctl', 'suspend'])
elif t3 < self.percentage_low and t5:
msg = 'battery near low'
logging.error(json.dumps(dict(msg=msg, t3=t3, t5=t5)))
subprocess.check_call(
[
'notify-send',
'-t',
'%d' % (5 * 1000),
msg,
'% 5.2f' % t3,
]
)
else:
pass
print('\r%s % 5.2f%% %s' % (datetime.datetime.now().isoformat(), t3, str(t5)), end='')
except Exception:
logging.error(traceback.format_exc())
class Backlight: class Backlight:
class Direction(enum.Enum): class Direction(enum.Enum):
increase = 'increase' increase = 'increase'