74 lines
2.4 KiB
Python
74 lines
2.4 KiB
Python
"""Shared config helpers for the NVIDIA Shield integration."""
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import entity_registry as er
|
|
|
|
from .const import (
|
|
CONF_ADB_HOST,
|
|
CONF_ADB_PORT,
|
|
CONF_ANDROIDTV_ENTITY,
|
|
DEFAULT_ADB_PORT,
|
|
DOMAIN,
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class AdbConfig:
|
|
"""Resolved ADB connection settings for a config entry."""
|
|
|
|
host: str
|
|
port: int
|
|
key_path: str
|
|
|
|
|
|
def adb_key_path(hass: HomeAssistant) -> str:
|
|
"""Path of the ADB private key for this integration (may not exist yet)."""
|
|
return os.path.join(hass.config.config_dir, ".storage", DOMAIN, "adbkey")
|
|
|
|
|
|
def protocol_cert_paths(hass: HomeAssistant) -> tuple[str, str]:
|
|
"""Local (certfile, keyfile) paths for the remote protocol client.
|
|
|
|
Mirrors core androidtv_remote's storage pattern: private material under
|
|
``.storage/<domain>/``. Shared between config-flow pairing and runtime —
|
|
an entry aborts duplicate setup by unique_id (= device MAC), so one pair
|
|
of files suffices per install.
|
|
"""
|
|
base = os.path.join(hass.config.config_dir, ".storage", DOMAIN)
|
|
os.makedirs(base, exist_ok=True)
|
|
return os.path.join(base, "client.pem"), os.path.join(base, "client.key")
|
|
|
|
|
|
def discover_adb_host(
|
|
hass: HomeAssistant, androidtv_entity_id: str | None
|
|
) -> str | None:
|
|
"""Best-effort host for an AndroidTV entity, from its owning config entry."""
|
|
if not androidtv_entity_id:
|
|
return None
|
|
registry = er.async_get(hass)
|
|
entity_entry = registry.async_get(androidtv_entity_id)
|
|
if not entity_entry or not entity_entry.config_entry_id:
|
|
return None
|
|
config_entry = hass.config_entries.async_get_entry(entity_entry.config_entry_id)
|
|
if config_entry:
|
|
return config_entry.data.get("host")
|
|
return None
|
|
|
|
|
|
def resolve_adb_config(hass: HomeAssistant, entry) -> AdbConfig | None:
|
|
"""Resolve host/port/key_path for the entry's ADB connection, or None.
|
|
|
|
Priority: explicit ADB host/port options > host from the AndroidTV
|
|
entity's own config entry.
|
|
"""
|
|
host = entry.options.get(CONF_ADB_HOST) or discover_adb_host(
|
|
hass, entry.data.get(CONF_ANDROIDTV_ENTITY)
|
|
)
|
|
if not host:
|
|
return None
|
|
port = int(entry.options.get(CONF_ADB_PORT, DEFAULT_ADB_PORT))
|
|
return AdbConfig(host=host, port=port, key_path=adb_key_path(hass))
|