Google Home Controlling Samsung TV Volume

I have a Google Home and I’m getting into home automation. I picked up a SmartThings hub for several reasons, one of which is the existing ability to get a newer Samsung TV connected to it.

I have the TV hooked up to SmartThings and with the phone app I can control power, volume, the whole bit. Something I’ve noticed is that SmartThings exposes the TV to Google Home (yay!) but it appears to Google Home as a switch so it only has on/off functionality (boo!).

I’m trying to determine the best way to craft something up to enable more fully functioning TV control to work through Google Home; at the very least on/off, volume, mute. However, I’m challenged in figuring out how Google Home “sees” things that are exposed by SmartThings. Like, why does it see the TV as a switch and not, say, a dimmer or something with slightly more functionality?

  • Device handler: I feel like a device handler would be an awesome way to go if you could use it more like a proxy to the TV. I could expose all sorts of functionality “as part of the device” and map it to something logical on the TV. However, it looks like device handlers really don’t want to behave that way, so…
  • SmartApp with virtual devices: I could write a SmartApp to receive commands against virtual devices and proxy them to the TV, but I’m unclear on how to tell Google Home what “functions” my virtual device supports. Is there some doc on that somewhere? How to advertise capabilities that Google Home understands? This seems like it’d be the most responsive with the fewest moving pieces, or…
  • SmartApp + REST + IFTTT: I think the IFTTT webhook support with a SmartApp may be the most direct route, receiving commands through REST and letting IFTTT interpret the Google Home commands. I even have something pretty simple working. However, I don’t want to set all that OAuth up for a custom integration if the token’s going to expire and I will end up manually reconnecting it every month or something. (How long do the OAuth tokens last?)

Am I on the right track? Is there an option I’m missing?