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 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,23 +60,26 @@ def main():
logger.info("Starting UPS monitoring service.")
prev_status = None
while True:
status = monitor_ups(logger)
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": # "On Battery"
logger.warning("Outage detected! Power On Battery.")
if status == "OB DISCHRG":
logger.warning(f"Outage detected! Power On Battery. {battery}% charge remaining.")
send_email(
"Power Outage Detected",
"The UPS is running on battery power!",
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": # "On Line"
logger.info("Power On Line.")
elif status == "OL":
logger.info(f"Power On Line. {battery}% charge remaining.")
send_email(
"Power On Line",
"UPS power has been restored!",
f"{ups_id}: Power On Line",
f"{ups_id} UPS power has been restored! {battery}% charge remaining.",
recipient_email,
gmail_user,
gmail_password,
@ -81,6 +88,17 @@ def main():
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(
f"{ups_id} battery low.",
f"{ups_id} battery level low: {battery}% charge remaining.",
recipient_email,
gmail_user,
gmail_password,
logger
)
time.sleep(30)
time.sleep(5)
if __name__ == "__main__":