This commit is contained in:
crate 2024-10-09 14:10:57 +00:00
parent 02c3f7a18e
commit a4997efc3f

View File

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