diff --git a/alerting/alerts.py b/alerting/alerts.py index f387dc4..e403c5a 100644 --- a/alerting/alerts.py +++ b/alerting/alerts.py @@ -19,6 +19,7 @@ class AlertType(StrEnum): LOGIN = "LOGIN" # TODO SMART = "SMART" # TODO RAID = "RAID" # TODO + UPS = "UPS" class Severity(Enum): diff --git a/misc/enums.py b/misc/enums.py new file mode 100644 index 0000000..3d2cacc --- /dev/null +++ b/misc/enums.py @@ -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" + diff --git a/misc/sensors.py b/misc/sensors.py index b1b3f1b..f136847 100644 --- a/misc/sensors.py +++ b/misc/sensors.py @@ -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