diff --git a/node_helper.js b/node_helper.js index b698539..c34dd6d 100644 --- a/node_helper.js +++ b/node_helper.js @@ -94,10 +94,42 @@ async function evaluateTemplate(payload) { this.logger.debug(`Evaluating template for ${payload.template}`); } const hass = this.connections[payload.identifier].hass; - const response = await hass.templates.render(payload.template); - return { - identifier: payload.identifier, - render: response + + try { + // Wrap template call with timeout + const response = await Promise.race([ + hass.templates.render(payload.template), + new Promise((_, reject) => + setTimeout(() => reject(new Error('Template evaluation timeout')), 10000) + ) + ]); + return { + identifier: payload.identifier, + render: response + }; + } catch (err) { + this.logger.error(`Template evaluation failed: ${err.message}`); + + // Schedule retry after 30 seconds + setTimeout(() => { + this.logger.info(`Retrying template evaluation for ${payload.identifier}`); + this.evaluateTemplate(payload).then((ret) => { + // Send appropriate notification based on original request type + if (payload.section !== undefined) { + this.sendSocketNotification("SECTION_DISPLAY_RENDERED", { + ...ret, + section: payload.section + }); + } else { + this.sendSocketNotification("MODULE_DISPLAY_RENDERED", ret); + } + }).catch((retryErr) => { + this.logger.error(`Template evaluation retry also failed: ${retryErr.message}`); + }); + }, 30000); + + // Re-throw to maintain existing error handling behavior + throw err; } }