I Built a WAY Better Smart TV Remote

Switching from iOS to Android meant that I could not easily control my Apple TV, so I built my own remote! I showed it in this video.

It’s very easy to build yourself and will work on any phone, tablet, or desktop. You do not need an Apple, TV but this will be using Home Assistant.

Custom Subview

The first thing to do is create a new view on the dashboard. To do that, click on the “pencil icon” button to edit the dashboard. Then click on the “plus button” at the top to create a new view.

I would recommend turning on “Subview”. This will allow you to go into this view from any dashboard. Then when you don’t need to use the remote anymore, there’s a back arrow that will take you to the previous dashboard you were at.

What you will definitely need to do is click on “Section (experimental)” under the View type. This will allow drag and drop and make life much easier.

Next you will need a button to get to the subview if you decided to use it. I created a badge at the top of my main dashboard because I use it so often. Here is a screenshot of how the badge is configured and the code.

type: entity
show_name: true
show_state: false
show_icon: true
entity: sensor.time
icon: mdi:remote-tv
color: accent
tap_action:
  action: navigate
  navigation_path: /lovelace-dash/remote_family_room
name: Remote

For the entity I’m using “time.” That might seem weird, but it is always on and that means the badge button will always be the color I want. You can put any entity in there. The important part is the action when it’s clicked, and make sure to choose Navigate and add the path to the subview. If you don’t know the path to the subview, just go to the subview in a browser and look at the URL.

Create a button

Now it’s time to create a button for the remote. You can use the Button card but I choose the Tile card. The reason for that is I can change the color of the icon.

I know there are community add-ons to change the button card, but I was feeling lazy at the time. I created this entire dashboard on my phone while watching TV so I was going for the fastest and easiest way. What card you use or how you style it is 100% personal choice on what you like!

For the Tile card, I just made the Icon the arrow of the button or whatever seemed fitting for the button. Here is how I changed the Icon and color. I also used it in Vertical and hid the state.

Then for the action, make sure to use Remote Send Command. For the command it is just “up” since it’s an up arrow. If you are using an Apple TV, here are all the commands for the remote.

If you want all the code for one button, here it is.

type: tile
entity: remote.family_room_tv
tap_action:
  action: perform-action
  perform_action: remote.send_command
  target:
    entity_id: remote.family_room_tv
  data:
    hold_secs: 0
    command: up
icon: mdi:arrow-up-bold
vertical: true
hide_state: true
name: ' '
show_entity_picture: false
layout_options:
  grid_columns: 1
  grid_rows: 2
icon_tap_action:
  action: perform-action
  perform_action: remote.send_command
  target:
    entity_id: remote.family_room_tv
  data:
    hold_secs: 0
    command: up
color: accent

Once you have made one button, it’s super easy to make more. All you have to do is duplicate the card and swap out the icon and command. Probably the most difficult part is just deciding which icon to use!

Oh and one of the tricky commands was the back arrow on the Apple TV remote. For that command, it was just “menu.” So hopefully that’s helpful.

Here is what my layout looks like after I added everything.

More buttons

I have a few more buttons that don’t just do a simple TV remote command. One button skips ahead on commercials. For that button, I have the action call a script since it does two remote commands.

The script is very similar to the buttons above. It starts with pressing the select button first and then the right button 15 times.

Here is the code for the script, and you can see it’s pretty simple.

alias: Skip TV commercials family room tv
sequence:
  - action: remote.send_command
    metadata: {}
    data:
      command: select
    target:
      entity_id: remote.family_room_tv
  - action: remote.send_command
    metadata: {}
    data:
      command: right
      num_repeats: 15
    target:
      entity_id: remote.family_room_tv
description: ""
icon: mdi:debug-step-over

The other type of button I have on the remote is one that jumps into specific apps on the Apple TV, like YouTube TV or Netflix.

Here is what the action of the button looks like.

Also the code for the button.

type: tile
entity: media_player.family_room_tv_2
name: YouTube TV
icon: mdi:youtube-tv
hide_state: true
tap_action:
  action: perform-action
  perform_action: media_player.select_source
  target:
    entity_id: media_player.family_room_tv_2
  data:
    source: YouTube TV
color: white
icon_tap_action:
  action: perform-action
  perform_action: media_player.select_source
  target:
    entity_id: media_player.family_room_tv_2
  data:
    source: YouTube TV

Just change the source for each of the different apps on the Apple TV. Here is a list of the ones I use.

YouTube
YouTube TV
Max
Netflix
Plex
Spotify
PBS KIDS
Prime Video

The were some icons not available with the default Home Assistant, so the Custom Brand Icons came in clutch for lots of options!

Here is what my other section of the remote looks like.

Oh and I forgot to talk about the Reload button in the video. If the Apple TV integration becomes unavailable, I have a button to quickly reload that configuration. Here is the action for that.

metadata: {}
data: {}
target:
  entity_id:
    - media_player.family_room_tv_2
action: homeassistant.reload_config_entry

Automations

I also have an automation that reloads the Apple TV configuration in Home Assistant if it becomes unavailable. I don’t know why this isn’t always an automatic thing but this automation keeps the Apple TV connected 99% of the time.

alias: Reboot Apple TV config if unavailable
description: ""
trigger:
  - platform: state
    entity_id:
      - media_player.family_room_tv_2
    to: unavailable
condition: []
action:
  - metadata: {}
    data: {}
    target:
      entity_id:
        - media_player.family_room_tv_2
    action: homeassistant.reload_config_entry
mode: single

For the kid out of bed automation that turns off the TV using the motion sensors, all it does is send the remote command “pause” and then suspend. Here is the code.

alias: Kid TV alert triggered
description: Kid is out of bed so pause the TV
trigger:
  - type: motion
    platform: device
    device_id: b8262048d8de87c35bdc49f2536bf9a9
    entity_id: e054a24b4cc1ad58c3041ec8061024d7
    domain: binary_sensor
  - type: motion
    platform: device
    device_id: 2d980fcd07f0deddfb61e80371fcc98b
    entity_id: dd3ce90dad9a54af85fdbe431463c5cc
    domain: binary_sensor
condition:
  - condition: state
    entity_id: input_boolean.kid_tv_alert
    state: "on"
  - condition: state
    entity_id: media_player.family_room_tv_2
    state: playing
action:
  - action: remote.send_command
    metadata: {}
    data:
      command: pause
    target:
      entity_id: remote.family_room_tv
  - delay:
      hours: 0
      minutes: 0
      seconds: 1
      milliseconds: 0
  - action: remote.send_command
    metadata: {}
    data:
      command: suspend
    target:
      entity_id: remote.family_room_tv
mode: single

If you want to see how my lights automatically change using just the play and pause on the Apple TV then check out the video I made on it!