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:
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user