diff --git a/power.py b/power.py index 22f1454..dccde0c 100644 --- a/power.py +++ b/power.py @@ -6,6 +6,7 @@ from nut2 import PyNUTClient from email.mime.text import MIMEText from logging.handlers import TimedRotatingFileHandler +ups_id = config.UPS_ID gmail_user = config.GMAIL_USER gmail_password = config.GMAIL_PASS recipient_email = config.GMAIL_ADDR @@ -32,7 +33,10 @@ def monitor_ups(logger): client = PyNUTClient() try: ups_status = client.list_vars('ups') - return ups_status.get('ups.status') + return{ + ups_status.get('ups.status'), + 'battery_charge': float(ups_status.get('battery.charge')) + } except Exception as e: logger.error(f"Error communicating with NUT: {e}") return None @@ -56,31 +60,45 @@ def main(): logger.info("Starting UPS monitoring service.") prev_status = None while True: - status = monitor_ups(logger) - if status and status != prev_status: - if status == "OB DISCHRG": # "On Battery" - logger.warning("Outage detected! Power On Battery.") + ups_data = monitor_ups(logger) + if ups_data: + status = ups_data['status'] + battery = ups_data['battery_charge'] + if status and status != prev_status: + if status == "OB DISCHRG": + logger.warning(f"Outage detected! Power On Battery. {battery}% charge remaining.") + send_email( + f"{ups_id}: Power Outage Detected", + f"The {ups_id} UPS is running on battery power! {battery}% charge remaining.", + recipient_email, + gmail_user, + gmail_password, + logger + ) + elif status == "OL": + logger.info(f"Power On Line. {battery}% charge remaining.") + send_email( + f"{ups_id}: Power On Line", + f"{ups_id} UPS power has been restored! {battery}% charge remaining.", + recipient_email, + gmail_user, + gmail_password, + logger + ) + else: + logger.info(f"UPS status changed to: {status}") + prev_status = status + if status = "OB DISCHRG" and battery < 50: + logger.warning(f"Battery level low: {battery}% charge remaining.") send_email( - "Power Outage Detected", - "The UPS is running on battery power!", + f"{ups_id} battery low.", + f"{ups_id} battery level low: {battery}% charge remaining.", recipient_email, gmail_user, gmail_password, logger ) - elif status == "OL": # "On Line" - logger.info("Power On Line.") - send_email( - "Power On Line", - "UPS power has been restored!", - recipient_email, - gmail_user, - gmail_password, - logger - ) - else: - logger.info(f"UPS status changed to: {status}") - prev_status = status + time.sleep(30) time.sleep(5) if __name__ == "__main__":