From 39377a856aa70bd1c9eb709c041eb766cb81a2f3 Mon Sep 17 00:00:00 2001 From: Jason Hunter Date: Tue, 20 Oct 2020 19:47:33 -0400 Subject: [PATCH] Add Xbox documentation (#15223) Co-authored-by: Martin Hjelmare Co-authored-by: Franck Nijhof --- source/_integrations/xbox.markdown | 308 ++++++++++++++++++ .../integrations/xbox/xbox_picture_entity.png | Bin 0 -> 18354 bytes 2 files changed, 308 insertions(+) create mode 100644 source/_integrations/xbox.markdown create mode 100644 source/images/integrations/xbox/xbox_picture_entity.png diff --git a/source/_integrations/xbox.markdown b/source/_integrations/xbox.markdown new file mode 100644 index 00000000000..abfe06a8100 --- /dev/null +++ b/source/_integrations/xbox.markdown @@ -0,0 +1,308 @@ +--- +title: Xbox +description: Instructions on how to set up Xbox devices in Home Assistant. +ha_category: + - Media Player + - Remote + - Binary Sensor + - Media Source +ha_iot_class: Cloud Polling +ha_release: 0.117 +ha_codeowners: + - '@hunterjm' +ha_domain: xbox +--- + +The Xbox integration allows you to control Xbox One (or newer) consoles from Home Assistant. + +Home Assistant authenticates with Xbox Live through OAuth2 using the Home Assistant account linking service. Set up the integration through **Configuration -> Integrations -> Xbox**. Ensure you login using the Microsoft account that is linked to your Xbox consoles. + +- [Media Player](#media-player) + - [Service `play_media`](#service-play_media) +- [Remote](#remote) + - [Service `send_command`](#service-send_command) + - [Picture Elements Card](#picture-elements-card) +- [Binary Sensor](#binary-sensor) +- [Sensor](#sensor) +- [Media Source](#media-source) +- [Manual Configuration](#manual-configuration) + +## Media Player + +The Xbox media player platform will create Media Player entities for each console linked to your Microsoft account. These entities will display the active app and playback controls as well as a media browser implementation, allowing you to launch any installed application. + +### Service `play_media` + +Launches an application on the Xbox console using the application's product ID. Also supports "Home" and "TV" to navigate to the dashboard or Live TV respectively. + +You can find Product IDs by using the **Developer Tools -> Events** tab and listening to the `call_service` event. In a new browser tab, navigate to the media browser for your console and click on an App/Game to see the product ID in the event. + +| Service data attribute | Description | +| ---------------------- | --------------------------------------| +| `entity_id` | `entity_id` of the Xbox media player | +| `media_content_id` | "Home"/"TV"/{product_id} | +| `media_content_type` | Any Value | + +**Examples:** + +```yaml +entity_id: media_player.xboxone +media_content_type: "" +media_content_id: "Home" +``` + +```yaml +entity_id: media_player.xboxone +media_content_type: "" +media_content_id: "9WZDNCRFJ3TJ" # Netflix +``` + +## Remote + +The Xbox remote platform will create Remote entities for each console linked to your Microsoft Account. These entities will allow you to turn on/off and send controller or text input to your console. + +### Service `send_command` + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ---------------------------------------------------------------------- | +| `entity_id` | no | `entity_id` of the Xbox remote. | +| `command` | no | List of the controller commands or text input to be sent.
Commands: A, B, X, Y, Up, Down, Left, Right | +| `num_repeats` | yes | Number of times to repeat the commands. | +| `delay_secs` | yes | Interval in seconds between one send and another. | + +**Examples** + +```yaml +entity_id: remote.xboxone_remote +command: "A" +``` + +```yaml +entity_id: remote.xboxone_remote +command: "A" +num_repeats: 20 +``` + +```yaml +entity_id: remote.xboxone_remote +command: + - Right + - Right + - A +delay_sec: 0.1 +``` + +### Picture Elements Card + +Below is a picture elements card that can be added to Lovelace to provide an Xbox controller interface in your frontend. It utilizes the services detailed above. Replace `remote.xboxone_remote` and `media_player.xboxone` with the names of your entities and enjoy! Courtesy of [@SeanPM5](https://github.com/SeanPM5) and [@hunterjm](https://github.com/hunterjm). + +

+ Screenshot showing Xbox Controller in Lovelace. + Screenshot showing Xbox Controller in Lovelace. +

+ +```yaml +type: picture-elements +image: >- + data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjEwIiBoZWlnaHQ9IjkwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogPG1ldGFkYXRhPgogIDxyZGY6UkRGPgogICA8Y2M6V29yayByZGY6YWJvdXQ9IiI+CiAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgIDxkYzp0eXBlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiLz4KICAgIDxkYzp0aXRsZS8+CiAgIDwvY2M6V29yaz4KICA8L3JkZjpSREY+CiA8L21ldGFkYXRhPgogPGc+CiAgPHRpdGxlPmJhY2tncm91bmQ8L3RpdGxlPgogIDxyZWN0IGlkPSJjYW52YXNfYmFja2dyb3VuZCIgeD0iLTEiIHk9Ii0xIiB3aWR0aD0iODAyIiBoZWlnaHQ9IjYwMiIgZmlsbD0ibm9uZSIvPgogPC9nPgogPGNpcmNsZSBjeD0iOTkuMTgiIGN5PSIyMCIgcj0iMTQiIGZpbGw9IiNmZmYiLz4KIDxjaXJjbGUgY3g9IjE0OC4xOCIgY3k9IjU0IiByPSIxMC41IiBmaWxsPSIjMzMzIiBzdHJva2U9IiNmZmYiLz4KIDxwYXRoIGQ9Im0xNTMuMTYgNTkuMzVjLTAuMTEgMC4yMDYtMC4zNCAwLjMyNS0wLjYyNyAwLjMyNWgtMS4zNjhjLTAuNDU1IDAtMC45ODQtMC4yODktMS4yMy0wLjY3MmwtMS43MDEtMi42NTdjLTAuMDMtMC4wNDUtMC4wNTUtMC4wNjItMC4wNjItMC4wNjQgNGUtMyAyZS0zIC0wLjAyMSAwLjAxOC0wLjA1MSAwLjA2NWwtMS43MDkgMi42NTdjLTAuMjQ3IDAuMzgzLTAuNzc2IDAuNjcxLTEuMjMgMC42NzFoLTEuMzUzYy0wLjI4OCAwLTAuNTE2LTAuMTE4LTAuNjI4LTAuMzI0LTAuMTExLTAuMjA2LTAuMDg1LTAuNDYzIDAuMDczLTAuNzAzbDIuOTc2LTQuNTQ1YTAuNzA0IDAuNzA0IDAgMCAwIDJlLTMgLTAuNjc2bC0yLjY0LTQuMDc0Yy0wLjE1NS0wLjI0MS0wLjE4LTAuNDk4LTAuMDY5LTAuNzA0IDAuMTEzLTAuMjA2IDAuMzQyLTAuMzI0IDAuNjMtMC4zMjRoMS4yODZjMC40NTcgMCAwLjk4NCAwLjI5MiAxLjIyNSAwLjY4bDEuNDkgMi4zODVhMC4yMyAwLjIzIDAgMCAwIDAuMDQ4IDAuMDU3YzNlLTMgLThlLTMgMC4wMi0wLjAyNCAwLjA0LTAuMDU3bDEuNDU1LTIuMzhjMC4yMzktMC4zOSAwLjc2NC0wLjY4NSAxLjIyMi0wLjY4NWgxLjI2N2MwLjI4NyAwIDAuNTE2IDAuMTE4IDAuNjI4IDAuMzI0IDAuMTEzIDAuMjA2IDAuMDg5IDAuNDYyLTAuMDY3IDAuNzA0bC0yLjY1OCA0LjE1YTAuNjk5IDAuNjk5IDAgMCAwIDVlLTMgMC42NzVsMi45NyA0LjQ3YzAuMTU5IDAuMjQgMC4xODcgMC40OTYgMC4wNzYgMC43MDJ6IiBmaWxsPSIjMmQ4OWVmIi8+CiA8Y2lyY2xlIGN4PSIxNjguMTgiIGN5PSI3NCIgcj0iMTAuNSIgZmlsbD0iIzMzMyIgc3Ryb2tlPSIjZmZmIi8+CiA8cGF0aCBkPSJtMTczLjU3IDc5LjM2MmMtMC4xMzQgMC4yLTAuMzY4IDAuMzE0LTAuNjQyIDAuMzE0aC0xLjExM2MtMC40OCAwLTAuOTc1LTAuMzQtMS4xNDctMC43ODlsLTAuNDktMS4yNzVhMC42NDIgMC42NDIgMCAwIDAtMC41MzItMC4zNjVoLTMuMDM2YTAuNjIgMC42MiAwIDAgMC0wLjUyIDAuMzY0bC0wLjQ2IDEuMjY3Yy0wLjE2MyAwLjQ0Ny0wLjY2MyAwLjc5OC0xLjE0IDAuNzk4aC0xLjA1M2MtMC4yNzMgMC0wLjUwOC0wLjExNS0wLjY0NC0wLjMxMy0wLjEzNi0wLjE5OS0wLjE1Ny0wLjQ1OS0wLjA1OC0wLjcxM2wzLjcxNi05LjU0YTEuMjkzIDEuMjkzIDAgMCAxIDEuMTUtMC43ODZoMS4wNDdjMC40OCAwIDAuOTc2IDAuMzM2IDEuMTU0IDAuNzgxbDMuODIgOS41NDVjMC4xMDQgMC4yNTMgMC4wODUgMC41MTMtMC4wNSAwLjcxMnptLTUuNDY3LTcuMjU3LTAuOTI2IDIuNTQyYy0wLjAyIDAuMDU1LTAuMDE4IDAuMDk1LThlLTMgMC4xMDkgMC4wMSAwLjAxMyAwLjA0NiAwLjAzIDAuMTA0IDAuMDNoMS42ODFjMC4wNjcgMCAwLjA5Ny0wLjAxOCAwLjEwMy0wLjAyOCA3ZS0zIC0wLjAxMSAwLjAxNC0wLjA0NS0wLjAxLTAuMTA3eiIgZmlsbD0iIzVkYzIxZSIvPgogPGNpcmNsZSBjeD0iMTg4LjE4IiBjeT0iNTQiIHI9IjEwLjUiIGZpbGw9IiMzMzMiIHN0cm9rZT0iI2ZmZiIvPgogPHBhdGggZD0ibTE5My41NCA1OC4xMThhMy40MiAzLjQyIDAgMCAxLTEuMTEgMS4zMThjLTAuNDY3IDAuMzI3LTEuMDQ2IDAuNTMzLTEuNzIyIDAuNjA3LTAuNDE1IDAuMDQzLTEuMzc1IDAuMDctMi44NTUgMC4wOGgtMy4yNzZjLTAuNTUxIDAtMS0wLjQ0OC0xLTF2LTEwLjI0NWMwLTAuNTUyIDAuNDQ5LTEgMS0xaDMuOTYyYzAuOTQ1IDAgMS42MzQgMC4wMzkgMi4xMDYgMC4xMTkgMC40OTYgMC4wODQgMC45NDcgMC4yNjMgMS4zNCAwLjUzIDAuMzk4IDAuMjc1IDAuNzMgMC42MzYgMC45ODYgMS4wNzQgMC4yNjcgMC40NTQgMC40MDIgMC45NjcgMC40MDIgMS41MjMgMCAwLjYwNi0wLjE2NSAxLjE2OS0wLjQ5MSAxLjY3M2EzLjA2IDMuMDYgMCAwIDEtMC42OTIgMC43NThsLTAuMDIzIDAuMDE3IDAuMDE4IDAuMDFjMC40NTQgMC4yMjQgMC44MyAwLjUyOSAxLjEyIDAuOTA1IDAuNDIyIDAuNTUzIDAuNjM3IDEuMjA3IDAuNjM3IDEuOTQ4YTMuNzkgMy43OSAwIDAgMS0wLjQwMSAxLjY4NHptLTMuNDM3LTIuODk2Yy0wLjE5NS0wLjA2OS0wLjY5NC0wLjE1LTEuOTY4LTAuMTVoLTEuMjJhMC4zNCAwLjM0IDAgMCAwLTAuMzQgMC4zNHYxLjc1OWMwIDAuMTg4IDAuMTUzIDAuMzQgMC4zNCAwLjM0aDEuNDk3YzEuMDE4IDAgMS4zOTgtMC4wMzQgMS41MzctMC4wNjMgMC4yODQtMC4wNTMgMC41MDItMC4xNyAwLjY3Mi0wLjM2IDAuMTYzLTAuMTg0IDAuMjQzLTAuNDM1IDAuMjQzLTAuNzYzIDAtMC4yODMtMC4wNjMtMC41MS0wLjE5My0wLjY5OWExLjEwNyAxLjEwNyAwIDAgMC0wLjU2OC0wLjQwNHptLTMuMTg4LTIuNzM4aDAuODY1YzAuODk1IDAgMS40NTQtMC4wMTMgMS42NjEtMC4wMzcgMC4zMjItMC4wMzggMC41NzQtMC4xNDcgMC43NDktMC4zMiAwLjE2Ni0wLjE2NyAwLjI0Ny0wLjM4NyAwLjI0Ny0wLjY3MiAwLTAuMTM2LTAuMDE3LTAuMjYtMC4wNTItMC4zNjctMC4wNTEtMC4xNi0wLjI5LTAuNDIyLTAuNDQ3LTAuNDg4LTAuMTEtMC4wNDctMC4yNC0wLjA4LTAuMzktMC4wOTgtMC4yMTMtMC4wMjUtMC44NzMtMC4wMzctMS45NTgtMC4wMzdoLTAuNjc0YTAuMzQgMC4zNCAwIDAgMC0wLjM0IDAuMzR2MS4zMzljMCAwLjE4OCAwLjE1MiAwLjM0IDAuMzQgMC4zNHoiIGZpbGw9IiNlMTEiLz4KIDxjaXJjbGUgY3g9IjE2OC4xOCIgY3k9IjM0IiByPSIxMC41IiBmaWxsPSIjMzMzIiBzdHJva2U9IiNmZmYiLz4KIDxwYXRoIGQ9Im0xNzMuMTMgMjkuMzUzLTMuMjY5IDUuMTZjLTAuMTQ5IDAuMjM2LTAuMjggMC42ODctMC4yOCAwLjk2NXYzLjI0OWEwLjk1IDAuOTUgMCAwIDEtMC45NDggMC45NDhoLTAuOTE2YTAuOTUgMC45NSAwIDAgMS0wLjk0OS0wLjk0OHYtMy4yNjRjMC0wLjI3OS0wLjEzLTAuNzI5LTAuMjgtMC45NjRsLTMuMjU0LTUuMTQ2Yy0wLjE1Mi0wLjI0My0wLjE3Ni0wLjUtMC4wNjItMC43MDUgMC4xMTMtMC4yMDUgMC4zNDMtMC4zMjMgMC42MjktMC4zMjNoMS4yOTNjMC40NiAwIDAuOTgzIDAuMjk3IDEuMjE5IDAuNjkybDEuODgzIDMuMTY3YzAuMDEzIDAuMDIgMC4wMjMgMC4wMzUgMC4wMzMgMC4wNDUgNGUtMyAtMC4wMSAwLjAxMy0wLjAyNCAwLjAyNS0wLjA0NGwxLjg0NC0zLjE2M2MwLjIzMi0wLjM5OCAwLjc1NC0wLjY5NyAxLjIxNS0wLjY5N2gxLjI1MmMwLjI4NyAwIDAuNTE2IDAuMTE4IDAuNjI5IDAuMzI0IDAuMTE0IDAuMjA1IDAuMDkgMC40NjItMC4wNjQgMC43MDR6IiBmaWxsPSIjZmZjNDBkIi8+CiA8ZyBmaWxsPSIjMzMzIj4KICA8cGF0aCBkPSJtMzYuMzk3IDQ2LjY5YzAgMC42MDQgMC40OSAxLjA5NCAxLjA5MyAxLjA5NGgxMi4xOXYxMi40MzJoLTEyLjE5Yy0wLjYwMyAwLTEuMDkzIDAuNDktMS4wOTMgMS4wOTN2MTIuMTkxaC0xMi40MzR2LTEyLjE5YzAtMC42MDQtMC40OS0xLjA5NC0xLjA5My0xLjA5NGgtMTIuMTl2LTEyLjQzMmgxMi4xOWMwLjYwMyAwIDEuMDkzLTAuNDkgMS4wOTMtMS4wOTN2LTEyLjE5MWgxMi40MzR6IiBzdHJva2U9IiNmZmYiLz4KICA8cGF0aCBkPSJtMTA0LjY0IDguMjQ1Yy0zLjA3NSAwLjE4NC01LjA5OCAxLjQ5OC01LjU4OCAxLjg0OC0wLjQ3My0wLjM0My0yLjQyNS0xLjU5Ny01LjM4My0xLjgyNSAxLjY3OC0wLjc5MiAzLjUzMi0xLjI2OCA1LjUwOC0xLjI2OCAxLjk2IDAgMy43OTcgMC40NjYgNS40NjQgMS4yNDV6bS01LjU4NyA4LjdjNi43ODggNS4yNDIgOC44ODggOS42MjIgOS41MzUgMTEuOTczLTIuMzcxIDIuNTAzLTUuNzAyIDQuMDgyLTkuNDEyIDQuMDgyLTMuODEzIDAtNy4yMTQtMS42OC05LjU5NS00LjMwMyAwLjcxOC0yLjQwMiAyLjg5MS02LjY3MSA5LjQ3Mi0xMS43NTN6bTguMzYxLTYuOTJjMi44ODQgMi4zODggNC43NjIgNS45NDcgNC43NjMgOS45NzUgMCAyLjc5Ny0wLjkwOSA1LjM3Ni0yLjQxOCA3LjQ5OSAwLjMyNS02LjYzNy03LjA2Ny0xMy44MzgtNy4wNjctMTMuODM4IDAuMjY4LTEuNDc2IDIuOTc4LTIuODA3IDQuNzIyLTMuNjM2em0tMTYuNTY1IDAuMDc3YzEuNzQ0IDAuODMyIDQuMzA3IDIuMTM0IDQuNTY4IDMuNTY1IDAgMC03LjEzMyA2Ljk1Ni03LjA3MyAxMy40OTdhMTIuOTI2IDEyLjkyNiAwIDAgMS0yLjE2Ny03LjE2MWMwLTMuOTg3IDEuODM4LTcuNTE2IDQuNjcyLTkuOXoiLz4KICA8cGF0aCBkPSJtOTkuNzYxIDY1LjIzMmgtMS41MzY0djcuNjgyMmgxLjUzNjR2LTcuNjgyMm0zLjcxMDUgMS42NjctMS4wOTA5IDEuMDkwOWMxLjI1OTkgMS4wMTQgMS45ODk3IDIuNTQyOCAxLjk4OTcgNC4xNTYxYTUuMzc3NSA1LjM3NzUgMCAwIDEtNS4zNzc1IDUuMzc3NWMtMi45NjUzIDAtNS4zNzc1LTIuMzk2OC01LjM3NzUtNS4zNzc1IDAtMS42MDU2IDAuNzI5ODEtMy4xNDIgMS45ODItNC4xNjM3bC0xLjA4MzItMS4wODMyYy0yLjkxMTUgMi40NzM3LTMuMjY0OSA2LjgzNzEtMC43OTEyNiA5Ljc0ODcgMi40NzM3IDIuOTAzOSA2LjgzNzEgMy4yNTcyIDkuNzQ4NyAwLjc4MzU4IDEuNTUxOC0xLjMxMzYgMi40MzUyLTMuMjQ5NiAyLjQzNTItNS4yODUzIDAtMi4wMjA0LTAuODkxMTMtMy45NDEtMi40MzUyLTUuMjQ2OXoiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9Ii43NjgyMiIgc3R5bGU9InBhaW50LW9yZGVyOnN0cm9rZSBmaWxsIG1hcmtlcnMiLz4KIDwvZz4KPC9zdmc+Cg== +elements: + - type: service-button + title: "" + service: remote.send_command + service_data: + entity_id: remote.xboxone_remote + command: Up + style: + top: 45.35% + left: 14.3% + width: 6.2% + height: 15% + overflow: hidden + - type: service-button + title: "" + service: remote.send_command + service_data: + entity_id: remote.xboxone_remote + command: Down + style: + top: 74.7% + left: 14.3% + width: 6.2% + height: 15% + overflow: hidden + - type: service-button + title: "" + service: remote.send_command + service_data: + entity_id: remote.xboxone_remote + command: Left + style: + top: 60% + left: 8.05% + height: 14.4% + width: 6.4% + overflow: hidden + - type: service-button + title: "" + service: remote.send_command + service_data: + entity_id: remote.xboxone_remote + command: Right + style: + top: 60% + left: 20.65% + height: 14.4% + width: 6.4% + overflow: hidden + - type: service-button + title: "" + service: remote.send_command + service_data: + entity_id: remote.xboxone_remote + command: 'A' + style: + top: 82.5% + left: 80.05% + width: 10.5% + height: 24.4% + border-radius: 100% + overflow: hidden + - type: service-button + title: "" + service: remote.send_command + service_data: + entity_id: remote.xboxone_remote + command: 'X' + style: + top: 60.0% + left: 70.6% + width: 10.5% + height: 24.4% + border-radius: 100% + overflow: hidden + - type: service-button + title: "" + service: remote.send_command + service_data: + entity_id: remote.xboxone_remote + command: 'B' + style: + top: 60.0% + left: 89.5% + width: 10.5% + height: 24.4% + border-radius: 100% + overflow: hidden + - type: service-button + title: "" + service: remote.send_command + service_data: + entity_id: remote.xboxone_remote + command: 'Y' + style: + top: 37.9% + left: 80.05% + width: 10.5% + height: 24.4% + border-radius: 100% + overflow: hidden + - type: service-button + title: "" + service: remote.toggle + service_data: + entity_id: remote.xboxone_remote + style: + top: 80.2% + left: 47.2% + width: 7% + height: 16% + border-radius: 100% + overflow: hidden + - type: service-button + title: "" + service: media_player.play_media + service_data: + entity_id: media_player.xboxone + media_content_type: '' + media_content_id: 'Home' + style: + top: 22.2% + left: 47.2% + width: 13.4% + height: 31.2% + border-radius: 100% + overflow: hidden +``` + +## Binary Sensor + +The Xbox binary sensor platform automatically keeps track of your "**Favorite** friends". In your friends list, select **Change friendship -> Favorite** in order to have that person automatically pulled into Home Assistant. + +There are 4 binary sensors that are added, 3 of which are disabled by default. They can be enabled in the "Xbox Live" service on the devices page. + +| Entity ID | Default | Description | +| ----------------------------------------- | -------- | ------------------------------------------------------------| +| `binary_sensor.{gamertag}` | Enabled | Shows the online status of your friend. | +| `binary_sensor.{gamertag}_in_game` | Disabled | Shows if your friend is currently playing a game. | +| `binary_sensor.{gamertag}_in_party` | Disabled | Shows if your friend is currently in a party. | +| `binary_sensor.{gamertag}_in_multiplayer` | Disabled | Shows if your friend is currently in a multiplayer session. | + +## Sensor + +Just like the binary sensors, the Xbox sensor platform automatically keeps track of your "**Favorite** friends". + +There are 4 sensors that are added, **all** of which are disabled by default. They can be enabled in the "Xbox Live" service on the devices page. + +| Entity ID | Default | Description | +| ---------------------------------| -------- | -------------------------------------------------------------------------| +| `sensor.{gamertag}_status` | Disabled | Shows the text status of your friend as it appears in your friends list. | +| `sensor.{gamertag}_gamer_score` | Disabled | Shows your friend's gamer score. | +| `sensor.{gamertag}_account_tier` | Disabled | Shows your friend's Xbox Live account tier (Gold or Silver). | +| `sensor.{gamertag}_gold_tenure` | Disabled | Shows how long your friend has had Xbox Live Gold. | + +## Media Source + +The Xbox media source platform allows you to use the Media Browser panel to view both your own, and community, gameclips or screenshots for games that you have installed on any of your consoles. As with any other media source integration, you are also able to send these clips to supported media players like Chromecast. + +
+It can take up to a couple of days for newly installed applications to appear in the media browser. +
+ +## Manual Configuration + +
+These steps are not required, nor will they be supported if issues are encountered. It is recommended to add the integration directly in the Integrations page. +
+ +If you prefer not to use the Home Assistant account linking service, you may manually configure a local implementation using the following steps: + +- Register a new application in [Azure AD](https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade) + - Name your app + - Select "Personal Microsoft accounts only" under supported account types + - For Redirect URI, add: `/auth/external/callback` + Use your internal Home Assistant URL, if you didn't configure one manually, use your local IP address. Examples: `http://192.168.0.2:8123/auth/external/callback`, `http://homeassistant.local:8123/auth/external/callback`. +- Copy your Application (client) ID for later use +- On the App Page, navigate to "Certificates & secrets" + - Generate a new client secret and save for later use + +Add the client id and secret to your `configuration.yaml`: + +```yaml +# Example configuration.yaml entry +xbox: + client_id: YOUR_CLIENT_ID + client_secret: YOUR_CLIENT_SECRET +``` + +Finish setup in the UI through **Configuration -> Integrations -> Xbox**. + +{% configuration %} +client_id: + description: The `client id` from your Azure AD Application. + required: true + type: string +client_secret: + description: The `client secret` from your Azure AD Application. + required: true + type: string +{% endconfiguration %} diff --git a/source/images/integrations/xbox/xbox_picture_entity.png b/source/images/integrations/xbox/xbox_picture_entity.png new file mode 100644 index 0000000000000000000000000000000000000000..4310981df78a7d87fbb41c99fbfa754a6e4ae6c4 GIT binary patch literal 18354 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 literal 0 HcmV?d00001