Home Assistant & Piles

La gestion des piles des capteurs peut rapidement devenir un casse tête. De plus cela dépend également de qui va gérer les changements de piles, par exemple un utilisateur qui n'a pas accès au code et aux entités. Je voulais une carte synthétique qui en plus de l'état des piles indique leur type et la date du dernier changement. Estimer la durée de vie d'une pile peut être très subjectif quand on le fait au fil de l'eau. Je voulais également une notification, mais ça c'était déjà en place.

Et un peu par hasard je suis tombé sur l'intégration Battery Notes qui va m'aider à faite tout ça !

Installer et configurer l'intégration est facile en suivant la documentation très bien faite. Pour que cela fonctionne il ne faut pas oublier d'installer les automations: développés par la communauté, ou les blueprint: proposés par l'auteur.

L'intégration ajoute des entités aux capteurs configurés pour et des attributs à l'entité principale Battery+. Ensuite on peu jouer avec, tant pour afficher que pour notifier.

Mon plus gros défit a été de créer une qui corresponde à mon désir, à savoir, lister les capteurs et afficher ces informations :

  • La date du dernier changement de pile. Cette date est mise à jour par l'intégration, mais il me fallait ajouter un bouton afin de pouvoir forcer la mise à jour de lors d'un changement qui n'aurais pas été pris en compte automatiquement. Et pour cela il me fallait récupérer l'entité du bouton de mises à jour ce qui m'a pris beaucoup (trop) de temps, moi qui ne suis pas développeur (les premières lignes du template).
  • Le type de pile et leur nombre,
  • L'état de de charge de la pile (on pourrait imaginer une couleur et un icone différent, il y a une carte pour ça),

Pour y parvenir j'ai combiné deux cartes : Auto-Entities et Multiple-Entity-Row.

Et voici le code de la carte que l'on pourrait surement optimiser :

type: custom:auto-entities
card:
  type: entities
filter:
  template: |-
    {% for DEVICE in states.sensor -%}
      {%- if DEVICE.entity_id is match('sensor.*_battery_plus') -%}
      {%- set device_name = DEVICE.entity_id.rsplit('_', 2)[0].split('.', 1)[1] -%}
      {%- set associated_plus   = 'sensor.' ~ device_name ~ '_battery_plus' -%}
      {%- set associated_button = 'button.' ~ device_name ~ '_battery_replaced' -%}
      {%- set associated_type   = 'sensor.' ~ device_name ~ '_battery_type' -%}
      {%- set associated_last   = 'sensor.' ~ device_name ~ '_battery_last_replaced' -%}
      {%- set associated_low    = 'binary_sensor.' ~ device_name ~ '_battery_plus_low' -%}
      {{
        {
          'entity': DEVICE.entity_id,
          'type': 'custom:multiple-entity-row',
          'name': '-'.join((DEVICE.attributes.friendly_name).split('-')[1:]).split(' ')[0],
          'secondary_info': { 'attribute': 'battery_last_replaced', 'name': 'Last changed :', 'format': 'date'},
          'state_color': true,
          'show_state': false,
          'entities': [
            {
              'attribute': 'battery_type_and_quantity',
              'name': 'Battery type',
              'styles': {'width': '80px', 'font-weight': 'bold', 'text-align': 'right'},
            },
            {
              'entity': associated_low,
              'name': 'State',
              'styles': {'width': '50px', 'font-weight': 'bold', 'text-align': 'right'},
            },
            {
              'entity': associated_plus,
              'name': 'Charge',
              'format': 'precision0',
              'styles': {'width': '50px', 'font-weight': 'bold', 'text-align': 'right'},
            },
            {
              'entity': associated_button,
              'name': false,
              'type': 'button',
              'icon': 'mdi:update',
              'styles': {'width': '20px', 'font-weight': 'bold', 'text-align': 'right'},
              'tap_action': {
                'action': 'call-service',
                'service': 'button.press',
                'service_data': {
                  'entity_id': associated_button
                   },  
                'confirmation': {
                  'text': 'Are you sure ?'   
                }
              }
            }
          ]
        }
      }},
    {%- endif -%}
    {%- endfor %}
sort:
  method: friendly_name
view_layout:
  position: main

EDIT 17/02/2025

Mon problème étant que j'ai trop de piles pour les afficher sur une seule page. Je vais donc ajouter un label à l'entité afin de faire un filtrage et pouvoir afficher ça sur plusieurs pages :

{%- if DEVICE.entity_id is match('sensor.*_battery_plus') and DEVICE.entity_id in label_entities('battery_notes_remotes') -%}  

ou pour ne pas afficher les entités avec ce label afin de les exclure d'une page :

{%- if DEVICE.entity_id is match('sensor.*_battery_plus') and DEVICE.entity_id not in label_entities('battery_notes_remotes') -%}

Ajouter un commentaire

Loading