@sanlim/home-assistant-switch-mcp-server
Version:
A MCP server for Home Assistant switch services.
53 lines (52 loc) • 2.38 kB
JavaScript
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);
}
}