{ "config": { "step": { "user": { "title": "NVIDIA Shield", "description": "{discovery_note}Set up your NVIDIA Shield. Everything here is optional except one state source \u2014 an Android TV Remote entity, the Nvidia Remote Protocol, or ADB. Link the devices and services you want to use.", "data": { "name": "Name", "androidtv_entity": "Android TV Remote entity", "jellyfin_entity": "Jellyfin media player", "receiver_entity": "Receiver", "receiver_input": "Receiver input", "power_entity": "Power switch", "adb_enabled": "Read state over ADB", "adb_store_app_info": "Show title and artist", "adb_host": "ADB host (IP address)", "adb_port": "ADB port", "protocol_enabled": "Add the Nvidia Remote Protocol", "protocol_host": "Protocol host (IP address)" }, "data_description": { "androidtv_entity": "The media_player entity from the Android TV Remote integration. Leave blank if you use the Nvidia Remote Protocol or ADB instead.", "jellyfin_entity": "The Jellyfin media_player for this Shield. Leave blank to detect it automatically.", "receiver_entity": "The receiver or soundbar this Shield plays through.", "receiver_input": "The receiver input the Shield uses, for example 'Shield'. Leave blank if you are not sure.", "power_entity": "A smart plug switch, if you want reliable on/off detection.", "adb_enabled": "Reads now-playing information over ADB from any app. Requires Developer options > Network debugging on the Shield.", "adb_store_app_info": "Shows the title and artist from non-Jellyfin apps. Turn off to show only the app name (privacy mode).", "adb_host": "The Shield's IP address. Pre-filled when the Shield was discovered, or when an Android TV Remote entity is set \u2014 change it only if you need a different address.", "adb_port": "The ADB port. The standard value is 5555 \u2014 change it only if ADB uses a custom port on your network.", "protocol_enabled": "Adds the all-in-one remote-protocol transport (power, availability, app push and volume readout). It needs a one-time PIN pairing right after this step.", "protocol_host": "The Shield's IP address for the remote protocol. Pre-filled when the Shield was discovered \u2014 leave blank to use the ADB host." } }, "adb_pair": { "title": "Allow ADB access", "description": "On the Shield, open Settings > System > Developer options and turn on Network debugging (it may be called ADB debugging). Then select Submit \u2014 the Shield shows an Allow prompt; approve it. Nothing happened? Check the address below and select Submit again. Not now? Turn on 'Continue without ADB pairing' and select Submit.", "data": { "adb_host": "ADB host (IP address)", "adb_port": "ADB port", "skip_pairing": "Continue without ADB pairing" }, "data_description": { "adb_host": "The Shield's IP address. Pre-filled when the Shield was discovered \u2014 change it only if the Shield moved or you gave it a different address.", "adb_port": "The standard ADB port is 5555.", "skip_pairing": "Finishes setup now and leaves ADB unpaired. The Pair ADB button stays available on the device page, so you can pair later." } }, "protocol_pair": { "title": "Pair the remote protocol", "description": "While this step is open the Shield shows a pairing code. Type it below and select Submit. If no code appears on the Shield, check the IP address below and select Submit again \u2014 pairing restarts and the Shield shows a new code. To set up without the remote protocol, turn on 'Continue without protocol pairing'.", "data": { "pairing_code": "Pairing code shown on the Shield", "protocol_host": "Protocol host (IP address)", "skip_pairing": "Continue without protocol pairing" }, "data_description": { "pairing_code": "The code the Shield displays while this step is open.", "protocol_host": "The Shield's IP address. Pre-filled when the Shield was discovered \u2014 change it if the Shield moved.", "skip_pairing": "Finishes setup now without the remote-protocol transport. Power, availability and the app push then come from the other state sources only." } }, "reauth_confirm": { "title": "Re-pair Nvidia Shield", "description": "The Shield no longer trusts the saved pairing certificate, usually after a factory reset. Select Submit to pair again \u2014 the Shield then shows a code." } }, "error": { "adb_failed": "The Shield did not accept the ADB connection. Make sure Network debugging is on, approve the Allow prompt on the Shield, then select Submit to try again.", "adb_no_host": "No IP address for the Shield yet. Fill in the ADB host field above (a discovered Shield, or one linked to an Android TV Remote entity, is pre-filled automatically).", "protocol_no_host": "No IP address for the Shield yet. Fill in the protocol host field above (a discovered Shield, or one linked to an Android TV Remote entity, is pre-filled automatically).", "protocol_pair_failed": "The Shield rejected that pairing code. Check the code on the Shield and select Submit to try again.", "protocol_unavailable": "The androidtvremote2 library is not installed, so the remote protocol cannot pair. Install it and restart Home Assistant, or turn on 'Continue without protocol pairing' to finish setup anyway.", "no_state_source": "No state source selected. Choose at least one: an Android TV Remote entity, 'Add the Nvidia Remote Protocol', or 'Read state over ADB'.", "invalid_app_map": "Each line must be package=name with a non-empty package (no spaces) and a non-empty name \u2014 for example ar.tvplayer.tv=TiviMate.", "invalid_digit_delay": "The digit delay must be between 0.05 and 1.0 seconds." }, "abort": { "already_configured": "This Shield is already set up.", "reauth_successful": "Re-paired successfully.", "reauth_skipped": "Pairing skipped. The saved certificate is still not trusted, so the remote protocol stays unavailable until you pair again.", "reauth_entry_missing": "This entry no longer exists.", "zeroconf_no_host": "The discovery event carried no usable address.", "yaml_seed_only": {}, "yaml_seed": { "title": "YAML succeeded earlier", "message": "The configuration.yaml nvidia_shield block is seed-only: it starts the standard interactive flow. Removing the YAML block creates or deletes nothing." } } }, "options": { "step": { "init": { "title": "NVIDIA Shield settings", "description": "Settings for this Shield. Saving reloads the integration so the changes take effect.", "data": { "jellyfin_entity": "Jellyfin media player", "receiver_entity": "Receiver", "receiver_input": "Receiver input", "power_entity": "Power switch", "adb_enabled": "Read state over ADB", "adb_store_app_info": "Show title and artist", "adb_host": "ADB host (IP address)", "adb_port": "ADB port", "app_name_map": "App names and icons", "adb_command_enabled": "Enable the adb_command service", "channel_digit_delay": "Channel digit delay (seconds)", "channel_send_enter": "Send ENTER after channel digits", "logcat_events": "Instant app detection (logcat stream)" }, "data_description": { "jellyfin_entity": "The Jellyfin media_player for this Shield. Stream details come from the HA Jellyfin integration \u2014 no extra setup needed.", "receiver_entity": "The receiver or soundbar this Shield plays through.", "receiver_input": "The receiver input the Shield uses, for example 'Shield'.", "power_entity": "A smart plug switch, if you want reliable on/off detection.", "adb_enabled": "Reads now-playing information over ADB from any app. Requires Developer options > Network debugging on the Shield.", "adb_store_app_info": "Shows the title and artist from non-Jellyfin apps. Turn off to show only the app name (privacy mode).", "adb_host": "The Shield's IP address. Leave blank to use the Android TV Remote entity's address.", "adb_port": "The ADB port. The standard value is 5555.", "app_name_map": "One entry per line, package=name (for example ar.tvplayer.tv=TiviMate), with an optional |icon after the name. Leave blank to clear.", "adb_command_enabled": "Adds the nvidia_shield.adb_command service (a raw ADB shell command over the persistent connection). Security-relevant: leave it off unless you need it \u2014 the same opt-in posture as the core androidtv integration.", "channel_digit_delay": "Pause between the channel digits entered via play_media(channel) \u2014 0.05 to 1.0 seconds (default 0.1, the tested value).", "channel_send_enter": "Presses ENTER after the last digit (protocol key first, then the ADB keyevent fallback). Off by default, matching TiviMate's tested behavior.", "logcat_events": "Detects app changes instantly through a dedicated logcat stream (AdbDevice.streaming_shell). Off by default \u2014 polling keeps the state correct either way, and the integration falls back to polling if the stream keeps failing." } } } }, "services": { "adb_command": { "name": "ADB command", "description": "Send a raw ADB shell command to the persistent connection of an Nvidia Shield entry (option-gated use).", "fields": { "command": { "name": "Command", "description": "The shell command to run on the device." }, "entity_id": { "name": "Entity", "description": "The Nvidia Shield media player to target." } } } }, "exceptions": { "invalid_command": { "title": "Empty command", "message": "The command field is empty \u2014 nothing was sent." }, "unsupported_target": { "title": "Unsupported entity for adb_command", "message": "{entity_id} is not an adb_command participant (its entry must enable the adb_command_enabled option) \u2014 command not sent." }, "adb_unavailable": { "title": "ADB unavailable", "message": "The ADB connection of {entity_id} is down \u2014 command not sent." } }, "entity": { "sensor": { "current_app": { "name": "Current app" }, "now_playing": { "name": "Now playing" } } } }