UNPKG

@sanlim/home-assistant-switch-mcp-server

Version:
53 lines (52 loc) 2.38 kB
import { formatResponse } from "../helpers/format.js"; export class HomeAssistantStateService { requestService; constructor(requestService) { this.requestService = requestService; } async getStates({ entity_id, friendly_name }) { // If entity_id is provided, get specific entity state if (entity_id) { const data = await this.requestService.getEntityState(entity_id); if (!data) { return `Entity ${entity_id} not found or error occurred`; } return formatResponse(`State for entity ${entity_id}: ${data.state}`, data); } // If friendly_name is provided, search by friendly name if (friendly_name) { const data = await this.requestService.searchByFriendlyName(friendly_name); if (!data || data.length === 0) { return `No entities found with friendly name containing '${friendly_name}'`; } const results = data.map(state => ({ entity_id: state.entity_id, friendly_name: state.attributes.friendly_name, state: state.state, type: state.entity_id.split('.')[0] })); return formatResponse(`Found ${data.length} entities matching '${friendly_name}':\n${results.map(r => `- ${r.entity_id} (${r.friendly_name}): ${r.state}`).join('\n')}`, data); } // If neither is provided, get all states const data = await this.requestService.getAllStates(); if (!data) { return "Failed to retrieve states from Home Assistant"; } // Group by domain for better readability const groupedStates = data.reduce((acc, state) => { const domain = state.entity_id.split('.')[0]; if (!acc[domain]) acc[domain] = []; acc[domain].push({ entity_id: state.entity_id, friendly_name: state.attributes.friendly_name, state: state.state }); return acc; }, {}); const summary = Object.entries(groupedStates) .map(([domain, entities]) => `${domain}: ${entities.length} entities`) .join(', '); return formatResponse(`Retrieved ${data.length} entities from Home Assistant. Summary: ${summary}`, data); } }