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.
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.