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:
- I get a beautiful media player card on the dashboard:
- I can power on and off receiver
- I can change the input source of receiver using dropdown menu
- I can increment, decrement, or set the exact volume level
- I can turn on/off the receiver from Google Assistant app
What is not working (Need help ) :
- 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:
- List of IR codes from Marantz
- IrScrutinizer software to generate Pronto HEX from RC5 codes
- Script to convert Pronto HEX values to Broadlink format.
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