import type { VoiceTool } from './_types' import { tabletJson } from './_http' /** * Телевизор через Home Assistant (домен media_player). * Entity задаётся TV_ENTITY (по умолчанию media_player.tv). */ const ENTITY = () => process.env.TV_ENTITY || 'media_player.tv' const controlTv: VoiceTool = { schema: { type: 'function', function: { name: 'control_tv', description: 'Управление телевизором: включить/выключить, громкость, пауза/воспроизведение, звук. ' + 'Используй для «включи телевизор», «выключи ТВ», «сделай телевизор тише», «поставь на паузу».', parameters: { type: 'object', properties: { action: { type: 'string', enum: ['turn_on', 'turn_off', 'volume', 'play', 'pause', 'mute'], description: 'Что сделать', }, volume: { type: 'number', description: 'Громкость 0-100 при action=volume', }, }, required: ['action'], }, }, }, async execute(args) { const action = String(args?.action || '') const entity_id = ENTITY() let payload: Record switch (action) { case 'turn_on': case 'turn_off': payload = { domain: 'media_player', service: action, entity_id } break case 'play': payload = { domain: 'media_player', service: 'media_play', entity_id } break case 'pause': payload = { domain: 'media_player', service: 'media_pause', entity_id } break case 'mute': payload = { domain: 'media_player', service: 'volume_mute', entity_id, is_volume_muted: true } break case 'volume': { const v = Number(args?.volume) if (!Number.isFinite(v)) return { error: 'volume required' } payload = { domain: 'media_player', service: 'volume_set', entity_id, volume_level: Math.max(0, Math.min(1, v / 100)) } break } default: return { error: `unknown action: ${action}` } } await tabletJson('POST', '/api/voice/tools/smart-home', payload) return { success: true, action, ...(action === 'volume' ? { volume: args?.volume } : {}) } }, } export const tools: VoiceTool[] = [controlTv]