Denon/Marantz AVR widget

Denon_avr

Description

This widget controls Denon/Marantz AVR devices and works in light mode as well as in dark mode.

Prerequisites:

  • OH3.4 or higher
  • Denon/Marantz binding installed
  • Denon/Marantz device (Thing, Channels, Items) fully set up according to binding instructions
  • The widget is designed for Telnet mode to be configured in the Denon/Marantz Thing

If you are on an earlier release than OH3.4, please make sure you update the widget code as follows:

Replace

text: =@props.xxxxx

by

text: =items[props.xxxxx].displayState || items[props.xxxxx].state

You’d need to update the widget code on these 3 spots to work for you.

Recommendation for best use of widget:

Link items to the “Send a Custom Command” channel:
denon

Add respective options to item’s metadata (e.g. Input source, surround program):

That’s it.
Have fun with the widget.

maxmaximax

Changelog

Version 0.1

  • initial release

Resources

uid: Denon AVR v01
tags: []
props:
  parameters:
    - description: Device name
      label: Title
      name: title
      required: false
      type: TEXT
    - context: item
      description: Item for Power Channel
      label: Power
      name: itemPower
      required: false
      type: TEXT
    - context: item
      description: Item for Input Source
      label: Input Source
      name: itemInputSource
      required: false
      type: TEXT
    - context: item
      description: Item for Mute
      label: Mute
      name: itemMute
      required: false
      type: TEXT
    - context: item
      description: Item for selected Surround Mode
      label: Get Surround Mode
      name: itemSurroundMode
      required: false
      type: TEXT
    - context: item
      description: Item for Volume (dB)
      label: Volume (dB)
      name: itemVolumedb
      required: false
      type: TEXT
    - description: Set minimum Volume
      label: Minimum Volume
      name: MinimumVolume
      required: false
      type: INTEGER
    - description: Set maximum Volume
      label: Maximum Volume
      name: MaximumVolume
      required: false
      type: INTEGER
    - description: Set Volume Stepsize
      label: Volume Stepsize
      name: VolumeStepsize
      required: false
      type: DECIMAL
    - context: item
      description: Item for sending a command for Quick Select options 1,2,3
      label: Send Quick Select Command
      name: itemSendQuickSelectCommand
      required: false
      type: TEXT
    - context: item
      description: Item for sending a command for Surround Program
      label: Send Surround Program Command
      name: itemSendSurroundProgramCommand
      required: false
      type: TEXT
    - context: item
      description: Item for sending a command for Tuner Preset Number
      label: Send Tuner Preset Number Command
      name: itemSendTunerPresetNumberCommand
      required: false
      type: TEXT
    - context: item
      description: Item for sending a command for Tuner Preset Up/Down
      label: Send Tuner Preset Up/Down Command
      name: itemSendTunerPresetUpDownCommand
      required: false
      type: TEXT
  parameterGroups: []
timestamp: Jan 15, 2023, 11:08:14 AM
component: f7-card
config:
  title: =props.title
  outline: true
  class:
    - no-padding
  style:
    noShadow: false
    border-radius: var(--f7-card-expandable-border-radius)
    box-shadow: 5px 5px 10px 1px rgba(0,0,0,0.3)
slots:
  default:
    - component: f7-row
      config:
        class:
          - margin-top-half
          - margin-left-half
          - margin-right-half
          - margin-bottom-half
      slots:
        default:
          - component: f7-col
            config:
              width: "25"
            slots:
              default:
                - component: f7-segmented
                  config:
                    class:
                      - segmented-strong
                    style:
                      --f7-segmented-strong-padding: 0px
                      --f7-segmented-strong-between-buttons: 5px
                      --f7-segmented-strong-button-font-weight: 300
                      --f7-segmented-strong-bg-color: transparent
                      --f7-segmented-strong-button-hover-bg-color: rgba(var(--f7-theme-color-rgb), 0.07)
                      --f7-button-fill-hover-bg-color: var(--f7-theme-color)
                      --f7-button-border-radius: 4px
                      --f7-button-padding-vertical: 0px
                      --f7-button-padding-horizontal: 0px
                  slots:
                    default:
                      - component: oh-button
                        config:
                          outline: true
                          class:
                            - padding-top-half
                            - display-flex
                            - flex-direction-column
                          text: ON/OFF
                          action: toggle
                          actionItem: =props.itemPower
                          actionCommand: ON
                          actionCommandAlt: OFF
                          icon-f7: power
                          iconSize: 15
                          fill: "=(items[props.itemPower].state === 'ON') ? true : false"
                          style:
                            --f7-button-border-width: 1px
                            --f7-button-border-color: var(--f7-card-outline-border-color)
                            height: auto
                            font-size: 8px
          - component: f7-col
            config:
              width: "50"
              large: "45"
            slots:
              default:
                - component: f7-row
                  config: {}
                  slots:
                    default:
                      - component: f7-col
                        config:
                          width: "25"
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                class:
                                  - float-left
                                material: input
                                size: 15
                                style:
                                  color: "=(items[props.itemPower].state === 'ON') ? 'var(--f7-theme-color)' : 'var(--f7-card-outline-border-color)'"
                      - component: f7-col
                        config:
                          width: "75"
                        slots:
                          default:
                            - component: Label
                              config:
                                class:
                                  - float-right
                                text: =@props.itemInputSource
                                style:
                                  white-space: nowrap
                                  overflow: hidden
                                  text-overflow: elipsis
                                  font-size: 12px
                                  color: "=(items[props.itemPower].state === 'ON') ? '' : 'var(--f7-card-outline-border-color)'"
                - component: f7-row
                  config: {}
                  slots:
                    default:
                      - component: f7-col
                        config:
                          width: "25"
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                class:
                                  - float-left
                                material: graphic_eq
                                size: 15
                                style:
                                  color: "=(items[props.itemPower].state === 'ON') ? 'var(--f7-theme-color)' : 'var(--f7-card-outline-border-color)'"
                      - component: f7-col
                        config:
                          width: "75"
                        slots:
                          default:
                            - component: Label
                              config:
                                class:
                                  - float-right
                                text: =@props.itemSurroundMode
                                style:
                                  white-space: nowrap
                                  overflow: hidden
                                  text-overflow: elipsis
                                  font-size: 12px
                                  color: "=(items[props.itemPower].state === 'ON') ? '' : 'var(--f7-card-outline-border-color)'"
                - component: f7-row
                  config: {}
                  slots:
                    default:
                      - component: f7-col
                        config:
                          width: "25"
                        slots:
                          default:
                            - component: f7-icon
                              config:
                                class:
                                  - float-left
                                f7: speaker_2
                                size: 15
                                style:
                                  color: "=(items[props.itemPower].state === 'ON') ? 'var(--f7-theme-color)' : 'var(--f7-card-outline-border-color)'"
                      - component: f7-col
                        config:
                          width: "75"
                        slots:
                          default:
                            - component: Label
                              config:
                                class:
                                  - float-right
                                text: =@props.itemVolumedb
                                style:
                                  white-space: nowrap
                                  overflow: hidden
                                  text-overflow: elipsis
                                  font-size: 12px
                                  color: "=(items[props.itemPower].state === 'ON') ? '' : 'var(--f7-card-outline-border-color)'"
          - component: f7-col
            config:
              width: "25"
            slots:
              default:
                - component: f7-segmented
                  config:
                    visible: "=(items[props.itemPower].state === 'ON') ? true : false"
                    class:
                      - segmented-strong
                    style:
                      --f7-segmented-strong-padding: 0px
                      --f7-segmented-strong-between-buttons: 5px
                      --f7-segmented-strong-button-font-weight: 300
                      --f7-segmented-strong-bg-color: transparent
                      --f7-segmented-strong-button-hover-bg-color: rgba(var(--f7-theme-color-rgb), 0.07)
                      --f7-button-fill-hover-bg-color: var(--f7-theme-color)
                      --f7-button-border-radius: 4px
                      --f7-button-padding-vertical: 0px
                      --f7-button-padding-horizontal: 0px
                  slots:
                    default:
                      - component: oh-button
                        config:
                          text: MUTE
                          action: toggle
                          actionItem: =props.itemMute
                          actionCommand: ON
                          actionCommandAlt: OFF
                          icon-f7: speaker_slash
                          iconSize: 15px
                          fill: "=(items[props.itemMute].state === 'ON') ? true : false"
                          outline: true
                          class:
                            - display-flex
                            - flex-direction-column
                            - padding-top-half
                          style:
                            --f7-button-border-width: 1px
                            --f7-button-border-color: var(--f7-card-outline-border-color)
                            font-size: 8px
                            height: auto
    - component: f7-card
      config:
        visible: "=items[props.itemInputSource].state === 'TUNER' && items[props.itemPower].state === 'ON' ? true : false"
        outline: true
    - component: f7-row
      config:
        visible: "=items[props.itemInputSource].state === 'TUNER' && items[props.itemPower].state === 'ON' ? true : false"
      slots:
        default:
          - component: f7-col
            config:
              width: "10"
            slots:
              default:
                - component: f7-card
                  config:
                    visible: true
                    noShadow: true
                    class:
                      - margin-left-half
                      - margin-right-half
                    style:
                      display: grid
                      grid-template-columns: repeat(1, 1fr)
                      gap: 5px
                      --f7-button-font-size: 8px
                      --f7-button-text-color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
                      --f7-button-border-radius: 4px
                      --f7-button-outline-border-width: 1px
                      --f7-button-font-weight: 300
                      --f7-button-padding-vertical: 0px
                      --f7-button-padding-horizontal: 0px
                  slots:
                    default:
                      - component: oh-repeater
                        config:
                          sourceType: itemStateOptions
                          itemOptions: =props.itemSendTunerPresetUpDownCommand
                          for: option
                          fragment: true
                        slots:
                          default:
                            - component: oh-button
                              config:
                                icon-f7: "=loop.option.label === 'UP' ? 'chevron_up' : 'chevron_down'"
                                iconSize: 15px
                                action: command
                                actionItem: =props.itemSendTunerPresetUpDownCommand
                                actionCommand: =loop.option.value
                                outline: true
                                style:
                                  --f7-button-border-color: var(--f7-card-outline-border-color)
                                  height: auto
          - component: f7-col
            config:
              width: "80"
            slots:
              default:
                - component: f7-card
                  config:
                    visible: true
                    noShadow: true
                    class:
                      - margin-left-half
                      - margin-right-half
                    style:
                      display: grid
                      grid-template-columns: repeat(4, 1fr)
                      gap: 5px
                      --f7-button-font-size: 8px
                      --f7-button-text-color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
                      --f7-button-border-radius: 4px
                      --f7-button-outline-border-width: 1px
                      --f7-button-font-weight: 300
                      --f7-button-padding-vertical: 0px
                      --f7-button-padding-horizontal: 0px
                  slots:
                    default:
                      - component: oh-repeater
                        config:
                          sourceType: itemStateOptions
                          itemOptions: =props.itemSendTunerPresetNumberCommand
                          for: option
                          fragment: true
                        slots:
                          default:
                            - component: oh-button
                              config:
                                text: =loop.option.label
                                action: command
                                actionItem: =props.itemSendTunerPresetNumberCommand
                                actionCommand: =loop.option.value
                                outline: true
                                style:
                                  --f7-button-border-color: var(--f7-card-outline-border-color)
                                  height: auto
    - component: f7-card
      config:
        visible: "=(items[props.itemPower].state === 'ON') ? true : false"
        outline: true
    - component: f7-row
      config:
        visible: "=(items[props.itemPower].state === 'ON') ? true : false"
      slots:
        default:
          - component: f7-col
            config:
              width: "50"
              large: "50"
            slots:
              default:
                - component: Label
                  config:
                    class:
                      - margin-left-half
                      - text-align-center
                    text: Source & Surround
                    style:
                      font-size: 12px
          - component: f7-col
            config:
              width: "50"
              large: "50"
            slots:
              default:
                - component: Label
                  config:
                    class:
                      - margin-right-half
                      - text-align-center
                    text: Quick Select
                    style:
                      font-size: 12px
    - component: f7-row
      config:
        visible: "=(items[props.itemPower].state === 'ON') ? true : false"
        class:
          - margin-bottom-half
      slots:
        default:
          - component: f7-col
            config:
              width: "50"
              large: "50"
            slots:
              default:
                - component: f7-segmented
                  config:
                    visible: true
                    class:
                      - margin-left-half
                    style:
                      --f7-button-font-size: 8px
                      --f7-button-text-color: var(--f7-theme-color)
                      --f7-button-border-radius: 4px
                      --f7-button-outline-border-width: 1px
                      --f7-button-font-weight: 300
                      --f7-button-padding-vertical: 5px
                      --f7-button-padding-horizontal: 0px
                  slots:
                    default:
                      - component: oh-repeater
                        config:
                          sourceType: array
                          for: SourceSurroundSetting
                          in:
                            - icon: input
                              option: source
                            - icon: graphic_eq
                              option: surround
                          fragment: true
                        slots:
                          default:
                            - component: oh-button
                              config:
                                icon-material: =loop.SourceSurroundSetting.icon
                                iconSize: 15px
                                fill: "=vars[loop.SourceSurroundSetting.option] || vars[loop.SourceSurroundSetting.option] === undefined ? false : true"
                                outline: true
                                class:
                                  - display-flex
                                  - flex-direction-column
                                style:
                                  --f7-button-border-color: var(--f7-card-outline-border-color)
                                  height: 27px
                                action: variable
                                actionVariable: =loop.SourceSurroundSetting.option
                                actionVariableValue: "=vars[loop.SourceSurroundSetting.option] || vars[loop.SourceSurroundSetting.option] === undefined ? false : true"
          - component: f7-col
            config:
              width: "50"
              large: "50"
            slots:
              default:
                - component: f7-segmented
                  config:
                    class:
                      - margin-right-half
                    style:
                      --f7-button-font-size: 12px
                      --f7-button-text-color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
                      --f7-button-border-radius: 4px
                      --f7-button-outline-border-width: 1px
                      --f7-button-font-weight: 300
                      --f7-button-padding-vertical: 0px
                      --f7-button-padding-horizontal: 0px
                  slots:
                    default:
                      - component: oh-repeater
                        config:
                          sourceType: itemStateOptions
                          itemOptions: =props.itemSendQuickSelectCommand
                          for: option
                          fragment: true
                        slots:
                          default:
                            - component: oh-button
                              config:
                                text: =loop.option.label
                                action: command
                                actionItem: =props.itemSendQuickSelectCommand
                                actionCommand: =loop.option.value
                                outline: true
                                style:
                                  --f7-button-border-color: var(--f7-card-outline-border-color)
                                  height: 27px
    - component: f7-card
      config:
        visible: "=vars.source === false && items[props.itemPower].state === 'ON' ? true : false"
        outline: true
    - component: f7-card
      config:
        visible: "=vars.source === false && items[props.itemPower].state === 'ON' ? true : false"
        noShadow: true
        class:
          - margin-left-half
          - margin-right-half
        style:
          display: grid
          grid-template-columns: repeat(4, 1fr)
          gap: 5px
          --f7-button-font-size: 8px
          --f7-button-text-color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
          --f7-button-text-transform: uppercase
          --f7-button-border-radius: 4px
          --f7-button-outline-border-width: 1px
          --f7-button-font-weight: 300
          --f7-button-padding-vertical: 0px
          --f7-button-padding-horizontal: 0px
      slots:
        default:
          - component: oh-repeater
            config:
              sourceType: itemStateOptions
              itemOptions: =props.itemInputSource
              for: option
              fragment: true
            slots:
              default:
                - component: oh-button
                  config:
                    text: =loop.option.label
                    action: command
                    actionItem: =props.itemInputSource
                    actionCommand: =loop.option.value
                    fill: "=(loop.option.value == items[props.itemInputSource].state) ? true : false"
                    outline: true
                    style:
                      --f7-button-border-color: var(--f7-card-outline-border-color)
                      height: auto
    - component: f7-card
      config:
        visible: "=vars.surround === false && items[props.itemPower].state === 'ON' ? true : false"
        outline: true
    - component: f7-card
      config:
        visible: "=vars.surround === false && items[props.itemPower].state === 'ON' ? true : false"
        noShadow: true
        class:
          - margin-left-half
          - margin-right-half
        style:
          display: grid
          grid-template-columns: repeat(4, 1fr)
          gap: 5px
          --f7-button-font-size: 8px
          --f7-button-text-color: "=themeOptions.dark === 'light' ? 'black' : 'white'"
          --f7-button-border-radius: 4px
          --f7-button-outline-border-width: 1px
          --f7-button-font-weight: 300
          --f7-button-padding-vertical: 0px
          --f7-button-padding-horizontal: 0px
      slots:
        default:
          - component: oh-repeater
            config:
              sourceType: itemStateOptions
              itemOptions: =props.itemSendSurroundProgramCommand
              for: option
              fragment: true
            slots:
              default:
                - component: oh-button
                  config:
                    text: =loop.option.label
                    action: command
                    actionItem: =props.itemSendSurroundProgramCommand
                    actionCommand: =loop.option.value
                    outline: true
                    style:
                      --f7-button-border-color: var(--f7-card-outline-border-color)
                      height: auto
    - component: f7-row
      config:
        visible: "=(items[props.itemPower].state === 'ON') ? true : false"
        class:
          - margin-left-half
          - margin-right-half
          - margin-top-half
          - margin-bottom-half
      slots:
        default:
          - component: f7-col
            slots:
              default:
                - component: oh-slider-card
                  config:
                    outline: true
                    item: =props.itemVolumedb
                    min: =props.MinimumVolume
                    max: =props.MaximumVolume
                    step: =props.VolumeStepsize
                    scaleSteps: 4
                    scale: true
                    unit: dB
                    label: true

9 Likes

thanks a lot, @maxmaximax .

Your widget is working well on my Openhab 3.4 but the best thing is, it inspired me to look into how the Surround Modes can actually be controlled via openhab.

The way to do this, is to activate the “Show Advanced” in the channel list of the Denon AVR’s thing and link an item to the “Send a Custom Command” channel.

For an example, the following commands work for me, on the Denon AVR-X4500H.
MSSTEREO=Stereo
MSDOLBY DIGITAL=Dolby Surround
MSDTS SURROUND=DTS Surround
MSAURO2DSURR=Auro-2D Surround
MSMCH STEREO=Multi Ch Stereo
MSROCK ARENA=Rock Arena
MSJAZZ CLUB=Jazz Club
MSMATRIX=Matrix
MSMOVIE=MOVIE
MSMUSIC=MUSIC
MSDIRECT=DIRECT
MSAUTO=AUTO

The commands are picked up from the control reference sheet found with Google Search.

Glad you like the widget :grinning:

This is a bit tricky indeed - good you mentioned this. I will add another GIF to the first post for others to get started much quicker.

1 Like

I also struggeled a little bit at that step before I had it running.
I’d like to refer to another thread of mine which I think could be interesting for you.

Feel free to share your thoughts about that.

1 Like

thanks, looks good, that’ll help a lot, I’m sure!

I added metadata to items and I get an error:
denon

Please make sure that all your items are properly set up before using them in the widget. Please test them in the UI first:

  • Switch power/on/off
  • Does Input Source change when you change it on the AVR?
  • same for volume
  • same for surround mode
  • etc

If all of this works… could it be that your are not using the correct items in the props?

Metadata “options” are only required for the items linked to the “Send a Custom Command” channel, however, the errors are in a section in which you would use items linked to the channels:

  • “Input Source”
  • “Surround Program”
  • “Volume (dB)”

My widget config (props) as example:

config:
  title: Denon AVR-4310
  itemPower: DenonAVR4310_Power
  itemInputSource: DenonAVR4310_MainZone_Input
  itemMute: DenonAVR4310_MainZone_Mute
  itemSurroundMode: DenonAVR4310_SurroundProgram
  itemVolumedb: DenonAVR4310_MainZone_VolumeDB
  MaximumVolume: 18
  VolumeStepsize: 1
  MinimumVolume: -80
  itemSendQuickSelectCommand: DenonAVR4310_SendQuickSelect
  itemSendSurroundProgramCommand: DenonAVR4310_SendSurroundProgram
  itemSendTunerPresetNumberCommand: DenonAVR4310_SendTunerPresetNumber
  itemSendTunerPresetUpDownCommand: DenonAVR4310_SendTunerPresetUpDown

Hope this helps.

The items I selected in the widget are correct and react with the change in AVR
But I still see the error
Error: Unexpected "@" at character 0

Ah, I should have noticed ealier… you’re probaly not yet on OH3.4, correct?

With OH 3.4 you can put:

text: =@props.itemInputSource

… instead of:

text: =items[props.itemInputSource].displayState || items[props.itemInputSource].state

You’d need to update the widget code on these 3 spots to work for you.

1 Like

Right, I’m currently with OH3.3
Thanks, now it works fine…

First, thanks for sharing.
Running openhab 3.4.3 on a Pi4B with openhabian.
I loaded it from the Marketplace a while ago. At first the Power and Mute buttons only tracked changes made with the remote. I changed True and False to On and Off in the widget code and now they can control as well as track. Looking at the code above, that is how it is there as well, so I guess I had an early version. Perhaps I should start over and use the code in the thread to catch any other enhancements.

For the Input Source, it highlights the source if it is one on provided list, but not if it isn’t (for example, my AVR-1719 has a Game2 input/button on the remote, and when that is selected, nothing is highlighted on the widget). I don’t see where or how to change this. I can use the widget to change input sources, but only to those that are on the prepopulated list, which are different from mine.

Any suggestions on how I can work through these issues would be appreciated.

Thanks,

There is documentation for each model. Input sources and surround modes differ quite a bit. You need to get this working before you use the widget code.

Thanks. I found the control reference for my Denon AVR 1912
chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://downloads.denon.com/documentmaster/us/avr2112ci_avr1912_protocol_v7%204%200.pdf

I wasn’t sure from the instructions above whether the Select Input commands (SIDVD=DVD etc) are to be entered in the Command Options metadata for an item linked to the Input Source channel or the Send a Custom Command channel of the AVR Thing. It kind seems like it should be like the Select Surround Sound mode, but it wasn’t one of the four items linked in the example. Also, once this is completed, do I need to recreate the widget so it can read the data and set itself up properly?

I configured input source as follows:


Hope this helps.

Thanks. I thought I had done that with the Select Input item/channel, but I had put the command options in the Command Option metadata, not as options in the state description. (I removed the SV from the SVDVD=DVD - I suppose you would use the full command if you were using the Send a Custom Command channel instead.) I can control the input from the item linked to the channel, and it displays the currently selected input.
But the widget still showed the original choices for the inputs, which means it doesn’t show some of my inputs that are not included in their list and includes inputs that are not on my device. I will try recreating the widget now that the item is fully set up and see if that changes the sources displayed in the widget. (Update - didn’t change anything).

I looked at the input source item in the Rest API and found that it has the offending list of sources in the state description:


{
  "link": "http://openhab-spring:8080/rest/items/Great_Room_Denon_AVR__MainZone_Input",
  "state": "GAME2",
  "stateDescription": {
    "pattern": "%s",
    "readOnly": false,
    "options": [
      {
        "value": "DVD",
        "label": "DVD"
      },
      {
        "value": "BD",
        "label": "BD"
      },
      {
        "value": "TV",
        "label": "TV"
      },
      {
        "value": "SAT/CBL",
        "label": "SAT/CBL"
      },
      {
        "value": "SAT",
        "label": "SAT"
      },
      {
        "value": "MPLAY",
        "label": "MPLAY"
      },
      {
        "value": "VCR",
        "label": "VCR"
      },
      {
        "value": "GAME",
        "label": "GAME"
      },
      {
        "value": "V.AUX",
        "label": "V.AUX"
      },
      {
        "value": "TUNER",
        "label": "TUNER"
      },
      {
        "value": "HDRADIO",
        "label": "HDRADIO"
      },
      {
        "value": "SIRIUS",
        "label": "SIRIUS"
      },
      {
        "value": "SPOTIFY",
        "label": "SPOTIFY"
      },
      {
        "value": "SIRIUSXM",
        "label": "SIRIUSXM"
      },
      {
        "value": "RHAPSODY",
        "label": "RHAPSODY"
      },
      {
        "value": "PANDORA",
        "label": "PANDORA"
      },
      {
        "value": "NAPSTER",
        "label": "NAPSTER"
      },
      {
        "value": "LASTFM",
        "label": "LASTFM"
      },
      {
        "value": "FLICKR",
        "label": "FLICKR"
      },
      {
        "value": "IRADIO",
        "label": "IRADIO"
      },
      {
        "value": "SERVER",
        "label": "SERVER"
      },
      {
        "value": "FAVORITES",
        "label": "FAVORITES"
      },
      {
        "value": "CDR",
        "label": "CDR"
      },
      {
        "value": "AUX1",
        "label": "AUX1"
      },
      {
        "value": "AUX2",
        "label": "AUX2"
      },
      {
        "value": "AUX3",
        "label": "AUX3"
      },
      {
        "value": "AUX4",
        "label": "AUX4"
      },
      {
        "value": "AUX5",
        "label": "AUX5"
      },
      {
        "value": "AUX6",
        "label": "AUX6"
      },
      {
        "value": "AUX7",
        "label": "AUX7"
      },
      {
        "value": "NET",
        "label": "NET"
      },
      {
        "value": "NET/USB",
        "label": "NET/USB"
      },
      {
        "value": "BT",
        "label": "BT"
      },
      {
        "value": "M-XPORT",
        "label": "M-XPORT"
      },
      {
        "value": "USB/IPOD",
        "label": "USB/IPOD"
      },
      {
        "value": "USB",
        "label": "USB"
      },
      {
        "value": "IPD",
        "label": "IPD"
      },
      {
        "value": "IRP",
        "label": "IRP"
      },
      {
        "value": "FVP",
        "label": "FVP"
      },
      {
        "value": "OTP",
        "label": "OTP"
      }
    ]
  },
  "commandDescription": {
    "commandOptions": [
      {
        "command": "DVD",
        "label": "DVD"
      },
      {
        "command": "BD",
        "label": "Blueray"
      },
      {
        "command": "TV",
        "label": "TV"
      },
      {
        "command": "SAT/CBL"
      },
      {
        "command": "GAME",
        "label": "Roku"
      },
      {
        "command": "GAME2",
        "label": "DirecTV Stream"
      },
      {
        "command": "V.AUX",
        "label": "Video Aux"
      },
      {
        "command": "DOCK",
        "label": "Dock"
      }
    ]
  },
  "editable": true,
  "type": "String",
  "name": "Great_Room_Denon_AVR__MainZone_Input",
  "label": "Input Source",
  "category": "",
  "tags": [
    "Point"
  ],
  "groupNames": [
    "Great_Room_Denon_AVR_"
  ]
}

When I look at the item in the UI, the State Description metadata is blank. Strange.
I will delete the item, create a new one and hope that solves it.

Update: deleted the item, created a new one using the Add Point to Thing in the 3.4.3 UI, and put the values/labels for my device in the options of the state description, which solved the problem.

Glad you solved it.