Vizio TV Integration

How would I go about implementing this code into a node inside of my node red automation to turn on all my TVs at my local church? I am looking to have them turn on and switch to the correct hdmi input. Sometimes the kids leave them on the wrong input after youth events. I have attached a photo of my node red automation.

At what step are you at? Have you followed the directions here to get AUTH codes for the TVs? This is a pairing request that will allow you to send commands to the API, it is the first step.

You would have to do that on every TV by their IP address and port (modern Vizio TVs use 7345 for the port).

Somehow I missed this. I am sorry, I will take a look at the guide and hopefully it will answer my questions. Thank you for your time! :slight_smile:

I am a little lost here. So I have the following in place for one of my TV’s:

Lovelace button card:

show_name: true
show_icon: true
type: button
tap_action:
  action: call-service
  service: rest_command.vizio_processkey
  data:
    ip: '[[[ 10.20.22.128 ]]]'
    port: '[[[ 7345 ]]]'
    auth: '[[[ Zho5ljpl6a ]]]'
    codeset: '[[[ 7 ]]]'
    code: '[[[ 1 ]]]'
  target: {}
name: Change TV Source

In my config I have this:

rest_command: !include rest.yaml

And in my rest.yaml I have this:

  vizio_processkey:
    url: "https://10.20.22.128:7345/key_command/"
    method: put
    content_type: "application/json"
    headers:
      AUTH: "Zh05ljpl6a"
    payload: '{"KEYLIST": [{"CODESET": {{ codeset | int }},"CODE": {{ code | int }},"ACTION":"KEYPRESS"}]}'
    verify_ssl: false

Yet, when I press the lovelace button card I get this error:

[140518314884544] ValueError: Template error: int got invalid input '[[[ 7 ]]]' when rendering template '{"KEYLIST": [{"CODESET": {{ codeset | int }},"CODE": {{ code | int }},"ACTION":"KEYPRESS"}]}' but no default was specified

What am I not understanding?

You are sending just the fixed data? … at the very least, button-templates are Javascript and should contain return:

    tap_action:
      action: call-service
      service: rest_command.vizio_processkey
      service_data:
        ip: '[[[ return variables.ip ]]]'
        port: '[[[ return variables.port ]]]'
        auth: '[[[ return variables.auth ]]]'
        codeset: '[[[ return variables.codeset ]]]'
        code: '[[[ return variables.code ]]]'

So they should be like:

      variablename: "[[[ return 'value' ]]]"

I just started a new addition to this code. I got “wife and kid” complaints when trying to search. They hate the OVER-OVER-DOWN-DOWN-SELECT to get “n”.

As it turns out, you can use key_command to send the ACSII code of the letter and BAM it works.

For example, this in my setup in Home Assistant will take a textbox and send each “letter” as the ord ASCII code:

alias: Execute Vizio Search
sequence:
  - repeat:
      sequence:
        - service: rest_command.vizio_processkey
          data:
            ip: 192.168.1.232
            port: "7345"
            auth: XXXXXXXXXX
            codeset: "0"
            code: |
              {{ repeat.item | ord }}
      for_each: |
        {{ states("input_text.vizio_search") | list }}
fields: {}
mode: single
icon: mdi:search-web

The command is built like this:

vizio_processkey:
  url: 'https://{{ ip }}:{{ port }}/key_command/'
  method: put
  content_type: "application/json"
  headers:
    AUTH: '{{ auth }}'
  payload: '{"KEYLIST": [{"CODESET": {{ codeset | int }},"CODE": {{ code | int }},"ACTION":"KEYPRESS"}]}'
  verify_ssl: false

It could be better, like I could build an array for KEYLIST and send all the keys but it is very fast as is.

So let’s say you want to search for “Hot Ones” … this code in Home Assistant takes that string and converts every letter to it’s ASCII equivalent (i.e. “a” = 97) and sends that key stroke. It loops for the entire length of the string and sends all the keys.

I have yet to figure out how to clear the search box, but sending delete like 20 times is fast.

Ultimately for the Vizio Integration I have, I will have a textbox that you type you search text into, with a button to search and a button to clear … have to think it all through. If anyone has suggestions they would like to see, let me know. I know I often search by typing a few letters and then adding more letters and this should support that.

Update: Here is the script to clear the search I used.

clear_vizio_search:
  alias: Clear Vizio Search
  sequence:
  - repeat:
      count: '{{ states(''input_text.vizio_search'') | length }}'
      sequence:
      - service: rest_command.vizio_processkey
        data:
          ip: 192.168.1.232
          port: '7345'
          auth: XXXXXXXX
          codeset: '0'
          code: 8
  - service: input_text.set_value
    data:
      value: ' '
    target:
      entity_id: input_text.vizio_search
  mode: single
  icon: mdi:trash-can

And inn the GUI:

image

This is amazing work!!

Just wanted to let you know of an easy way to get the AUTH code if you have the Vizio Smartcast integration:

Go to the Vizio Smartcast integration, enable debug logging

Turn the volume up or down in home assistant by going to the device

Go to Settings > System > Logs

Click load full logs, scroll to the bottom and look for an entry that looks like this:

2024-01-11 21:21:47.263 DEBUG (MainThread) [pyvizio.api._protocol] Using Request: {'method': 'get', 'url': 'https://{{  YOUR TV'S IP  }}:{{  YOUR TV'S PORT 
 }}/app/current', 'headers': {'AUTH': '{{  YOUR TV'S AUTH  }}  }}

Your tv’s IP, Port and Auth token should be there

1 Like

Very nice indeed! I have been doing some work lately on the Vizio/DirecTV side trying to solve/workaround issues in pyvizio because modern TVs do not support “HDMI-1” …etc. They require “hdmi1”.

It is still not the best going back and forth between Smartcast and changing to a different input. I will likey need to fork pyvizio as no one seems to be able to jump on this and fix it.

The other enhancement will be adding a single set of buttons per TV that are the most common APPs (like the quick apps buttons on the Vizio remote) that would always be in the GUI. (A wife request as she hates scrolling through the 120+ apps to find what she wants to pick as the APP).

Update: Once all tested, I will post but here’s a peak.
Vizio Remote now has five quick buttons you can jump to without scrolling through the lists of apps. It also has search you can select the search widget and type in your search.

1 Like

All … I have finished a complete rewrite for the Vizio/DirecTV remotes. S creen teaser is below:

This shows four remotes:

  1. Kitchen is off
  2. Bedroom is on to Smartcast and reveals a few things added. This includes a quick set of buttons that can be used to quickly get to a specific app. It is has a keyboard for inputting information in the various search panels that exist (either in Smartcast or in the app itself like YouTube). The bottom half is the full set of apps available that can be used to go to something not in the quick app selection.
  3. The office is set to DirecTV and shows a key board to key in channel numbers in any mode (guide or direct).
  4. The Patio is also set to DirecTV and exposes the list of favorites I have for this TV

The biggest difference is that every single remote is configured with decluttering. So there is only one template for a remote with some variables passed in to control that combination of Vizio TV + DirecTV.

So those four TVs are as simple as this:

    type: custom:vertical-layout
    badges: []
    cards:
      - type: custom:decluttering-card
        template: remote_control
        variables:
          - vizio: kitchen_vizio
          - directv: directv_kitchen
          - audio_source: broadlink
          - device: 'Kitchen Soundbar'
          - remote: remote.broadlink_kitchen_remote
      - type: custom:layout-break
      - type: custom:decluttering-card
        template: remote_control
        variables:
          - vizio: bedroom_vizio
          - directv: directv_bedroom
          - audio_source: broadlink
          - device: 'Master Denon'
          - remote: remote.broadlink_bedroom_remote
      - type: custom:layout-break
      - type: custom:decluttering-card
        template: remote_control
        variables:
          - vizio: office_vizio
          - directv: directv_office
          - audio_source: vizio
      - type: custom:layout-break
      - type: custom:decluttering-card
        template: remote_control
        variables:
          - vizio: patio_vizio
          - directv: directv_patio
          - audio_source: vizio

If there is interest for you all, I can post all the relevant things on Github. I will note that I mostly solved the switch to smartcast and DirecTV that plagues us using rest commands to switch inputs BUT it is design for two because that is all I have on my TVs (one is Smartcast, the other DirecTV). If you have other inputs in HDMI-2, or HDMI-3 it will require a few tweaks.

Anyone interested in a DirecTV logo guide? I have this as a start (snipped because it has 200+ channels) … I will do a Channel PAD just like the other one I have for Vizio TV Apps.

{
    "channels": {
        "channel": [
            {
                "callsign": "5MAXHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/c6dc4d77-8cc4-4de1-9b69-8b27577c49c2/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "A&EHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/6e1ae46f-40ab-44ee-b20e-d4508363a65e/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "KGO",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/05cf8bea-a1c4-4f97-b1b8-6c67b4383588/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "ACCNHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/4adb6040-f730-4e88-be8c-742a12943915/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "ACCUHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/a368c1d1-d258-4e80-9448-b9ef3a8271c7/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "AMAXHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/bf3ed883-db9f-40d0-afaa-77ca71911e24/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "ALTalt",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/2723937d-fe56-4ebb-bdb2-047118a55418/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "ALTHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/7b4405c7-5cdd-4248-a399-1859e74652ab/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "AMCHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/b428862c-08fc-47d1-98f4-7cc8bdbf0c31/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "AMCPLS",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/41d6d859-3dd5-406f-9fa3-1fa25de472c7/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "AHCHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/bca90090-7f85-4e55-ba11-ae184874a02d/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "APLHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/2022d13f-d2c5-44bd-9e92-041d33c18c49/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "ASPHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/181271ae-0aa6-4974-83e2-c80759427ae3/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "WGBP_text",
                "url": {}
            },
            {
                "callsign": "SNPT1HD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/7ae9a96c-cda3-42da-9851-bfb916ae4c39/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "AXSTV",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/44483b11-87ac-4da6-a420-538a462f45e0/chlogo-clb-guide/60/45"
            },
            {
                "callsign": "BSCIN2HD_text",
                "url": {}
            },
            {
                "callsign": "BSCINHD",
                "url": "https://dfwfis.prod.dtvcdn.com/catalog/image/imageserver/v1/service/channel/adb0f3e1-83e7-41f3-99f2-4cca04b70126/chlogo-clb-guide/60/45"
            },

@kbrown01 Thank you so much for everything you have shared here. We frequently have our remotes stolen and hidden away by our Toddler so I was looking for something that we can use when we can’t find a remote. Our two Android TVs were super easy, I just copied the example text from Home Assistant, and it worked perfectly but getting my Mother-in-law’s Vizio to work was more difficult. Your contributions here got me started and lead me to the path on what I needed to do.

Since my setup is much simpler and I think most people are coming to this post for questions about their Vizio Setup, here is what I did.

what I added to the configurations.yaml file:

vizio:
  - host: 'xxx.xxx.xxx.xxx:7345'
    access_token: **********

rest_command:
  vizio_key:
    url: 'https://xxx.xxx.xxx.xxx:7345/key_command/'
    method: PUT
    content_type: "application/json"
    headers:
      AUTH: **********
    payload: '{"KEYLIST": [{"CODESET": {{ codeset | int }},"CODE": {{ code | int }},"ACTION":"KEYPRESS"}]}'
    verify_ssl: false

The code for the card. I started with copying the sample code for the Android TVs and edited it to use the API calls instead:

type: vertical-stack
cards:
  - type: entities
    entities:
      - entity: media_player.VizioTV
    title: Mamita's TV Control
  - square: true
    columns: 3
    type: grid
    cards:
      - type: button
        show_icon: false
        tap_action:
          action: none
        hold_action:
          action: none
      - show_name: true
        show_icon: true
        type: button
        icon: mdi:arrow-up-bold
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 3
            code: 8
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: button
        show_icon: false
        tap_action:
          action: none
        hold_action:
          action: none
      - type: button
        icon: mdi:arrow-left-bold
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 3
            code: 1
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: button
        icon: mdi:circle
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 3
            code: 2
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: call-service
          service: remote.send_command
          data:
            command: DPAD_CENTER
            hold_secs: 0.5
          target:
            entity_id: media_player.guest_room_tv
      - type: button
        icon: mdi:arrow-right-bold
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 3
            code: 7
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: button
        icon: mdi:arrow-left
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 4
            code: 0
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: button
        icon: mdi:arrow-down-bold
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 3
            code: 0
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: button
        icon: mdi:home-outline
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 4
            code: 3
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
  - square: false
    columns: 3
    type: grid
    cards:
      - show_name: true
        show_icon: true
        type: button
        icon: mdi:skip-previous
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 2
            code: 11
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - show_name: true
        show_icon: true
        type: button
        icon: mdi:play
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 2
            code: 3
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - show_name: true
        show_icon: true
        type: button
        icon: mdi:skip-next
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 2
            code: 10
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: call-service
          service: remote.send_command
          data:
            command: MEDIA_FAST_FORWARD
          target:
            entity_id: media_player.guest_room_tv
      - type: button
        icon: mdi:volume-off
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 5
            code: 4
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: button
        icon: mdi:volume-medium
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 5
            code: 0
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: button
        icon: mdi:volume-high
        tap_action:
          action: call-service
          service: rest_command.vizio_key
          data:
            codeset: 5
            code: 1
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
  - square: false
    columns: 4
    type: grid
    cards:
      - type: button
        icon: mdi:youtube
        tap_action:
          action: call-service
          service: remote.turn_on
          data:
            activity: https://www.youtube.com
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: button
        icon: mdi:netflix
        tap_action:
          action: call-service
          service: remote.turn_on
          data:
            activity: https://www.netflix.com/title
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: picture
        image: >-
          https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Amazon_Prime_Video_logo.svg/450px-Amazon_Prime_Video_logo.svg.png
        tap_action:
          action: call-service
          service: remote.turn_on
          data:
            activity: https://app.primevideo.com
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
      - type: picture
        image: >-
          https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Disney%2B_logo.svg/440px-Disney%2B_logo.svg.png
        tap_action:
          action: call-service
          service: remote.turn_on
          data:
            activity: https://www.disneyplus.com
          target:
            entity_id: media_player.guest_room_tv
        hold_action:
          action: none
  - type: entity
    entity: media_player.VizioTV
  - type: media-control
    entity: media_player.VizioTV

There are some inconsisties with entity names I don’t fully understand, but it works.

I also noticed the API Documentation Listed codeset 2 as Transport, which I figured must be for navigation within a video (I worked for a TV service for a couple years and transport sounded like a term they would use). Here is what I observed experimenting with codeset 2:
Codeset: Code: Action:

2 0 Seek Forward
2 1 Seek Backward
2 2 Pause
2 3 Play
2 4 Unknown
2 5 Skip Forward
2 6 Skip Backward
2 7 Skip Backward
2 8 Skip Forward
2 9 Pause
2 10 Next
2 11 Previous

I’m not 100% on what each of these actions are. I just recorded what I observed in Youtube playing a mix of music videos. I was most interested in the skip to next/previous item actions so I stopped testing after that.

I haven’t gotten the links to directly open apps to work yet. I tried adding a second rest_command into the configruations.yaml, but can’t get it to work correctly. I keep getting errors I don’t understand even though I think it should be possible. Ultimately I want something that looks kind of like this:

rest_command:
  vizio_key:
    url: 'https://xxx.xxx.xxx.xxx:7345/key_command/'
    method: PUT
    content_type: "application/json"
    headers:
      AUTH: **********
    payload: '{"KEYLIST": [{"CODESET": {{ codeset | int }},"CODE": {{ code | int }},"ACTION":"KEYPRESS"}]}'
    verify_ssl: false
  vizio_launchApp:
    url: 'https://192.168.0.216:735/app/launch/'
    method: PUT
    content_type: "application/json"
    headers:
      AUTH: 'Zwytkualvu'
    payload: '{"VALUE": [{"MESSAGE": {{ message | string }},"NAME_SPACE":{{ name_space | int }},"APP_ID":{{ app_id | string }}}]}'
    verify_ssl: false

I just can’t figure what’s wrong with my formatting.

Again, thank you so much! I wouldn’t be anywhere near where I am now without your guidance here.

Maybe this helps. I do not use app/launch, I use media_player.select_source.
I wrote Vizio and they published a URL that contains all of the “app names” when launching an app (like Netflix, etc.).

So I created a sensor that contains all that information. It uses the link provided by Vizio to get the data and processes it with JQ to format it into something better.

##
## Vizio Apps
##
- sensor:
      scan_interval: 36000
      unique_id: sensor.vizio_apps
      name: Vizio Apps
      command: "curl -s 'http://scfs.vizio.com/appservice/vizio_apps_prod.json' | jq '{\"apps\": [ .[] | {id: .\"id\", name: .\"name\", icon: .\"mobileAppInfo\".\"app_icon_image_url\", sort: .\"mobileAppInfo\".\"featured_sort\" } ]}' "
      value_template: "OK"
      json_attributes:
          - apps

If you create that sensor, look at what you get:

So I can then process that sensor with auto-entities and which overall results in a “scrollable” pad that have images of all the apps, clicking on one will take you to it. Now this uses decluttering so the actual vizio TV name (as I have 4) is a variable:

                    - type: custom:stack-in-card
                      mode: vertical
                      card_mod:
                        style: 'ha-card {overflow-y: scroll!important; height: 450px}'
                      cards:
                        - type: custom:auto-entities
                          card:
                            type: grid
                            square: false
                            columns: 5
                          card_param: cards
                          filter:
                            template: >-
                              {% for app in
                              state_attr("sensor.vizio_apps","apps") -%}
                                {{
                                  {
                                    'type': 'picture',
                                    'image': app.icon,
                                    'tap_action':
                                    {
                                        'action': 'call-service',
                                        'service': 'media_player.select_source',
                                        'data':
                                        {
                                          'source': app.name,
                                          'entity_id': 'media_player.[[vizio]]'
                                        }
                                    }
                                  }
                                 }},
                               {%- endfor %}

And in the overall result, I get this:

image

Now I plug that into my remote as part of the stack with the condition that the Vizio is on Smartcast, show it. In this you will also see that by TV, I left a row with 5 logos to be the quick buttons. Overall, in Vizio Smartcast mode, mine looks like this now:

As for the actual key codes, I used this to understand it all:

And note … the Android TV integration is nice. This is so much more. Everyone is always struggling to launch an app. This launches every app that exist on Vizio Smartcast and has nothing custom, since Vizio freely gives that information as well as the logos. Especially because it includes DirecTV also.

1 Like

port 7345 typo?

I would say so, should be as you said. 7345

Along with the “735”->“7345” problem, I think the payload format is entirely wrong for the /app/launch endpoint.
Here’s what I have working, at least for the few that I care about (though some others don’t work, and I don’t know why not)

  payload: '{"VALUE": {"MESSAGE": "{{ message | string }}", "NAME_SPACE": {{ name_space | int }}, "APP_ID": "{{ app_id | string }}"}}'

And the button calls them like this

          data:
            message: ""
            name_space: 2
            app_id: 4

This works for Hulu (2, 3) and Prime Video (2, 4), and that’s good enough for me at the moment.
But the numbers I found for Netflix, for example (3, 1) do not work, so if I ever care about that again, I’ll probably switch over to the media_player.select_source approach that @kbrown01 uses, unless I see a better list of name_space and app_id codes out there.
EDIT: I figured out the problem. Sample code above now works for Netflix, YouTube and others in non-“2” NAME_SPACE. See next reply.

Ah, with a little more fiddling (and comparing to exactly what pyvizio does) I see there need to be no quotes around the value for NAME_SPACE. For whatever reason, NAME_SPACE has to be an integer, while APP_ID is a string.
The reason a bunch of things were working for me might be that it defaults to a value of 2 for NAME_SPACE if it receives it but can’t process it properly (e.g. it arrives as a string when it shouldn’t be).

I’ll edit my previous reply so the sample code is correct.

Just a general heads up to post in this thread for the Vizio TV Integration:

With the latest firmware update to my television, the media player “turn on” and “turn off” actions no longer map to Power On and Power Off. Instead, it’s just a toggle. I have not yet figured out a work-around, but I’m sure more of you will be discovering this if you have firmware set to auto update.

I’m having an issue where the integration wizard just spins and never completed. Any idea on how to debug this one?

I"m stuck on the input selection problem, on one of my TV’s it’s the Hdmi-1 / Hdmi1 problem, I have another Vizio that just throws this error.

2024-10-11 16:59:15.426 ERROR (MainThread) [custom_components.vizio.media_player] Exception in input selection: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'

I also ran into an issue where this TV would pair in Home Assistant but the device and entity would not create - I had to update the this to get past it -

            if VIZIO_MUTE in audio_settings:
                mute_value = audio_settings[VIZIO_MUTE]
    
            if isinstance(mute_value, str):
                self._attr_is_volume_muted = mute_value.lower() == VIZIO_MUTE_ON
            elif isinstance(mute_value, int):
        # Assuming 1 represents muted and 0 represents unmuted
                self._attr_is_volume_muted = mute_value == 1
            else:
                self._attr_is_volume_muted = None
        else:
            self._attr_is_volume_muted = None

Would love to dig into pyvizio to see how we can get this integration modernized.

I updated the input selection to try to get past my NoneType Error only was not able to get it resolved.

    async def async_select_source(self, source: str) -> None:
        """Select input source."""
        _LOGGER.debug("Selecting source: %s", source)
        # Fail early if the source is invalid or unavailable
        if not self._available_inputs or source not in self._available_inputs:
            _LOGGER.warning("Invalid or unavailable source selected: %s", source)
            return
        try:
            # Fetch the latest input list from the device
            fetched_inputs = await self._device.get_inputs_list(log_api_exception=False)
            if not fetched_inputs:
                _LOGGER.error("No inputs fetched from the device.")
                return
            _LOGGER.debug("Fetched %d inputs from the device.", len(fetched_inputs))
            # Find the matching input item by source name
            curr_input_item = next((input_ for input_ in fetched_inputs if input_.name == source), None)
            if not curr_input_item:
                _LOGGER.error("No matching input found for source: %s", source)
                return
            # Use id if available, otherwise fall back to name
            input_identifier = curr_input_item.id or curr_input_item.name
            if not input_identifier:
                _LOGGER.error("No valid id or name for input item: %s", curr_input_item)
                _LOGGER.debug("Invalid input item details: %s", curr_input_item)
                return
            # Set the input and confirm success
            _LOGGER.info("Setting input using: %s", input_identifier)
            await self._device.set_input(input_identifier, log_api_exception=False)
            _LOGGER.info("Successfully set input to: %s", input_identifier)
        except TypeError as e:
            _LOGGER.error("TypeError encountered while selecting input: %s", str(e))
        except ValueError as e:
            _LOGGER.error("ValueError encountered while selecting input: %s", str(e))
        except Exception as e:
            _LOGGER.error("Unexpected error selecting input: %s", str(e))
024-10-11 18:17:28.893 DEBUG (MainThread) [custom_components.vizio.media_player] Selecting source: HDMI-1
2024-10-11 18:17:29.051 DEBUG (MainThread) [custom_components.vizio.media_player] Fetched 5 inputs from the device.
2024-10-11 18:17:29.052 INFO (MainThread) [custom_components.vizio.media_player] Setting input using: 1118785733
2024-10-11 18:17:29.184 INFO (MainThread) [custom_components.vizio.media_player] Successfully set input to: 1118785733
2024-10-11 18:17:36.104 DEBUG (MainThread) [custom_components.vizio.media_player] Selecting source: COMP
2024-10-11 18:17:36.235 DEBUG (MainThread) [custom_components.vizio.media_player] Fetched 5 inputs from the device.
2024-10-11 18:17:36.235 INFO (MainThread) [custom_components.vizio.media_player] Setting input using: 3372802964
2024-10-11 18:17:36.347 INFO (MainThread) [custom_components.vizio.media_player] Successfully set input to: 3372802964
2024-10-11 18:17:41.051 DEBUG (MainThread) [custom_components.vizio.media_player] Selecting source: TV
2024-10-11 18:17:41.088 DEBUG (MainThread) [custom_components.vizio.media_player] Fetched 5 inputs from the device.
2024-10-11 18:17:41.088 INFO (MainThread) [custom_components.vizio.media_player] Setting input using: 3845225872
2024-10-11 18:17:41.202 INFO (MainThread) [custom_components.vizio.media_player] Successfully set input to: 3845225872
2024-10-11 18:17:46.397 DEBUG (MainThread) [custom_components.vizio.media_player] Selecting source: HDMI-1
2024-10-11 18:17:46.431 DEBUG (MainThread) [custom_components.vizio.media_player] Fetched 5 inputs from the device.
2024-10-11 18:17:46.431 INFO (MainThread) [custom_components.vizio.media_player] Setting input using: 1118785733
2024-10-11 18:17:46.604 INFO (MainThread) [custom_components.vizio.media_player] Successfully set input to: 1118785733

Even though it says the inputs changed when I run the CLI the inputs do not actually change.

I’m trying to integrate an older Vizio smartcast, and I am running into the same problem.

Either media player power on/off, is just a toggle, or the opposite action is performed. For example, ‘media player turn on’ results in the tv powering off half the time. Or ‘media player turn off’ will turn the tv ON half the time…