This commit is contained in:
crate 2024-10-08 17:24:23 -05:00
commit a0159948e8
3 changed files with 123 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
# ignore please
__pycache__/
*.log*
config.py

30
mailtest.py Normal file
View File

@ -0,0 +1,30 @@
import smtplib
from email.mime.text import MIMEText
gmail_user = 'aaron@crate.zip'
gmail_password = 'mjir axgh nzdy goxx'
recipient_email = 'crateimage@gmail.com'
def send_email(subject, body, recipient_email, gmail_user, gmail_password):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = gmail_user
msg['To'] = recipient_email
try:
with smtplib.SMTP('smtp.gmail.com', 587) as server:
server.starttls()
server.login(gmail_user, gmail_password)
server.send_message(msg)
print("Message sent.")
except Exception as e:
print(f"Failed to send email: {e}")
send_email(
"Power Outage Detected",
"The UPS is running on battery power!",
recipient_email,
gmail_user,
gmail_password
)

88
power.py Normal file
View File

@ -0,0 +1,88 @@
import time
import config
import logging
import smtplib
from nut2 import PyNUTClient
from email.mime.text import MIMEText
from logging.handlers import TimedRotatingFileHandler
gmail_user = config.GMAIL_USER
gmail_password = config.GMAIL_PASS
recipient_email = config.GMAIL_ADDR
def setup_logging():
logger = logging.getLogger('powerlog')
logger.setLevel(logging.INFO)
handler = TimedRotatingFileHandler(
'power.log',
when='midnight',
interval=1,
backupCount=7,
delay=True
)
formatter = logging.Formatter(
'%(asctime)s [%(levelname)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
def monitor_ups(logger):
client = PyNUTClient()
try:
ups_status = client.list_vars('ups')
return ups_status.get('ups.status')
except Exception as e:
logger.error(f"Error communicating with NUT: {e}")
return None
def send_email(subject, body, recipient_email, gmail_user, gmail_password, logger):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = gmail_user
msg['To'] = recipient_email
try:
with smtplib.SMTP('smtp.gmail.com', 587) as server:
server.starttls()
server.login(gmail_user, gmail_password)
server.send_message(msg)
logger.info(f"Email message sent: {subject}")
except Exception as e:
logger.info(f"Failed to send email: {e}")
def main():
logger = setup_logging()
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.")
send_email(
"Power Outage Detected",
"The UPS is running on battery power!",
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(5)
if __name__ == "__main__":
main()