Optimiser une automatisation et un template

Bonjour,

Mon problème

Une automatisation déclenché une fois par jour fait appel à un capteur de modèle qui se réactualise « inutilement » toutes les minutes. J’aimerais optimiser cela

Ma configuration


HAOS 17.1


Je souhaitais déclencher une action avec des paramètres sur un appareil grâce à une automatisation.
Pour cela, un capteur de modèle a été mis en place. Voir cette discussion :
https://forum.hacf.fr/t/calcul-de-temps-relatif-dans-un-template-jinja/76078/5
Je dispose donc d’un capteur qui retourne une valeur utilisée par l’automatisation pour déclencher une action.
Ce capteur prend actuellement en compte l’heure et une entité (charge de la batterie) pour faire ses calculs.
Il se déclenche toutes les minutes ce qui dans mon cas n’a aucune utilité.
Il suffirait de calculer la valeur du paramètre nécessaire quand l’automatisation est déclenchée.
Ou au pire faire le calcul que dans une plage horaire et moins souvent (toutes les 5 minutes par exemple).

Du coup, je me demande si mon approche automatisation+capteur est correcte/optimale.
Cela fonctionne, mais cela n’a pas l’air optimisé du tout.
L’affichage de la valeur calculée par le capteur qui a été évoqué dans l’autre discussion n’est pas nécessaire (juste du déboguage).
Peut-être qu’il est possible d’intégrer le script/calcul directement dans l’automatisation pour éviter de recalculer des paramètres toutes les minutes comme c’est le cas actuellement ?

Bonjour @artur,

teste ça pour voir (pas testé chez moi) mais je ne vois pas trop en quoi tu vas gagner quelque chose !

{% set cible = today_at("06:00") %}
{# On arrondit le temps actuel à la tranche de 5 min (300s) la plus proche #}
{% set maintenant = as_datetime((as_timestamp(now()) / 300) | int * 300) %}
{% if maintenant > cible %}
  {% set cible = cible + timedelta(days=1) %}
{% endif %}
{{ ((cible - maintenant).total_seconds() / 3600) | round(1) }}

J’ai plus de 1700 entités (certains doivent en avoir beaucoup plus) et pas de soucis de perf.
Bob

Oui, je te conseil de faire le calcul dans l’automatisation et le mieux pour ça est de passer par une/des variable(s), car cela sera plus facile pour faire évoluer le code (et pour debugger car dans l’historique des exécutions des automatisation, tu peut voir l’état des variables de l’automatisation, voici un exemple chez moi :

actions:
  - variables:
      forecast: |
        {{ ( (states.sensor 
          | selectattr('attributes.device_class', 'eq', 'energy') 
          | selectattr('attributes.unit_of_measurement', 'eq', 'kWh') 
          | selectattr('entity_id', 'match', 'sensor.solar_production_forecast_')
          | selectattr("state", 'is_number')
          | rejectattr('name', 'match', 'Forecast Remaining Today')
          | rejectattr('name', 'match', 'Forecast Today')
          | map(attribute='state') 
          | map('int', 0)
          | list | sum /7 ) | round (1,ceil) 
          ) 
        }}
      t_cible: >
        ...
        {% if forecast < 7 %}
          {% set cible = cible + 4 %}
        {% elif forecast < 10 %}
          {% set cible = cible + 2 %}
        {% endif %}
        ...
...

Bonne journée

Merci à vous deux pour les suggestions et les exemples.

J’ai pris la solution de @roumano qui me semble la plus optimisée.

Cependant je n’arrive pas à insérer la variable dans la section "actions:', mais les variables globales marchent correctement.
J’ai ça actuellement et ça fonctionne :

alias: batterie charge forcée Test 2
description: ""
triggers: []
conditions: []
actions:
  - action: solar.forcible_charge_soc
    metadata: {}
    data:
      device_id: fddcedf26973c7b8e170a88cfad46b3f
      target_soc: 100
      power: "{{ puissancecharge }}"
variables:
  puissancecharge: >
    {% set cible = today_at("05:55") %}

    {% set maintenant = now() %}

    {% if maintenant > cible %}
      {% set cible = cible + timedelta(days=1) %}
    {% endif %}

    {% set dureecharge = ((cible - maintenant).total_seconds() / 60) | round(0)
    %}

    {% set chargereference = 10 %}

    {% set dureereference = 60 %}

    {% set puissancereference = 1600 %}

    {% set chargerestante = 100 -
    states('sensor.batteries_etat_de_la_capacite')| int %}

    {{ (puissancereference * chargerestante / dureecharge * dureereference /
    chargereference) | int }}
mode: single

Par contre je n’aime pas les sauts de lignes en trop dans le script et je ne sais pas comment m’en débarrasser.

Sinon, j’aurais bien mis les variables définies dans le script au même niveau que la variable ‹ puissancecharge ›, mais j’ai un doute sur la syntaxe…

Ce sujet a été automatiquement fermé après 2 jours. Aucune réponse n’est permise dorénavant.