feat: protocol_settings wiring + InvalidAuth reauth start + entry migration to v2; PLATFORMS gains REMOTE (placeholder platform until t10)
This commit is contained in:
1 parent
b5fc0dacf4
commit
d57c4eaa40
2 files changed
+84
-4
No files matched your search
@@ -19,12 +19,18 @@ from homeassistant.core import HomeAssistant
|
|||||||
|
|
||||||
from .adb_session import AdbMediaSessionPoller
|
from .adb_session import AdbMediaSessionPoller
|
||||||
from .connection import ShieldConnectionManager
|
from .connection import ShieldConnectionManager
|
||||||
from .const import CONF_ADB_ENABLED, DOMAIN
|
from .const import (
|
||||||
from .helpers import resolve_adb_config
|
CONF_ADB_ENABLED,
|
||||||
|
CONF_ANDROIDTV_ENTITY,
|
||||||
|
CONF_PROTOCOL_ENABLED,
|
||||||
|
CONF_PROTOCOL_HOST,
|
||||||
|
DOMAIN,
|
||||||
|
)
|
||||||
|
from .helpers import discover_adb_host, protocol_cert_paths, resolve_adb_config
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
PLATFORMS = [Platform.MEDIA_PLAYER, Platform.SENSOR, Platform.BUTTON]
|
PLATFORMS = [Platform.MEDIA_PLAYER, Platform.SENSOR, Platform.REMOTE, Platform.BUTTON]
|
||||||
|
|
||||||
|
|
||||||
async def _build_poller_factory(hass: HomeAssistant, entry: ConfigEntry):
|
async def _build_poller_factory(hass: HomeAssistant, entry: ConfigEntry):
|
||||||
@@ -69,7 +75,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
hass.data[DOMAIN][entry.entry_id] = entry
|
hass.data[DOMAIN][entry.entry_id] = entry
|
||||||
|
|
||||||
manager = ShieldConnectionManager(
|
manager = ShieldConnectionManager(
|
||||||
hass, entry, poller_factory=await _build_poller_factory(hass, entry)
|
hass,
|
||||||
|
entry,
|
||||||
|
poller_factory=await _build_poller_factory(hass, entry),
|
||||||
|
protocol_settings=await _build_protocol_settings(hass, entry),
|
||||||
|
invalid_auth_callback=lambda: entry.async_start_reauth(hass),
|
||||||
)
|
)
|
||||||
entry.runtime_data = manager
|
entry.runtime_data = manager
|
||||||
await manager.async_start()
|
await manager.async_start()
|
||||||
@@ -89,6 +99,57 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
async def _build_protocol_settings(hass: HomeAssistant, entry: ConfigEntry):
|
||||||
|
"""Manager protocol_settings when the transport is enabled & resolvable.
|
||||||
|
|
||||||
|
Falls back to the androidtv-remote host discovery (the ADB host fallback)
|
||||||
|
until the user pairs, after which the explicit protocol host persists.
|
||||||
|
"""
|
||||||
|
if not entry.options.get(CONF_PROTOCOL_ENABLED, False):
|
||||||
|
return None
|
||||||
|
|
||||||
|
host = entry.options.get(CONF_PROTOCOL_HOST) or discover_adb_host(
|
||||||
|
hass, entry.data.get(CONF_ANDROIDTV_ENTITY)
|
||||||
|
)
|
||||||
|
if not host:
|
||||||
|
_LOGGER.info(
|
||||||
|
"Protocol enabled for entry %s but no host resolvable — continuing "
|
||||||
|
"without the remote-protocol transport. Pair via the flow.",
|
||||||
|
entry.title,
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
|
||||||
|
certfile, keyfile = await hass.async_add_executor_job(protocol_cert_paths, hass)
|
||||||
|
return {
|
||||||
|
"host": host,
|
||||||
|
"client_name": entry.title or "Home Assistant",
|
||||||
|
"certfile": certfile,
|
||||||
|
"keyfile": keyfile,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
|
||||||
|
"""Migrate v1 entries to v2 (adds the remote-protocol fields).
|
||||||
|
|
||||||
|
ADB options carry over untouched; the ADB-host discovery fallback keeps
|
||||||
|
serving as the protocol host until pairing populates it. Downgrades
|
||||||
|
(version > 2) are rejected so HA offers a rollback.
|
||||||
|
"""
|
||||||
|
if config_entry.version > 2:
|
||||||
|
return False
|
||||||
|
if config_entry.version < 2:
|
||||||
|
options = {**config_entry.options}
|
||||||
|
options.setdefault(CONF_PROTOCOL_ENABLED, False)
|
||||||
|
options.setdefault(CONF_PROTOCOL_HOST, "")
|
||||||
|
hass.config_entries.async_update_entry(
|
||||||
|
config_entry, options=options, version=2
|
||||||
|
)
|
||||||
|
_LOGGER.info(
|
||||||
|
"Migrated %s config entry to version 2", config_entry.title
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||||
"""Unload a config entry."""
|
"""Unload a config entry."""
|
||||||
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
|
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
"""Remote entities for NVIDIA Shield — Phase 2 step 3 (t10).
|
||||||
|
|
||||||
|
Remotely controlling the Shield runs over the absorbed remote-protocol
|
||||||
|
transport (androidtvremote2) managed by ShieldConnectionManager. This
|
||||||
|
placeholder keeps the Platform.REMOTE forward from failing while t10
|
||||||
|
lands the real entity on top.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from homeassistant.config_entries import ConfigEntry
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
|
||||||
|
|
||||||
|
async def async_setup_entry(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
entry: ConfigEntry,
|
||||||
|
async_add_entities: AddEntitiesCallback,
|
||||||
|
) -> None:
|
||||||
|
"""Remote entities arrive with the Phase 2 command-routing unit (t10)."""
|
||||||
Reference in new issue
Block a user