diff --git a/smartvalue.py b/smartvalue.py index 2e25682..aa4b4e1 100644 --- a/smartvalue.py +++ b/smartvalue.py @@ -1,4 +1,5 @@ #import appdaemon.plugins.hass.hassapi as hass +from contextlib import nullcontext from datetime import datetime from adexpressioncontext import ADExpressionContext from expressionparser import ExpressionParser,ParsingException,EvaluationException @@ -31,6 +32,8 @@ class Evaluator(): self.__no_log_prefix = parser.parse_args('no_log_prefix',False) #as no_log_prefix is used to feedback parser error, it need to be defined first expression_name = parser.parse_args('expression_name',None) + log_group = parser.parse_args('log_group',None) + self.__log_group = str(log_group if log_group is not None else expression_name or 'value') if expression_name: self.__debug_log_prefixes.append(f"[{expression_name}]") @@ -96,14 +99,24 @@ class Evaluator(): self.__debug_log_prefixes.pop() return result + def __log_group_scope(self): + # SmartObject itself implements LoggerInterface, but many evaluators are + # constructed with only the app as their API and no logger_interface kwarg. + logger = self.__logger_interface or self.__appdaemon_api + group_scope = getattr(logger, 'log_group', None) + if callable(group_scope): + return group_scope(self.__log_group) + return nullcontext() + def evaluate(self,log = True): - try: result = self.__evaluate() - except EvaluationException as e: - self.__log(f"{e}",level = "ERROR") - return None - if log: - self.log_evaluation_result() - return result + with self.__log_group_scope(): + try: result = self.__evaluate() + except EvaluationException as e: + self.__log(f"{e}",level = "ERROR") + return None + if log: + self.log_evaluation_result() + return result def log_callback_trigger_reason(self): if self.__callback_trigger_reason_log_string: @@ -220,6 +233,10 @@ class Evaluator(): self.__state_callbacks_handle = list() def __trigger_callbacks(self,trigger_reason,triggered_from_activation = False): + with self.__log_group_scope(): + return self.__trigger_callbacks_in_group(trigger_reason, triggered_from_activation) + + def __trigger_callbacks_in_group(self,trigger_reason,triggered_from_activation = False): has_log_trigger_reason = False has_evaluation_result = False diff --git a/virtualsensors.py b/virtualsensors.py index 04fc316..5574bea 100644 --- a/virtualsensors.py +++ b/virtualsensors.py @@ -761,4 +761,5 @@ class VirtualSensors(): class VirtualSensorsApp(hass.Hass): def initialize(self): self.logger_interface = LoggerInterface(self.get_ad_api(),default_log = "virtualsensors_log") - self.virtual_sensors = VirtualSensors(ad_api = self.get_ad_api(),logger_interface = self.logger_interface,yaml_block = self.args,args_to_ignore_in_validation = ['module','class','global_dependencies','priority','name','config_path'],app_name = self.name) + with self.logger_interface.log_group("App Initialization"): + self.virtual_sensors = VirtualSensors(ad_api = self.get_ad_api(),logger_interface = self.logger_interface,yaml_block = self.args,args_to_ignore_in_validation = ['module','class','global_dependencies','priority','name','config_path'],app_name = self.name)