Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modify tap_action + add hold_action & double_tap_action as per Home Assistant Dashboard Actions for tap actions #691

Open
danielbrunt57 opened this issue Feb 13, 2024 · 3 comments
Labels
enhancement New feature or request
Milestone

Comments

@danielbrunt57
Copy link
Contributor

danielbrunt57 commented Feb 13, 2024

Is your feature request related to a problem? Please describe.
I'm always frustrated when... card parameters differ from other mainstream cards.

Describe the solution you'd like
Implement the tap_ action configuration variables as per Home Assistant Actions documentation which the Button, Entities, Glance, Light, Picture, Picture element, Picture entity and Picture glance cards use.

Additional context
I really want the confirmation: option!
And service_data: should be just data: to match other HA cards.
You could keep service_data: functional for backwards compatibility rather than issuing a breaking change.

Ideally, my code would look like...

tap_action:
  action: call-service
  confirmation:
    text: Battery replaced?
  service: button.press
  data:
    entity_id: button.bathroom_battery_replaced

rather than how I have to do it now...

        tap_action:
          action: call-service
          service: button.press
          service_data:
            entity_id: button.bathroom_battery_replaced

image

Oh, and if not too much trouble, could you add icon_tap_action like the tile card has???

Thanks for listening!

@danielbrunt57 danielbrunt57 added the enhancement New feature or request label Feb 13, 2024
@danielbrunt57
Copy link
Contributor Author

danielbrunt57 commented Feb 13, 2024

Ideally, I would like to be able to do this with the custom:auto-entities card (and have the confirmation option):

        tap_action:
          action: call-service
          service: button.press
          service_data:
            entity_id: '{{ this.entity_id|replace("sensor.","button.")|replace("_battery_plus","_battery_replaced") }}'

but that is not working unless I hard-code the entity_id.
Full code (thus far)...

type: custom:auto-entities
card:
  type: custom:battery-state-card
  title: Low Batteries
  debug: false
  card_mod:
    class: inline-card
filter:
  include:
    - integration: battery_notes
      domain: sensor
      attributes:
        device_class: battery
      state: < 60
      options:
        name: '{attributes.friendly_name} ({attributes.battery_type_and_quantity})'
        secondary_info: 'Last reported: {attributes.battery_last_reported|reltime()}'
        tap_action:
          action: call-service
          service: button.press
          service_data:
            entity_id: '{{ this.entity_id|replace("sensor.","button.")|replace("_battery_plus","_battery_replaced") }}'
    - integration: battery_notes
      domain: binary_sensor
      attributes:
        device_class: battery
      state: 'on'
  exclude:
    - integration: mobile_app
sort:
  method: state
  numeric: true

@maxwroc maxwroc added this to the v3.3 milestone Feb 13, 2024
@danielbrunt57
Copy link
Contributor Author

danielbrunt57 commented Feb 14, 2024

With regards to my templated service_data:, entity_id: issue, I started thinking outside the box and thought this might work. Since I use custom-ui, I added a new atrribute to the battery sensor called battery_last_replaced_button which is set to the entity_id of the related button. I then tried using KString in entity_id but it looks like it's not being parsed there.

configuration.yaml:

homeassistant:
  customize_glob:
    "*.*":
      hide_attributes:
        - templates
       
    sensor.*_battery:
      templates: &battery_color
        icon_color: >
            var r = Math.min(255, Math.round(510 - 5.10 * Number(state)));
            var g = Math.min(255, Math.round(5.10 * Number(state)));
            var h = r * 0x10000 + g * 0x100;
            return '#' + ('000000' + h.toString(16)).slice(-6);

    sensor.*_battery_level:
      templates: *battery_color

    sensor.*_battery_plus:
      templates: 
        <<: *battery_color
        battery_last_replaced_button: >
          return 'button.' + entity.entity_id.split('.')[1].split('_battery_plus')[0] + '_battery_replaced';

and I now have the new attribute:
image
and battery-state-card appears to see it:
image
but when I tap, it triggers an error:
image

Is there any way I can template the entity_id in tap_action?

**Update **
As for the templated custom-ui attribute, it seems to only exist in the front-end(?) as I cannot reference it where I need to. I tried creating a script for tap_action to call but the script cannot see the custom-ui created attribute as verified by entering a template into Dev Tools - the attribute is not real. So much for that! I'll ask the Battery Notes author (nicely) to add that attribute and then my script should work, unless of course you add KString parsing to entity_id in tap_action!

@danielbrunt57
Copy link
Contributor Author

danielbrunt57 commented Feb 16, 2024

FYI, I came up with this card solution which although is a little heavy on templating, enabled me to call the battery_notes.set_battery_replaced service using device_id: via a hold_action. The card I created looks identical to the one I made first using battery-state-card.

image

The first one...

type: custom:auto-entities
card:
  type: entities
  title: Low Batteries
  debug: false
  card_mod:
    class: inline-card
filter:
  include:
    - integration: battery_notes
      domain: sensor
      attributes:
        device_class: battery
      state: < 60
      options:
        type: custom:template-entity-row
        entity: this.entity_id
        name: >-
          {{state_attr(config.entity,'friendly_name')}}
          ({{state_attr(config.entity,'battery_type_and_quantity')}})
        secondary: >-
          Replaced: {{
          state_attr(config.entity,'battery_last_replaced')|relative_time() }}
          ago
        state: '{{ states(config.entity)|int(0) }}%'
        hold_action: |
          {
            "action": "call-service",
            "service": "battery_notes.set_battery_replaced",
            "data": {
              "device_id": "{{ device_id(config.entity) }}",
              },
            "confirmation": {
              "text": "Update Battery Replaced Date",
              },
          }
    - integration: battery_notes
      domain: binary_sensor
      attributes:
        device_class: battery
      state: 'on'
  exclude:
    - integration: mobile_app
sort:
  method: state
  numeric: true

and the second one...

type: custom:auto-entities
card:
  type: custom:battery-state-card
  title: Low Batteries
  debug: false
  card_mod:
    class: inline-card
filter:
  include:
    - integration: battery_notes
      domain: sensor
      attributes:
        device_class: battery
      state: < 60
      options:
        name: '{attributes.friendly_name} ({attributes.battery_type_and_quantity})'
        secondary_info: 'Reported: {attributes.battery_last_replaced|reltime()}'
        hold_action:
          action: call-service
          service: script.battery_notes_battery_replaced
          service_data:
            entity_id: this.entity_id
    - integration: battery_notes
      domain: binary_sensor
      attributes:
        device_class: battery
      state: 'on'
  exclude:
    - integration: mobile_app
sort:
  method: state
  numeric: true

Food for thought??

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants