Using Universal Media Player to Control Marantz NR1501 AV Receiver via Broadlink RM Pro Plus (Working but need help)

Hi! I somehow managed to create Universal Medial Player to control my Marantz receiver via IR commands. I use Broadlink RM Pro Plus to send them.

First of all, I want to share my experience and what I came up within 2 days.

What is working:

What is not working (Need help :pray:) :

  • I cant change room for this media player. I think I must provide a unique entity id for it but I don’t know how to do it.
  • I cant change volume/input source in Google Assistant app. Only the power button is visible. Tried to specify different values for device_class: ‘tv’, ‘receiver’, ‘speaker’. Made it even worse. Works in Google Assistant (At least for power control) ONLY if I do not specify it at all.

IR codes that I generated for Marantz Receiver including discrete volume control:

Document contains discrete power off command IR code for Epson EH-TW5210 (That was really hard to find)
To find/generate all IR codes that I need I used:

Part of configuration.yaml:

# Switches
switch:
  - platform: template
    switches:
      projector:
        unique_id: switch.projector
        friendly_name: Projector
        value_template: "{{ is_state('input_boolean.projector_state', 'on') }}"
        turn_on:
          service: script.projector_turn_on
        turn_off:
          service: script.projector_turn_off

input_text:
  marantz_av_receiver_state:
    name: Marantz AV Receiver - State
    icon: mdi:audio-video

input_number:
  marantz_av_receiver_volume_level:
    name: Marantz AV Receiver - Volume Level
    icon: mdi:volume-high
    min: 0
    max: 0.8
    step: 0.01
    mode: slider
  
input_boolean:
  marantz_av_receiver_mute:
    name: Marantz AV Receiver - Mute
    icon: mdi:volume-mute
  projector_state:
    name: Projector - State
    icon: mdi:projector
    
input_select:
  marantz_av_receiver_source:
    name: Marantz AV Receiver - Source
    options:
      - BD
      - GAME
      - DVD
      - DSS
      - VCR
      - CD
      - TUNE
      - AUX1
      - AUX2
    icon: mdi:video-input-component

media_player:
  name: Marantz AV Receiver
  platform: universal
  # device_class: receiver
  attributes:
    state: input_text.marantz_av_receiver_state
    is_volume_muted: input_boolean.marantz_av_receiver_mute
    volume_level: input_number.marantz_av_receiver_volume_level
    source: input_select.marantz_av_receiver_source
    source_list: input_select.marantz_av_receiver_source|options
  commands:
    turn_on:
      service: script.marantz_av_receiver_turn_on
    turn_off:
      service: script.marantz_av_receiver_turn_off
    volume_up:
      service: script.marantz_av_receiver_set_volume_level
      data:
        volume_level: "{{ states('input_number.marantz_av_receiver_volume_level') | float + 0.01 }}"
    volume_down:
      service: script.marantz_av_receiver_set_volume_level
      data:
        volume_level: "{{ states('input_number.marantz_av_receiver_volume_level') | float - 0.01 }}"
    volume_mute:
      service: script.marantz_av_receiver_mute_toggle
    select_source:
      service: script.marantz_av_receiver_set_source
      data:
        source: "{{ source }}"
    volume_set:
      service: script.marantz_av_receiver_set_volume_level
      data:
        volume_level: "{{ volume_level }}"

Script to change receiver volume level:

alias: Marantz AV Receiver - Set Volume Level
fields:
  volume_level:
    description: Volume level to set (Number from 0.0 to 1.0)
    example: 0.42
variables:
  volume_level_normalized: '{{ [0.0, [0.8, volume_level] | min] | max }}'
  volume_level_integer: '{{ (volume_level_normalized * 100) | int }}'
  volume_up: b64:JgAYAB0dOjo6HR0dHR0dHR06Oh0dHR0dHQALpA0FAAAAAAAAAAAAAAAAAAA=
  volume_down: b64:JgAYAB0dOjo6HR0dHR0dHR06Oh0dHR06HQALhw0FAAAAAAAAAAAAAAAAAAA=
  volume_80: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dOh0dHR0dHR0dHR0ACdINBQAAAAA=
  volume_79: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dOh0dHR0dHR0dOh0ACbUNBQAAAAA=
  volume_78: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dHR0dHTo6AAnSDQUAAAAAAAA=
  volume_77: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dOh0dHR0dHTodHR0ACbUNBQAAAAA=
  volume_76: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dHR06Oh0dAAnSDQUAAAAAAAA=
  volume_75: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dHR06OjodAAm1DQUAAAAAAAA=
  volume_74: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dHR06HR06AAnSDQUAAAAAAAA=
  volume_73: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dOh0dHR06HR0dHR0ACbUNBQAAAAA=
  volume_72: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dOjodHR0dAAnSDQUAAAAAAAA=
  volume_71: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dOjodHTodAAm1DQUAAAAAAAA=
  volume_70: b64:JgAeADodHTo6HR0dHR0drjo6HR0dHR0dOh0dOjo6OgAJ0g0FAAAAAAAAAAA=
  volume_69: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dOjo6HR0dAAm1DQUAAAAAAAA=
  volume_68: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dOh0dOh0dAAnSDQUAAAAAAAA=
  volume_67: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dOh0dOjodAAm1DQUAAAAAAAA=
  volume_66: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOh0dOh0dHR06AAnSDQUAAAAAAAA=
  volume_65: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dOh0dOh0dHR0dHR0ACbUNBQAAAAA=
  volume_64: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjo6HR0dHR0dAAnSDQUAAAAAAAA=
  volume_63: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjo6HR0dHTodAAm1DQUAAAAAAAA=
  volume_62: b64:JgAeADodHTo6HR0dHR0drjo6HR0dHR0dOjo6HR06OgAJ0g0FAAAAAAAAAAA=
  volume_61: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjo6HR06HR0dAAm1DQUAAAAAAAA=
  volume_60: b64:JgAeADodHTo6HR0dHR0drjo6HR0dHR0dOjo6OjodHQAJ0g0FAAAAAAAAAAA=
  volume_59: b64:JgAeADodHTo6HR0dHR0drjo6HR0dHR0dOjo6Ojo6HQAJtQ0FAAAAAAAAAAA=
  volume_58: b64:JgAeADodHTo6HR0dHR0drjo6HR0dHR0dOjo6Oh0dOgAJ0g0FAAAAAAAAAAA=
  volume_57: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjo6Oh0dHR0dAAm1DQUAAAAAAAA=
  volume_56: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjodHTodHR0dAAnSDQUAAAAAAAA=
  volume_55: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjodHTodHTodAAm1DQUAAAAAAAA=
  volume_54: b64:JgAeADodHTo6HR0dHR0drjo6HR0dHR0dOjodHTo6OgAJ0g0FAAAAAAAAAAA=
  volume_53: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjodHTo6HR0dAAm1DQUAAAAAAAA=
  volume_52: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjodHR0dOh0dAAnSDQUAAAAAAAA=
  volume_51: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjodHR0dOjodAAm1DQUAAAAAAAA=
  volume_50: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dOjodHR0dHR06AAnSDQUAAAAAAAA=
  volume_49: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dOjodHR0dHR0dHR0ACbUNBQAAAAA=
  volume_48: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR06HR0dHR0dHR0ACdINBQAAAAA=
  volume_47: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR06HR0dHR0dOh0ACbUNBQAAAAA=
  volume_46: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06HR0dHTo6AAnSDQUAAAAAAAA=
  volume_45: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR06HR0dHTodHR0ACbUNBQAAAAA=
  volume_44: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06HR06Oh0dAAnSDQUAAAAAAAA=
  volume_43: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06HR06OjodAAm1DQUAAAAAAAA=
  volume_42: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06HR06HR06AAnSDQUAAAAAAAA=
  volume_41: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR06HR06HR0dHR0ACbUNBQAAAAA=
  volume_40: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06OjodHR0dAAnSDQUAAAAAAAA=
  volume_39: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06OjodHTodAAm1DQUAAAAAAAA=
  volume_38: b64:JgAeADodHTo6HR0dHR0drjo6HR0dHR0dHR06Ojo6OgAJ0g0FAAAAAAAAAAA=
  volume_37: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06Ojo6HR0dAAm1DQUAAAAAAAA=
  volume_36: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06Oh0dOh0dAAnSDQUAAAAAAAA=
  volume_35: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06Oh0dOjodAAm1DQUAAAAAAAA=
  volume_34: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR06Oh0dHR06AAnSDQUAAAAAAAA=
  volume_33: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR06Oh0dHR0dHR0ACbUNBQAAAAA=
  volume_32: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHTodHR0dHR0ACdINBQAAAAA=
  volume_31: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHTodHR0dOh0ACbUNBQAAAAA=
  volume_30: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHTodHTo6AAnSDQUAAAAAAAA=
  volume_28: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHTodHTodHR0ACbUNBQAAAAA=
  volume_26: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHTo6Oh0dAAnSDQUAAAAAAAA=
  volume_24: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHTo6OjodAAm1DQUAAAAAAAA=
  volume_22: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHTo6HR06AAnSDQUAAAAAAAA=
  volume_20: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHTo6HR0dHR0ACbUNBQAAAAA=
  volume_15: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHR0dOh0dHR0ACdINBQAAAAA=
  volume_10: b64:JgAiADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHR0dOh0dOh0ACbUNBQAAAAA=
  volume_5: b64:JgAgADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHR0dOjo6AAnSDQUAAAAAAAA=
  volume_0: b64:JgAkADodHTo6HR0dHR0drjo6HR0dHR0dHR0dHR0dHR0dHR0dHQAJtQ0FAAA=
sequence:
  - service: input_boolean.turn_off
    target:
      entity_id: input_boolean.marantz_av_receiver_mute
    data: {}
  - service: input_number.set_value
    data:
      value: '{{ volume_level_normalized }}'
    target:
      entity_id: input_number.marantz_av_receiver_volume_level
  - service: remote.send_command
    data:
      device: marantz
      command: |
        {% set mapper = {
          80 : volume_80,
          79 : volume_79,
          78 : volume_78,
          77 : volume_77,
          76 : volume_76,
          75 : volume_75,
          74 : volume_74,
          73 : volume_73,
          72 : volume_72,
          71 : volume_71,
          70 : volume_70,
          69 : volume_69,
          68 : volume_68,
          67 : volume_67,
          66 : volume_66,
          65 : volume_65,
          64 : volume_64,
          63 : volume_63,
          62 : volume_62,
          61 : volume_61,
          60 : volume_60,
          59 : volume_59,
          58 : volume_58,
          57 : volume_57,
          56 : volume_56,
          55 : volume_55,
          54 : volume_54,
          53 : volume_53,
          52 : volume_52,
          51 : volume_51,
          50 : volume_50,
          49 : volume_49,
          48 : volume_48,
          47 : volume_47,
          46 : volume_46,
          45 : volume_45,
          44 : volume_44,
          43 : volume_43,
          42 : volume_42,
          41 : volume_41,
          40 : volume_40,
          39 : volume_39,
          38 : volume_38,
          37 : volume_37,
          36 : volume_36,
          35 : volume_35,
          34 : volume_34,
          33 : volume_33,
          32 : volume_32,
          31 : volume_31,
          30 : volume_30,
          29 : [volume_28, volume_up],
          28 : volume_28,
          27 : [volume_26, volume_up],
          26 : volume_26,
          25 : [volume_24, volume_up],
          24 : volume_24,
          23 : [volume_22, volume_up],
          22 : volume_22,
          21 : [volume_20, volume_up],
          20 : volume_20,
          19 : [volume_20, volume_down],
          18 : [volume_20, volume_down, volume_down],
          17 : [volume_15, volume_up, volume_up],
          16 : [volume_15, volume_up],
          15 : volume_15,
          14 : [volume_15, volume_down],
          13 : [volume_15, volume_down, volume_down],
          12 : [volume_10, volume_up, volume_up],
          11 : [volume_10, volume_up],
          10 : volume_10,
          9 : [volume_10, volume_down],
          8 : [volume_10, volume_down, volume_down],
          7 : [volume_5, volume_up, volume_up],
          6 : [volume_5, volume_up],
          5 : volume_5,
          4 : [volume_5, volume_down],
          3 : [volume_5, volume_down, volume_down],
          2 : [volume_0, volume_up, volume_up],
          1 : [volume_0, volume_up],
          0 : volume_0
          }  %}
        {{ mapper[volume_level_integer] }}
    target:
      entity_id: remote.broadlink_rm_pro_plus_remote
mode: single
icon: mdi:volume-high

Script to change receiver source:

alias: Marantz AV Receiver - Set Source
fields:
  source:
    description: Input source to select
    example: GAME
sequence:
  - service: input_select.select_option
    data_template:
      entity_id: input_select.marantz_av_receiver_source
      option: '{{ source }}'
  - service: remote.send_command
    data:
      device: marantz
      command: |
        {% set mapper = {
          'BD':'input_bd',
          'GAME':'input_game',
          'DVD':'input_dvd',
          'DSS':'input_dss',
          'VCR':'input_vcr',
          'CD':'input_cd',
          'TUNE':'input_tune',
          'AUX1':'input_aux1',
          'AUX2':'input_aux2' }  %}
        {{ mapper[source] if source in mapper else 'BD' }}
    target:
      entity_id: remote.broadlink_rm_pro_plus_remote
mode: single
icon: mdi:video-input-component

Script to toggle mute mode on receiver:

alias: Marantz AV Receiver - Mute Toggle
sequence:
  - if:
      - condition: state
        entity_id: input_boolean.marantz_av_receiver_mute
        state: 'on'
    then:
      - service: input_boolean.turn_off
        data: {}
        target:
          entity_id: input_boolean.marantz_av_receiver_mute
      - service: remote.send_command
        data:
          command: b64:JgAYAB0dOjo6HR0dHR0dHR0dHTodHTo6HQALhw0FAAAAAAAAAAAAAAAAAAA=
        target:
          entity_id: remote.broadlink_rm_pro_plus_remote
    else:
      - service: input_boolean.turn_on
        data: {}
        target:
          entity_id: input_boolean.marantz_av_receiver_mute
      - service: remote.send_command
        data:
          command: b64:JgAaAB0dHR0dHTodHR0dHR0dHR0dOh0dOjodAAuHDQUAAAAAAAAAAAAAAAA=
        target:
          entity_id: remote.broadlink_rm_pro_plus_remote
mode: single
icon: mdi:volume-mute

Script to turn on receiver:

alias: Marantz AV Receiver - Turn on
sequence:
  - service: remote.send_command
    data:
      device: marantz
      command: turn_on
    target:
      entity_id: remote.broadlink_rm_pro_plus_remote
  - service: input_text.set_value
    data:
      value: 'on'
    target:
      entity_id: input_text.marantz_av_receiver_state
mode: single
icon: mdi:audio-video

Script to turn off receiver:

alias: Marantz AV Receiver - Turn off
sequence:
  - service: remote.send_command
    data:
      command: turn_off
      device: marantz
    target:
      entity_id: remote.broadlink_rm_pro_plus_remote
  - service: input_text.set_value
    data:
      value: 'off'
    target:
      entity_id: input_text.marantz_av_receiver_state
mode: single
icon: mdi:audio-video-off

I have no clue about google assistant app but for the HA part, do know that Marantz and Denon are (almost) the same so try to connect with one of the Denon integrations.

For further control, these may help too, just start with curl to up the volume to see if it is anywhere working (below worked for my 12 yr old av receiver)…it does it step-wise (see 2nd link for codes)

curl --url "http://192.168.1.100/goform/formiPhoneAppDirect.xml?MVUP"

Denon AV Reciver - plugin - Page 8 - Domoticz

IP_Protocol_AVR-Xx100.pdf (heimkinoraum.de)

My receiver is not that advanced and does not have ethernet, WiFi, or rs232. Only plain old IR remote :cry:

And I though I had an oldy from 2011 :slight_smile: … all the more to have a sensible (?) reason to buy something new :crazy_face:
On IR, cannot help, sorry

Hey X Smile2008 where have u set it all up ? in esphome or in HomeAssistant? i am new as well and trying to put my Marantz NR1501 under remote controll asswell but il use a ESP32 with a 3W infrared Diode
could u help me a bit ?