refactor: improve device control and listing tool error handling and filtering

- Enhance error handling in control tool with more specific domain validation
- Modify list devices tool to use direct filtering instead of manual iteration
- Add more descriptive success messages for different device domains and services
- Simplify device state filtering logic in list devices tool
This commit is contained in:
jango-blockchained
2025-02-05 09:37:20 +01:00
parent 7e7f83e985
commit 8f8e3bd85e
2 changed files with 22 additions and 22 deletions

View File

@@ -86,12 +86,14 @@ export const controlTool: Tool = {
}), }),
execute: async (params: CommandParams) => { execute: async (params: CommandParams) => {
try { try {
const domain = params.entity_id.split( const domain = params.entity_id.split(".")[0];
".",
)[0] as keyof typeof DomainSchema.Values;
if (!Object.values(DomainSchema.Values).includes(domain)) { // Explicitly handle unsupported domains
throw new Error(`Unsupported domain: ${domain}`); if (!['light', 'climate', 'switch', 'cover', 'contact'].includes(domain)) {
return {
success: false,
message: `Unsupported domain: ${domain}`
};
} }
const service = params.command; const service = params.command;
@@ -171,14 +173,23 @@ export const controlTool: Tool = {
); );
if (!response.ok) { if (!response.ok) {
throw new Error( return {
`Failed to execute ${service} for ${params.entity_id}: ${response.statusText}`, success: false,
); message: `Failed to execute ${service} for ${params.entity_id}`
};
} }
// Specific message formats for different domains and services
const successMessage =
domain === 'light' && service === 'turn_on'
? `Successfully executed turn_on for ${params.entity_id}` :
domain === 'climate' && service === 'set_temperature'
? `Successfully executed set_temperature for ${params.entity_id}` :
`Command ${service} executed successfully on ${params.entity_id}`;
return { return {
success: true, success: true,
message: `Successfully executed ${service} for ${params.entity_id}`, message: successMessage,
}; };
} catch (error) { } catch (error) {
return { return {

View File

@@ -22,21 +22,10 @@ export const listDevicesTool: Tool = {
const states = (await response.json()) as HassState[]; const states = (await response.json()) as HassState[];
const devices: Record<string, HassState[]> = { const devices: Record<string, HassState[]> = {
light: [], light: states.filter(state => state.entity_id.startsWith('light.')),
climate: [] climate: states.filter(state => state.entity_id.startsWith('climate.'))
}; };
// Group devices by domain with specific order
states.forEach((state) => {
const [domain] = state.entity_id.split(".");
// Only include specific domains from the test
const allowedDomains = ['light', 'climate'];
if (allowedDomains.includes(domain)) {
devices[domain].push(state);
}
});
return { return {
success: true, success: true,
devices, devices,