import smtplib from email.mime.text import MIMEText import configparser import logging class AlertManager: def __init__(self, config): self.logger = logging.getLogger('hydrobot') self.from_addr = config.get("alerts", "from_address") self.to_addr = config.get("alerts", "to_address") self.mail_server = config.get("alerts", "mail_server") self.username = config.get("alerts", "username") self.password = config.get("alerts", "password") self.alerts = [] load_alerts(config) def load_alerts(self, config): for section in self.config.sections(): if "alert" in section: type = self.config.get(section, "type") if type == "output_feedback": name = self.config.get(section, "name") output_module = self.config.get(section, "output_module") output = self.config.get(section, "output") input_module = self.config.get(section, "input_module") input = self.config.get(section, "input") on_threshold = self.config.get(section, "on_threshold") off_threshold = self.config.get(section, "off_threshold") deadband = self.config.get(section, "deadband") self.alerts.append(OutputFeedbackAlert(name, output_module, output, input_module, input, on_threshold, off_threshold, deadband)) elif type == "measurement": name = self.config.get(section, "name") input_module = self.config.get(section, "input_module") input = self.config.get(section, "input") high_threshold = self.config.get(section, "high_threshold") low_threshold = self.config.get(section, "low_threshold") deadband = self.config.get(section, "deadband") self.alerts.append(MeasurementAlert(name, input_module, input, high_threshold, low_threshold, deadband)) def send_alert(self, message): msg = MIMEText(message) msg['Subject'] = "HydroBot Alert" msg['From'] = self.from_addr msg['To'] = self.to_addr server = smtplib.SMTP(self.mail_server) server.ehlo() server.starttls() server.login(self.username, self.password) server.send_message(msg) server.quit() def evaluate_alerts(self): for alert in self.alerts: alert.evalutate() class Alert(metaclass=ABCMeta): def __init__(self, name): self.name = name @abstractmethod def evalutate(self): pass class OutputFeedbackAlert(Alert): def __init__(self, name, output_module, output, input_module, input, on_threshold, off_threshold, deadband): super(Alert, self).__init__(name) def evalutate(self): print(self.name) class MeasurementAlert(Alert): def __init__(self, name, input_module, input, high_threshold, low_threshold, deadband): super(Alert, self).__init__(name) def evalutate(self): print(self.name)