parse UPS data

This commit is contained in:
saqriphnix 2024-08-16 23:08:28 +03:00
parent aac320a0c8
commit fd2624040c
3 changed files with 53 additions and 5 deletions

View file

@ -19,6 +19,7 @@ class AlertType(StrEnum):
LOGIN = "LOGIN" # TODO
SMART = "SMART" # TODO
RAID = "RAID" # TODO
UPS = "UPS"
class Severity(Enum):

20
misc/enums.py Normal file
View file

@ -0,0 +1,20 @@
from enum import StrEnum
class UPSStatus(StrEnum):
"""https://networkupstools.org/docs/developer-guide.chunked/new-drivers.html#_status_data
"""
ON_LINE = "OL"
ON_BATTERY = "OB"
BATTERY_LOW = "LB"
BATTERY_HIGH = "HB"
BATTERY_REPLACE = "RB"
BATTERY_CHARGING = "CHRG"
BATTERY_DISCHARGING = "DISCHRG"
UPS_BYPASS = "BYPASS"
"""Battery and connected devices are not protected from power outage!"""
UPS_OFFLINE = "OFF"
UPS_OVERLOAD = "OVER"
UPS_CALIBRATION = "CAL"

View file

@ -1,7 +1,10 @@
import subprocess
from dataclasses import dataclass
from psutil import cpu_percent, sensors_temperatures, virtual_memory
from .enums import UPSStatus
@dataclass
class TemperatureSensor:
@ -27,6 +30,14 @@ class RamSensor:
critical_avail: int = 2 * 1024**3
@dataclass
class UPSSensor:
ups_status: UPSStatus = None
battery_charge_percentage: int = None
battery_warning_percentage: int = 20
battery_critical_percentage: int = 10
class Sensors:
@staticmethod
def get_temperatures() -> dict[str, list[TemperatureSensor]]:
@ -96,10 +107,26 @@ class Sensors:
@staticmethod
def get_ram() -> RamSensor:
ram = virtual_memory()
return RamSensor(current_avail=ram.available,
current_avail_percentage=ram.percent)
return RamSensor(current_avail=ram.available, current_avail_percentage=ram.percent)
@staticmethod
def get_ups() -> UPSSensor:
raw_data = subprocess.run(["upsc", "cp1300"], stdout=subprocess.PIPE, encoding="utf-8")
if __name__ == "__main__":
for i in Sensors.get_temperatures():
print(i)
sensor_data = UPSSensor()
for line in raw_data.stdout.splitlines():
sensor, value = line.split(": ")[:2]
match sensor:
case "battery.charge":
sensor_data.battery_charge_percentage = int(value)
case "battery.charge.low":
sensor_data.battery_critical_percentage = int(value)
case "battery.charge.warning":
sensor_data.battery_warning_percentage = int(value)
case "ups.status":
sensor_data.ups_status = UPSStatus(value)
case _:
...
return sensor_data