Addon: Input Number with + and - buttons to replace slider

I crafted up this set of buttons using paper-buttons-row. They can increment or decrement the volume of my receiver by 1 or 5 dB, or mute / unmute it.

image

type: entities
entities:
  - entity: input_number.livingroom_amp_volume
    name: Volume
  - type: custom:paper-buttons-row
    buttons:
      - icon: mdi:numeric-5-box-outline
        tooltip: Volume down by 5
        tap_action:
          action: call-service
          service: script.change_volume
          service_data:
            entity_id: input_number.livingroom_amp_volume
            increment: -5
      - icon: mdi:numeric-1-box-outline
        tooltip: Volume down by 1
        tap_action:
          action: call-service
          service: script.change_volume
          service_data:
            entity_id: input_number.livingroom_amp_volume
            increment: -1
      - icon: >-
          {{ iif(is_state_attr('media_player.livingroom_amp', 'is_volume_muted',
          true), 'mdi:volume-high', 'mdi:volume-mute') }}
        tooltip: Mute / Unmute
        tap_action:
          action: call-service
          service: script.toggle_mute
          service_data:
            entity_id: media_player.livingroom_amp
      - icon: mdi:numeric-1-box
        tooltip: Volume up by 1
        tap_action:
          action: call-service
          service: script.change_volume
          service_data:
            entity_id: input_number.livingroom_amp_volume
            increment: 1
      - icon: mdi:numeric-5-box
        tooltip: Volume up by 5
        tap_action:
          action: call-service
          service: script.change_volume
          service_data:
            entity_id: input_number.livingroom_amp_volume
            increment: 5

And the server-side scripts. I had to use scripts because I couldn’t get the template parameters to work properly with the paper-buttons-row card.

script:
  toggle_mute:
    alias: Toggle Mute
    mode: queued
    icon: mdi:volume-mute
    fields:
      entity_id:
        name: Media Player
        description: A media_player entity that can be muted and unmuted
        required: true
        selector:
          entity:
            domain: media_player
    sequence:
      - service: media_player.volume_mute
        target:
          entity_id: "{{ entity_id }}"
        data:
          is_volume_muted: "{{ not is_state_attr(entity_id, 'is_volume_muted', true) }}"

  change_volume:
    alias: Change Volume
    mode: queued
    icon: mdi:volume-high
    fields:
      entity_id:
        name: Volume input_number
        description: An input_number entity that corresponds to the volume of a media_player
        required: true
        selector:
          entity:
            domain: input_number
      increment:
        name: Increment
        description: A integral value by which to adjust the volume
        required: false
        default: 1
        selector:
          number:
            min: -10
            max: 10
            step: 1
            unit_of_measurement: dB
            mode: slider
    sequence:
      - service: input_number.set_value
        target:
          entity_id: "{{ entity_id }}"
        data:
          value: "{{ min(20, max(-80, (states(entity_id) | int) + (increment |int))) }}"