Additionner un sensor et un input_datetime

Bonjour,

Afin d’arrêter mon véhicule à 80% de charge, j’essaye de me créer une petite routine qui arrete la charge en fonction du % de batterie initial, d’un temps de charge nécessaire et de l’heure de début de charge.

Mon sensor duree charge ve qui est ma fin de charge me met indisponible. j’ai essayé plusieurs formats mais toujours le même message.

image
duree charge ve calcul un temps, ca marche
calcul arret charge ve est un sensor qui convertit durée charge ve en format horaire, ca marche
debut charge ve est mon input datetime qui donne l’heure de démarrage

ce sensor est l’addition de calcul arret charge ve (sensor) et de debut charge ve (input_datetime).
Impossible de faire 04:05: + 01:56…

voici mon yaml

sensor:
input_datetime:
  debut_charge_ve:
    name: Debut charge VE
    has_date: false
    has_time: true

input_number:
  initial_batterie_ve:
    name: "% initial batterie"
    initial: 50
    min: 0
    max: 100
    step: 5
    mode: slider

template:
  - sensor:
      - name: Duree charge VE
        unique_id: duree_charge_ve
        state: "{{ ((80 - states('input_number.initial_batterie_ve') | float) * 8.2) / 60| round(0) }}"

  - sensor: 
      - name: "calcul Arret charge VE"
        unique_id: calcul_charge_ve
        state: >
          {% set hours = states('sensor.duree_charge_ve') | float %} 
          {% set minutes = ((hours % 1) * 60) | int %}
          {{ '%02i:%02i'%(hours // 1, minutes) }}

  - sensor:
      - name: Arrêt charge VE
        unique_id: arret_charge_ve
        state: >
          {% set datetime = states('input_datetime.debut_charge_ve') %}       
          {% set sensor_value = states('sensor.duree_charge_ve') | int %}
          {% set new_timestamp = as_timestamp(datetime) + sensor_value * 60 %}
          {{ new_timestamp | timestamp_custom('%H:%M') }}

Si vous avez des idées, je suis preneur.
Merci

Bonjour,
A priori tu rentre l’heure de début en dur et tu calcul la durée.
Une automation qui démarre à l’heure saisie et dure le temps calculé me semble le plus simple.
Ou tu peux utiliser un truc dans l’esprit ci dessous (offset d’ouverture rapport à l’aube).

name: "Véranda Ouverture à"
unique_id: c2eb0723-7320-408e-9d8d-ab0c8c02357e
state: >-
  {% if is_state('input_boolean.veranda_ouvre_avec_soleil' , 'on') %}
    {{ (as_timestamp(states.sun.sun.attributes.next_dawn) + (states("input_number.veranda_ouverture_offset") | int)  * 60)  | timestamp_custom("%H:%M") }}
  {% else %}
    {{ (state_attr('input_datetime.veranda_ouverture_auto_a','timestamp') | int | timestamp_custom("%H:%M", False)) }}
  {% endif %}

Salut,

tu peux utiliser quelque chose comme ça:

{{ now() - timedelta( hours = 1, minutes = 17 ) }}

En changeant bien sûr l’opérateur et le now() par ton datetime

C’est l’exemple donné dans la doc:

Merci voici ce que j’ai mis mais sans succes.
j’aurai pas un pb de format?

  - sensor:
      - name: Arrêt charge VE
        unique_id: arret_charge_ve
        state: >
          {{ (as_timestamp(states('sensor.calcul_charge_ve')) + (states('input_datetime.debut_charge_ve') | int)  * 60)  | timestamp_custom("%H:%M") }}
         

bonsoir,
je pense que c’est plutôt du genre ci dessous.

{{ states(‹ sensor.calcul_charge_ve ›) + (as_timestamp(states(‹ input_datetime.debut_charge_ve ›)) | int) * 60) | timestamp_custom(« %H:%M ») }}

A affiner selon la valeur de sensor.calcul_charge_ve (heure, minute ou seconde).
Le résultat de timestamp étant en seconde.

Bonjour,

j’ai toujours des soucis de compréhension.
Mon states(‹ sensor.calcul_charge_ve ›) me retourne des H:M.
Par contre mon (as_timestamp(states(‹ input_datetime.debut_charge_ve ›)) | int) * 60) | me retourne

TemplateSyntaxError: unexpected ')'

j’ai une ‹ ) › en trop mais je ne vois pas laquelle supprimer, ou en ajouter une ‹ ( ›.

tu me dis que le as_timestand me donne des secondes et j’ai des H:M sur le sensor. Je ne comprend pas comment l’addition peut fonctionner.
La, je sèche. Merci pour ton support.

Bonne soirée

Bonsoir,

La conversion des secondes en heure minute se fait avec le timestamp_custom. Et le calcul sur des seconde me parait plus simple (je ne suis pas expert de la manipulation des données de temps et j’ai également le souci de manip des sensor en heure min et input datetime en heure min également. d’où le passage par les secondes).
Pour obtenir ton input_datetime en seconde c’est comme cela :

state_attr(‹ input_datetime.debut_charge_ve ›,‹ timestamp ›).

Comment fais tu le calcul du temp de charge ?

J’ai aussi beacoup travaillé dernierement sur des soucis de date et timedelta et …

Mon plus gros conseil que je peut donner, c’est de typé les données :
avec par exemple une date :

device_class: timestamp

et une durée :

      device_class: duration
      unit_of_measurement: s

et qui permet de faire une « addition » simple et efficace :

{{ states('sensor.start_variable_batterie') | as_datetime +
    states('sensor.dure_variable_batterie') | as_timedelta }}

ou avec maintenant :

{{ now() + states('sensor.dure_variable_batterie') | as_timedelta }}

(et ces sensors s’afficheront bien dans le dashboard sans post-traitement)

je vous met le code complet de mes sensors si vous voulez vous en inspirer :
ps: je calcul d’abord l’heure de fin puis j’en déduit la durée pour être sur qu’on dépasse pas les 6h du matin (ça fait partie de mon cahier des charges) :

    - name: Fin Variable Batterie
      unique_id: fin_variable_batterie
      device_class: timestamp
      icon: mdi:timer-sand
      state: >
        {% set besoin = states('sensor.requise_variable_batterie') | float (default=0) - ( ( states('sensor.battery_soc') | float (default=0) - states('number.battery_min_soc') | float (default=0) ) * 14.5 / 100 ) | round (1,floor) %}
        {% if besoin > 0 %}
          {# sur le temps de fonctionnement du ballon necessaire, on économise 1,3Kwh/h #}
          {% if states('sensor.ballon_variable_batterie') | float (default=0) * 1.3 > besoin %}
            {% set seconde = ( besoin / 1.3 * 3600 ) | int %}
          {% else %}
          {# puis 0.3KwH/h #}
          {% set seconde = ( ( ( ( besoin - states('sensor.ballon_variable_batterie') | float (default=0) ) / 0.3 ) + states('sensor.ballon_variable_batterie') | float (default=0) * 1.3 ) | float (default=0) * 3600 ) | int %}
          {% endif %}
          {% set fin = ( states('sensor.start_variable_batterie') ) | as_datetime | as_local + timedelta(seconds=seconde) %}
          {# si fin - start > 8h : limitation, ou si fin > 6h et < 22h : limitation #}
          {% if ( fin - ( states('sensor.start_variable_batterie') ) | as_datetime | as_local).total_seconds() > 28800 or ( fin.hour >= 6 and fin.hour < 22 ) %}
            {{ fin.replace(hour=5, minute=59,second=0, microsecond=0).isoformat() }}
          {% else %}
          {{ fin.isoformat() }}
          {% endif %}
        {% else %}
          {{ (states('sensor.start_variable_batterie')| as_datetime | as_local).isoformat() }}
        {% endif %}
    - name: Dure Variable Batterie Vide pour passer la nuit
      unique_id: dure_variable_batterie_vide-pour_passer_la_nuit
      state_class: measurement
      device_class: duration
      unit_of_measurement: s
      icon: mdi:timer-sand
      state: >
        {% if states('sensor.restant_variable_batterie') < states('sensor.requise_variable_batterie') %}
          {{ ( states('sensor.fin_variable_batterie') | as_datetime - states('sensor.start_variable_batterie') | as_datetime ).seconds }}
        {%- else %}
          {{ '0' }}
        {% endif -%}
1 « J'aime »

Voici mon calcul pour la charge

template:
  - sensor:
      - name: Duree charge VE
        unique_id: duree_charge_ve
        state: "{{ ((80 - states('input_number.initial_batterie_ve') | float) * 8.2) / 60| round(0) }}"
  • 80 corespond au 80% de charge que je souhaite atteindre afin d’optimiser la charge.
  • input_number.initial_batterie_ve est mon pourcentage de batterie restant dans la voiture
  • le 8.2 est un paramètre que j’ai tuné par apprentissage. 8.2 minutes pour charger 1% de batterie

je le transforme en H:M avec:

  - sensor: 
      - name: "calcul Arret charge VE"
        unique_id: calcul_charge_ve
        state: >
          {% set hours = states('sensor.duree_charge_ve') | float %} 
          {% set minutes = ((hours % 1) * 60) | int %}
          {{ '%02i:%02i'%(hours // 1, minutes) }}

J’ajoute ce sensor à mon heure de départ input_datetime.debut_charge_ve pour avoir une heure de fin de charge. Ensuite je crée une règle qui me stoppe la charge à l’heure calculée. bon ça c’est la théorie ds la pratique…

Le plus simple aurait été de stopper à 80% de charge donnée par l’appli de Peugeot mais celle-ci semble payante… Voir mon post PSA car controller .
Pour l’instant, j’ai des pbs avec.

@roumano je vais regardé ton approche.

Merci

slt, slt,

La durée en seconde + l’heure de début en seconde convertis avec timestamp ça doit fonctionner.
Mais effectivement @roumano a une approche bien plus simple. Je vais me penché dessus également.