Universal Remote Card - Buttons, Touchpads, Sliders, and Keyboards for Multiple Platforms

With the latest updates it’s working for me too. Cheers.

Not an update post, but I was influenced by a Reddit post and recreated the Spotify music controls using this card. The config is in the README. It’s all done using built in style options and templates. It even has a hidden volume slider that uses the exec action to change the values of CSS styles to hide/show it.

3 Likes

Hi everyone,

The crunchyroll button doesnt seem to work. Can I fix it myself ?

Thanks a lot :slight_smile:

Hello guys,

I am trying to make XBOX remote, but can’t figure out correct command syntax.
Can you please check and advise what’s wrong:

type: custom:android-tv-card
rows:
  - - - power
    - - home
    - - menu
  - - dpad
    - xpad
remote_id: remote.xbox_series_x_remote
custom_actions:
  - type: button
    name: power
    tap_action:
      action: toggle
      data:
        entity_id: remote.xbox_series_x_remote
    icon: mdi:power
  - type: button
    name: home
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: Home
    icon: mdi:microsoft-xbox
  - type: button
    name: menu
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: Menu
    icon: mdi:menu
  - type: button
    name: up
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: Up
    hold_action:
      action: repeat
    icon: mdi:arrow-up
  - type: button
    name: down
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: Down
    hold_action:
      action: repeat
    icon: mdi:arrow-down
  - type: button
    name: left
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: Left
    hold_action:
      action: repeat
    icon: mdi:arrow-left
  - type: button
    name: right
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: Right
    hold_action:
      action: repeat
    icon: mdi:arrow-right
  - type: button
    name: x
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: X
    hold_action:
      action: repeat
    icon: mdi:alpha-x-circle
  - type: button
    name: "y"
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: "y"
    hold_action:
      action: repeat
    icon: mdi:alpha-y-circle
  - type: button
    name: b
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: B
    hold_action:
      action: repeat
    icon: mdi:alpha-b-circle
  - type: button
    name: a
    tap_action:
      action: remote.send_command
      data:
        entity_id: remote.xbox_series_x_remote
        command: A
    hold_action:
      action: repeat
    icon: mdi:alpha-a-circle
keyboard_id: remote.xbox_series_x_remote
media_player_id: media_player.xbox_series_x


service_data is not a valid field. Use data instead. Even better, use the configuration UI.

1 Like

Hello,

Is there a way to prevent the TV from turning on when accidentally touching the touchpad while scrolling through devices in the Home Assistant mobile app? How can I do it?

Thanks in advance!

Set this in your remote general styles (or use the :host selector in the touchpad styles)

{% if is_state(config.media_player_id, "off") %}
remote-touchpad {
  pointer-events: none;
}
{% endif %}

Anyone know how to fire the TV guide (live TV) for FireTV? I have this code, but it doesn’t do anything. The button works fine on the remote:

type: button
name: TV-Guide
autofill_entity_id: true
icon: mdi:television-classic
entity_id: media_player.fire_tv_192_168_1_89
tap_action:
  action: perform-action
  perform_action: media_player.select_source
  target:
    entity_id: media_player.fire_tv_192_168_1_89
  data:
    source: com.amazon.tv.livetv
label: null

Hello everyone.
New to this integration. Fantastic work BTW.
I am working on a remote for my parents’ android tv Panasonic. I have been able to find all the buttons I need with the exception of source/input/hdmi. I would like to be able to switch inputs from HDMI3 to TV/ANT. I noticed that there is a TV button, but it only recalls the previous input used. Any ideas where I could find a total list of buttons/commands? would there be a way to find the commands specific to this TV?

I discovered with my android TV that I can switch source with F1/2/3/4/5 … maybe it’s the solution.

The “Crunchyroll” source doesnt work. Is it possible to repair it myself ?

I would like to custom some icon. Like switch icons for F1 - F2. Is it possible ?

Thanks a lot.

Version 4.5.0 is out with a bunch of features:

  • A new remote element - circlepads
    • Like the old Google TV styled dpad example but more stable and directly customizable.
  • Refactored sliders to be more performant and use CSS for translation and transition animations.
  • More in depth keyboard controls (not keyboard text input) for controlling remote elements and assigning keyboard keys to buttons.
  • New default platforms Philips TV and Generic Remote.
  • Editor babyproofing to only show required fields for the selected platform.
4 Likes


Please help to align this two buttons. Thanks!!!

type: custom:universal-remote-card
platform: Samsung TV
media_player_id: media_player.tvhome
rows:
  - - - numpad
    - - n0
      - channel_up
      - channel_down
    - - volume_up
      - null
      - volume_down
    - circlepad
  - - home
    - channel_list
    - info
    - guide
    - back
remote_id: remote.tvhome
custom_actions:
  - type: circlepad
    name: circlepad
    tap_action:
      action: key
      key: KEY_ENTER
      deevice: null
    up:
      icon: mdi:chevron-up
      tap_action:
        action: key
        key: KEY_UP
      hold_action:
        action: repeat
    down:
      icon: mdi:chevron-down
      tap_action:
        action: key
        key: KEY_DOWN
      hold_action:
        action: repeat
    left:
      icon: mdi:chevron-left
      tap_action:
        action: key
        key: KEY_LEFT
      hold_action:
        action: repeat
    right:
      icon: mdi:chevron-right
      tap_action:
        action: key
        key: KEY_RIGHT
      hold_action:
        action: repeat
    styles: |-
      .circlepad {
        width: 174px;
        border: 1px solid #444;
        background: radial-gradient(circle at top left, #202020 15%, #303030 100%);
        --icon-color: rgba(128,128,128,0.5);
      }

      #center::part(button) {
        background: radial-gradient(circle at top left, #303030 15%, #101010 100%);
        border: 1px solid rgba(0, 0, 0, 0.5);
      }
      #center::part(icon) {
        color: rgba(128,128,128, 0.8);
        --size: 36px;
      }

      #left,
      #right {
        width: 100%;
      }
    icon: ok
custom_icons: []

Add this to your overall CSS styles.

.column {
  gap: 8px
}
1 Like


thanks!!!

please just one more help… have this fix inside: browser_mod.popup

type: heading
heading: Media
heading_style: title
badges:
  - type: entity
    show_state: false
    show_icon: true
    entity: scene.a_tv_home
    icon: mdi:movie-roll
tap_action:
  action: perform-action
  perform_action: browser_mod.popup
  target: {}
  data:
    title: Fechar
    dismissable: true
    autoclose: false
    timeout: 640000
    card_mod:
      style:
        ha-dialog$: |
          .mdc-dialog__scrim {
            background: rgba(0, 0, 0, 0.4);
          }
          .mdc-dialog__container {
            display: flex !important;
            justify-content: flex-end !important;
            align-items: flex-start !important;
            height: auto !important;
          }
        .: |
          ha-dialog {
            --dialog-backdrop-filter: blur(0.8em);
            position: fixed !important;
            top: 0 !important;
            right: 0 !important;
            transform: translate(-300px, 350px); /* Ajuste conforme sua preferência de posicionamento */
            margin: 0 !important;
            height: auto !important;
            width: auto !important;
            max-width: 95vw !important;
            max-height: 95vh !important;
            z-index: 1000 !important; /* Garante que o popup fique sobre outros elementos */
          }
    browser_id:
      - 667065a5b4ac882a71541f6dd0c993bc
    content:
      type: custom:universal-remote-card
      platform: Samsung TV
      media_player_id: media_player.tvhome
      rows:
        - - - numpad
          - - n0
            - channel_up
            - channel_down
          - - volume_up
            - null
            - volume_down
          - circlepad
        - - home
          - channel_list
          - info
          - guide
          - back
      remote_id: remote.tvhome
      custom_actions:
        - type: circlepad
          name: circlepad
          tap_action:
            action: key
            key: KEY_ENTER
          up:
            icon: mdi:chevron-up
            tap_action:
              action: key
              key: KEY_UP
            hold_action:
              action: repeat
          down:
            icon: mdi:chevron-down
            tap_action:
              action: key
              key: KEY_DOWN
            hold_action:
              action: repeat
          left:
            icon: mdi:chevron-left
            tap_action:
              action: key
              key: KEY_LEFT
            hold_action:
              action: repeat
          right:
            icon: mdi:chevron-right
            tap_action:
              action: key
              key: KEY_RIGHT
            hold_action:
              action: repeat
          styles: |-
            .circlepad {
              width: 174px;
              border: 1px solid #444;
              background: radial-gradient(circle at top left, #202020 15%, #303030 100%);
              --icon-color: rgba(128,128,128,0.5);
            }
            #center::part(button) {
              background: radial-gradient(circle at top left, #303030 15%, #101010 100%);
              border: 1px solid rgba(0, 0, 0, 0.5);
            }
            #center::part(icon) {
              color: rgba(128,128,128, 0.8);
              --size: 36px;
            }
            #left, #right { width: 100%; }
          icon: ok
      custom_icons: []
      card_mod:
        style:
          ha-dialog$: |
            div.mdc-dialog div.mdc-dialog__scrim {
              background: rgba(0, 0, 0, 0.4);
            }
            div.mdc-dialog__container {
              --vertical-align-dialog: center !important;
            }
            div.mdc-dialog__container {
              --horizontal-align-dialog: right !important;
            }
          .: |
            .column {
            gap: 8px
            }

Don’t use card-mod to style this card. The built in style options are just as capable and much more performant. Create a styles field and put the column styles in there at the root level of the card config similar to how you did for the circlepad.

You’ll also be better off putting the popup in a separate popup card and opening that using a more-info action. Or switching to bubble card for modal bottom sheet pop-ups.

2 Likes

thanks!! now is perfect

1 Like

Hey,
Pretty new to HA in general, and just found this awesome project.
I am working on setting up a remote dashboard today and the Discovery Plus default doesn’t work.

I believe they recently replaced their app with a whole new package so that’s probably why. The previous method I had tried (before this project) using the non-ADB Android TV integration was Remote:Turn On and then putting in the package name. That works fine for all my other apps but with D+ is just opens it in the Play Store instead of opening the app itself.

The D+ package name is com.discovery.discoveryplus.mobile, I got through ADB. From searching around, it seems like to launch it through ADB, you have to do am start -n packagename/packagename.activity. I installed Activity Launcher on my phone to try and get the correct activity for D+, which appears to be FuseActivity as that’s the only one that works using that app on my phone, but trying to use that in ADB doesn’t work, just says it doesn’t exit.

So I tried to figure it out to give you more info, but I’m at a loss right now.

Also, I saw some earlier discussion on SmartTube. It’s not listed as a default so I just made a custom element and used the Remote: Turn On and just put in the package name for the activity (com.teamsmart.videomanager.tv) and that works just fine.

1 Like

Opening the app store page vs the app itself is an issue with some apps, one we can’t get around as it’s something the developers of those apps have to fix.

The YouTube default source opens SmartTube for me. I think I disabled the default YouTube app, but I’m not sure if that’s necessary.

Ah yeah forgot that’s what it was for SmartTube. Eh, I’ll stick with what I did.

Anyway, I just figured out Discovery Plus.
Via ADB:

am start -n com.discovery.discoveryplus.mobile/com.wbd.beam.BeamActivity

is what works. It’s weird because on my phone it’s com.wdb.fuse.appcore.FuseActivity. That’s what threw me off.