Try a different approach

This commit is contained in:
Erik 2024-11-06 12:49:52 +01:00 committed by G Johansson
parent a07a3a61bf
commit 13f5adfa84

View File

@ -23,11 +23,6 @@ from homeassistant.const import (
CONF_NAME, CONF_NAME,
CONF_UNIQUE_ID, CONF_UNIQUE_ID,
CONF_UNIT_OF_MEASUREMENT, CONF_UNIT_OF_MEASUREMENT,
<<<<<<< HEAD
=======
MAX_LENGTH_STATE_STATE,
STATE_UNKNOWN,
>>>>>>> 40e866f221e (Fix when state breaks to stringify)
) )
from homeassistant.core import HomeAssistant, State, callback from homeassistant.core import HomeAssistant, State, callback
from homeassistant.exceptions import TemplateError from homeassistant.exceptions import TemplateError
@ -181,18 +176,43 @@ class TriggerBaseEntity(Entity):
extra_state_attributes[attr] = last_state.attributes[attr] extra_state_attributes[attr] = last_state.attributes[attr]
self._rendered[CONF_ATTRIBUTES] = extra_state_attributes self._rendered[CONF_ATTRIBUTES] = extra_state_attributes
def _render_availability_template(self, variables: dict[str, Any]) -> None:
"""Render availability template."""
rendered = dict(self._static_rendered)
self._rendered = self._static_rendered
try:
key = CONF_AVAILABILITY
if key in self._to_render_simple:
rendered[key] = self._config[key].async_render(
variables,
parse_result=key in self._parse_result,
)
elif key in self._to_render_complex:
rendered[key] = render_complex(
self._config[key],
variables,
)
except TemplateError as err:
logging.getLogger(f"{__package__}.{self.entity_id.split('.')[0]}").error(
"Error rendering %s template for %s: %s", key, self.entity_id, err
)
self._rendered = rendered
def _render_templates(self, variables: dict[str, Any]) -> None: def _render_templates(self, variables: dict[str, Any]) -> None:
"""Render templates.""" """Render templates."""
rendered = dict(self._rendered)
try: try:
rendered = dict(self._static_rendered)
for key in self._to_render_simple: for key in self._to_render_simple:
if key == CONF_AVAILABILITY:
continue
rendered[key] = self._config[key].async_render( rendered[key] = self._config[key].async_render(
variables, variables,
parse_result=key in self._parse_result, parse_result=key in self._parse_result,
) )
for key in self._to_render_complex: for key in self._to_render_complex:
if key == CONF_AVAILABILITY:
continue
rendered[key] = render_complex( rendered[key] = render_complex(
self._config[key], self._config[key],
variables, variables,
@ -209,7 +229,6 @@ class TriggerBaseEntity(Entity):
logging.getLogger(f"{__package__}.{self.entity_id.split('.')[0]}").error( logging.getLogger(f"{__package__}.{self.entity_id.split('.')[0]}").error(
"Error rendering %s template for %s: %s", key, self.entity_id, err "Error rendering %s template for %s: %s", key, self.entity_id, err
) )
self._rendered = self._static_rendered
class ManualTriggerEntity(TriggerBaseEntity): class ManualTriggerEntity(TriggerBaseEntity):
@ -237,16 +256,27 @@ class ManualTriggerEntity(TriggerBaseEntity):
""" """
run_variables: dict[str, Any] = {"value": value} run_variables: dict[str, Any] = {"value": value}
this = None
if state := self.hass.states.get(self.entity_id):
this = state.as_dict()
# Silently try if variable is a json and store result in `value_json` if it is. # Silently try if variable is a json and store result in `value_json` if it is.
with contextlib.suppress(*JSON_DECODE_EXCEPTIONS): with contextlib.suppress(*JSON_DECODE_EXCEPTIONS):
run_variables["value_json"] = json_loads(run_variables["value"]) run_variables["value_json"] = json_loads(run_variables["value"])
variables = { variables = {
"this": TemplateStateFromEntityId(self.hass, self.entity_id), "this": TemplateStateFromEntityId(self.hass, self.entity_id),
**(run_variables or {}), **(run_variables or {}),
} }
self._render_availability_template(variables)
self.async_write_ha_state()
this = None
if state := self.hass.states.get(self.entity_id):
this = state.as_dict()
variables["this"] = this
self._render_templates(variables) self._render_templates(variables)
self.async_write_ha_state()
class ManualTriggerSensorEntity(ManualTriggerEntity, SensorEntity): class ManualTriggerSensorEntity(ManualTriggerEntity, SensorEntity):