"""Base class for UPS drivers.""" from abc import ABC, abstractmethod from dataclasses import dataclass from typing import Optional @dataclass class UPSData: """Battery data from UPS hardware.""" percentage: float # 0-100% voltage: float # mV current: float # A (positive=charging, negative=discharging) is_charging: bool temperature: Optional[float] = None # Celsius time_remaining: Optional[int] = None # Minutes class UPSDriver(ABC): """Abstract base class for UPS hardware drivers.""" @abstractmethod async def initialize(self) -> bool: """Initialize connection to UPS hardware. Returns: True if initialization successful, False otherwise """ pass @abstractmethod async def read_data(self) -> UPSData: """Read current battery data from UPS. Returns: UPSData object with current readings """ pass @abstractmethod async def is_available(self) -> bool: """Check if UPS hardware is available. Returns: True if hardware is accessible, False otherwise """ pass @abstractmethod def close(self): """Close connection to UPS hardware.""" pass @abstractmethod def get_model_name(self) -> str: """Get the UPS model/type name. Returns: Human-readable model name """ pass