From 40e625793ec722e39e430acba0c069cd9d7030d5 Mon Sep 17 00:00:00 2001 From: legop3 Date: Wed, 29 Apr 2026 19:44:52 -0400 Subject: [PATCH] loggings --- .../homeAssistantService/entityHelpers.js | 8 +++++++- .../homeAssistantService/runtimeEngine.js | 19 +++++++++++++++++-- server/src/services/idleService/actions.js | 16 ++++++++++++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/server/src/services/homeAssistantService/entityHelpers.js b/server/src/services/homeAssistantService/entityHelpers.js index 752ce06d..5ce3fb7e 100644 --- a/server/src/services/homeAssistantService/entityHelpers.js +++ b/server/src/services/homeAssistantService/entityHelpers.js @@ -10,13 +10,19 @@ function inferType(entityId, explicitType) { return 'switch'; } +function inferDomain(entityId) { + const domain = String(entityId || '').split('.')[0].trim().toLowerCase(); + return domain || 'switch'; +} + function normalizeConfigEntry(entry) { if (!entry) return null; const id = entry.id || entry.entityId || entry.entity_id; if (!id) return null; const type = inferType(id, entry.type); + const domain = inferDomain(id); const name = entry.name || null; - return { id: String(id), name, type }; + return { id: String(id), name, type, domain }; } function normalizeTriggerEntry(entry, index) { diff --git a/server/src/services/homeAssistantService/runtimeEngine.js b/server/src/services/homeAssistantService/runtimeEngine.js index b4a588b5..5f839420 100644 --- a/server/src/services/homeAssistantService/runtimeEngine.js +++ b/server/src/services/homeAssistantService/runtimeEngine.js @@ -71,7 +71,7 @@ function createRuntimeEngine(deps) { if (!runtime.connection) throw new Error('Home Assistant not connected'); const nextState = desiredState === 'on' ? 'on' : 'off'; - const domain = meta.type === 'light' ? 'light' : 'switch'; + const domain = String(meta.domain || (meta.type === 'light' ? 'light' : 'switch')).toLowerCase(); const service = nextState === 'on' ? 'turn_on' : 'turn_off'; const source = String(options?.source || 'unknown'); await callHomeAssistantService(domain, service, { entity_id: entityId }); @@ -90,14 +90,29 @@ function createRuntimeEngine(deps) { const results = await Promise.allSettled( ids.map((id) => setEntityState(id, desiredState, { source: `${source}:bulk` })), ); - const failures = results.filter((result) => result.status === 'rejected'); + const failures = results + .map((result, index) => ({ result, entityId: ids[index] })) + .filter(({ result }) => result.status === 'rejected') + .map(({ result, entityId }) => ({ entityId, error: result.reason?.message || 'unknown error' })); + const succeeded = results + .map((result, index) => ({ result, entityId: ids[index] })) + .filter(({ result }) => result.status === 'fulfilled') + .map(({ entityId }) => entityId); if (failures.length) { logger.warn('Some Home Assistant entity state updates failed', { desiredState, total: ids.length, failed: failures.length, + failures, }); } + return { + desiredState: desiredState === 'on' ? 'on' : 'off', + source, + total: ids.length, + succeeded, + failures, + }; } function triggerMatches(trigger, raw, runtimeState) { diff --git a/server/src/services/idleService/actions.js b/server/src/services/idleService/actions.js index 3439020c..c16d5571 100644 --- a/server/src/services/idleService/actions.js +++ b/server/src/services/idleService/actions.js @@ -13,8 +13,20 @@ const { } = require('./constants'); async function turnOffRoomControls() { - await homeAssistantService.setAllControllableEntitiesState('off', { source: 'idleService:turnOffRoomControls' }); - return { action: 'roomControlsOff' }; + const before = homeAssistantService.getState?.().entities || []; + const summary = await homeAssistantService.setAllControllableEntitiesState('off', { + source: 'idleService:turnOffRoomControls', + }); + const after = homeAssistantService.getState?.().entities || []; + logger.info('Idle room-controls off summary', { + attempted: summary?.total || 0, + succeeded: Array.isArray(summary?.succeeded) ? summary.succeeded.length : 0, + failed: Array.isArray(summary?.failures) ? summary.failures.length : 0, + failedEntities: summary?.failures || [], + beforeStates: before.map((entity) => ({ id: entity.id, state: entity.state, available: entity.available })), + afterStates: after.map((entity) => ({ id: entity.id, state: entity.state, available: entity.available })), + }); + return { action: 'roomControlsOff', ...summary }; } async function dockAllRovers() {