diff --git a/apps/notificationsmanager.py b/apps/notificationsmanager.py index ac5b82c..8f70e4e 100644 --- a/apps/notificationsmanager.py +++ b/apps/notificationsmanager.py @@ -1,10 +1,13 @@ import appdaemon.plugins.hass.hassapi as hass import appdaemon.exceptions as ad_exception import ad_toolbox.smartcondition as SmartCondition +import re import uuid from expressionparser import ParsingException class Notification: + ENTITY_PLACEHOLDER_PATTERN = re.compile(r"\{([^{}]+)\}") + def __init__(self,ad_api,config,name): self.recipients = dict() self.config = config @@ -50,14 +53,40 @@ class Notification: for service in recipient_yaml['services']: clear_notification(service,tag) + def render_message_content(self, content): + if not isinstance(content, str): + return content + + def replace_entity_state(match): + entity_id = match.group(1).strip() + if entity_id == "": + return match.group(0) + + try: + state = self.ad_api.get_state(entity_id) + except Exception as e: + self.log_error(f"Failed to resolve '{entity_id}' in notification content: {e}") + return match.group(0) + + if state is None: + self.log_error(f"Unable to resolve '{entity_id}' in notification content") + return match.group(0) + + return str(state) + + return self.ENTITY_PLACEHOLDER_PATTERN.sub(replace_entity_state, content) + def send_notification(self,recipient): - try: title = self.config['message']['title'] - except KeyError: title = "" - try: message = self.config['message']['content'] - except KeyError: message = "" + try: title_template = self.config['message']['title'] + except KeyError: title_template = "" + try: message_content = self.config['message']['content'] + except KeyError: message_content = "" try: data = self.config['message']['data'] except KeyError: data = dict() + title = self.render_message_content(title_template) + message = self.render_message_content(message_content) + #TODO : maybe it's better to not send tag when it's not needed if not 'tag' in data: data['tag'] = self.uuid