Files
2026-05-17 21:32:16 -04:00

100 lines
3.2 KiB
Python

import aiohttp
import voluptuous as vol
from homeassistant.core import HomeAssistant, ServiceCall
from homeassistant.helpers import config_validation as cv
import logging
from .const import DOMAIN, PLATFORMS
CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
_LOGGER = logging.getLogger(__name__)
_SAY_SCHEMA = vol.Schema({
vol.Required("message"): str,
vol.Optional("robot"): str,
})
async def async_setup(hass: HomeAssistant, config: dict):
hass.data.setdefault(DOMAIN, {})
return True
async def async_setup_entry(hass: HomeAssistant, entry):
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.entry_id] = {
"jibo_ip": entry.data["jibo_ip"],
"name": entry.data.get("name", entry.title),
}
if not hass.services.has_service(DOMAIN, "say"):
async def handle_say(call: ServiceCall):
message = call.data["message"]
robot_filter = call.data.get("robot")
targets = [
data["jibo_ip"]
for data in hass.data[DOMAIN].values()
if robot_filter is None or data["name"] == robot_filter
]
if not targets:
_LOGGER.warning(
"No Jibo robot matched filter %r. Configured robots: %s",
robot_filter,
[d["name"] for d in hass.data[DOMAIN].values()],
)
return
payload = {
"prompt": message,
"locale": "en-us",
"voice": "griffin",
"duration_stretch": 1,
"pitch": 3,
"pitchBandwidth": 0.4,
"mode": "text",
"outputMode": "stream",
"timeout": None,
"volume": 0,
"whisper": "FALSE",
"samplerate": 48000,
"postfilter": 0.4,
"framerate": 240,
"unvoicedvoiced": 0.35,
"allPass": 0.76,
"gvMCEP": 0.9,
"cached": "TRUE",
}
async with aiohttp.ClientSession() as session:
for ip in targets:
url = f"http://{ip}:8089/tts_speak"
try:
async with session.post(url, json=payload) as response:
if response.status != 200:
_LOGGER.error(
"Jibo at %s returned %s: %s",
ip, response.status, await response.text(),
)
except aiohttp.ClientError as e:
_LOGGER.error("Error communicating with Jibo at %s: %s", ip, e)
hass.services.async_register(DOMAIN, "say", handle_say, schema=_SAY_SCHEMA)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
return True
async def async_unload_entry(hass: HomeAssistant, entry):
unloaded = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
if unloaded:
hass.data[DOMAIN].pop(entry.entry_id, None)
if not hass.data[DOMAIN]:
hass.services.async_remove(DOMAIN, "say")
return unloaded