Hoo!!! Un très gros merci je n’avais pas vu que l’on pouvait intégrer par là je passais par le code.
@Nyco :
Ci dessous le code qui permet de gérer le décalage horaire (offset) du coucher de soleil de l’entité sun.sun
sur +/- 59 minutes.
Je suis partis du principe que l’attribut next_setting
de cette entité représente l’heure du coucher de soleil.
- Pour gérer le décalage, un
input_number
est utilisé :
input_number:
volet_salon_decalage:
name: "Volet Décalage en minutes"
min: -59
max: 59
step: 1
- On récupère et converti l’état (state) de cette entité pour la stocker dans un
input_datetime
:
input_datetime:
decalage_coucher_de_soleil:
name: "décalage de l'heure du coucher de soleil"
has_date: false
has_time: true
automation:
#Automatisation qui détermine l'heure du coucher de soleil
- id: 'décalage_determination_de_l_heure'
alias: décalage_determination_de_l_heure
trigger:
- platform: state
entity_id: input_number.volet_salon_decalage
- platform: state
entity_id: sun.sun
- platform: homeassistant
event: start
condition:
action:
- service: input_datetime.set_datetime
entity_id: input_datetime.decalage_coucher_de_soleil
data:
time: >
{% set taille_du_tableau = states('input_number.volet_salon_decalage').split('-')|length %}
{% if taille_du_tableau == 1 %}
{# Décalage positif #}
{{ "00:" + states('input_number.volet_salon_decalage').split('-')[0]|int|string + ":00" }}
{% else %}
{# Décalage négatif #}
{{ "00:" + states('input_number.volet_salon_decalage').split('-')[1]|int|string + ":00" }}
{% endif %}
- On détermine la nouvelle heure du coucher de soleil dans un autre
input_datetime
:
input_datetime:
heure_coucher_de_soleil_avec_decalage:
name: "Heure coucher de soleil avec décalage"
has_date: false
has_time: true
automation:
#Automatisation qui détermine l'heure du coucher de soleil
- id: 'décalage_determination_de_l_heure'
alias: décalage_determination_de_l_heure
trigger:
- platform: state
entity_id: input_number.volet_salon_decalage
- platform: state
entity_id: sun.sun
- platform: homeassistant
event: start
condition:
action:
- service: input_datetime.set_datetime
entity_id: input_datetime.heure_coucher_de_soleil_avec_decalage
data:
time: >
{% set taille_du_tableau = states('input_number.volet_salon_decalage').split('-')|length %}
{% if taille_du_tableau == 1 %}
{# Décalage positif #}
{{ ( as_timestamp(state_attr('sun.sun', 'next_setting')) | int
+
state_attr('input_datetime.decalage_coucher_de_soleil', 'timestamp') | int
)| timestamp_custom('%H:%M', true)
}}
{% else %}
{# Décalage négatif #}
{{ ( as_timestamp(state_attr('sun.sun', 'next_setting')) | int
-
state_attr('input_datetime.decalage_coucher_de_soleil', 'timestamp') | int
)| timestamp_custom('%H:%M', true)
}}
{% endif %}
Maintenant, l’entité input_datetime.heure_coucher_de_soleil_avec_decalage
contient la nouvelle horaire du coucher de soleil incluant le décalage qui est réglable dans Lovelace.
- Il reste donc à utiliser cette entité comme déclencheur (trigger) dans les automatisations :
- id: 'décalage_coucher_de_soleil'
alias: décalage_coucher_de_soleil
trigger:
platform: time
at: input_datetime.decalage_coucher_de_soleil
condition:
action:
- service: persistent_notification.create
data:
message: "Décalage de {{ states('input_datetime.decalage_coucher_de_soleil') }}"
title: "Décalage configurable"
notification_id: "{{ (range(1, 9999)|random) }}"
Ce qui donne dans un fichier en mode packages
sensor:
- platform: time_date
display_options:
- 'time'
input_number:
volet_salon_decalage:
name: "Volet Décalage en minutes"
min: -59
max: 59
step: 1
input_datetime:
decalage_coucher_de_soleil:
name: "décalage de l'heure du coucher de soleil"
has_date: false
has_time: true
heure_coucher_de_soleil_avec_decalage:
name: "Heure coucher de soleil avec décalage"
has_date: false
has_time: true
automation:
#Automatisation qui détermine l'heure du coucher de soleil
- id: 'décalage_determination_de_l_heure'
alias: décalage_determination_de_l_heure
trigger:
- platform: state
entity_id: input_number.volet_salon_decalage
- platform: state
entity_id: sun.sun
- platform: homeassistant
event: start
condition:
action:
- service: input_datetime.set_datetime
entity_id: input_datetime.decalage_coucher_de_soleil
data:
time: >
{% set taille_du_tableau = states('input_number.volet_salon_decalage').split('-')|length %}
{% if taille_du_tableau == 1 %}
{# Décalage positif #}
{{ "00:" + states('input_number.volet_salon_decalage').split('-')[0]|int|string + ":00" }}
{% else %}
{# Décalage négatif #}
{{ "00:" + states('input_number.volet_salon_decalage').split('-')[1]|int|string + ":00" }}
{% endif %}
- service: input_datetime.set_datetime
entity_id: input_datetime.heure_coucher_de_soleil_avec_decalage
data:
time: >
{% set taille_du_tableau = states('input_number.volet_salon_decalage').split('-')|length %}
{% if taille_du_tableau == 1 %}
{# Décalage positif #}
{{ ( as_timestamp(state_attr('sun.sun', 'next_setting')) | int
+
state_attr('input_datetime.decalage_coucher_de_soleil', 'timestamp') | int
)| timestamp_custom('%H:%M', true)
}}
{% else %}
{# Décalage négatif #}
{{ ( as_timestamp(state_attr('sun.sun', 'next_setting')) | int
-
state_attr('input_datetime.decalage_coucher_de_soleil', 'timestamp') | int
)| timestamp_custom('%H:%M', true)
}}
{% endif %}
- id: 'décalage_coucher_de_soleil'
alias: décalage_coucher_de_soleil
trigger:
platform: time
at: input_datetime.decalage_coucher_de_soleil
condition:
action:
- service: persistent_notification.create
data:
message: "Décalage de {{ states('input_datetime.decalage_coucher_de_soleil') }}"
title: "Décalage configurable"
notification_id: "{{ (range(1, 9999)|random) }}"
Hello, j’en profite pour une précision, le fichier en mode packages est intégré comment dans le configuration.yaml par exemple ?
C’était une précision demandée dans son contexte concret à lui.
La question arrivera toute seule…
Comme c’est souvent le cas (ma réponse est juste en dessous)
@Clemalex:
Un gros merci pour ton travail. il y a beaucoup de chose que je ne comprend pas. Il va me falloir du temps pour comprendre tout, ça me change du vba et c.
Auriez vous des cours/tutoriels en fr de préférence pour commencer sur de bonne basse ?
Pas à ma connaissance…
Mais n’hésite pas à extraire des bout de code et demander
Beaucoup d’exemple sur ce forum et énormément plus sur la communauté mondiale
Bon j’ai refais les intégrations et je bloc
- delay: '{{(states("input_number.delai_avant_fermeture") | int)}}'
c’est ligne fonctionne mais je ne sais pas si elle est écrite dans les règles de l’art et je ne comprend pas sa syntaxe. Pouvez vous me l’expliquer s’il vous plaît afin que je puisse écrire correctement la ligne suivante qui pour le moment me pause problème.
position: {{(states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int)}}
@Nyco :
En lisant la documentation du delay, on s’aperçoit qu’il y a plusieurs façon de l’utiliser :
- Seulement un nombre représentant des secondes (donc on peut utiliser un
input_number
)
# Seconds
# Waits 5 seconds
- delay: 5
est équivalent à :
#Déclaration de l'entité
# Example configuration.yaml entry
input_number:
temporisation:
name: "Temporisation modifiable dans Lovelace et par automatisations/scripts"
min: 0
max: 60
step: 1
#Utilisation de l'entité pour l'action delay
# X secondes
- delay: {{ states('input_number.temporisation') | int }}
L’utilisation de la fonction states()
renvoie un texte (string) alors que l’action delay
dans ce cas attend un nombre (integer). On obtient un nombre en convertissant l’état renvoyé à l’aide de l’utilisation d’un filtre (filter) Jinja en l’occurrence int
.
Dans l’exemple ci dessus, la temporisation ne pourra pas dépasser 1 minute (max: 60
).
- Avec un format
HH:MM
(ouHH:MM:SS)
(donc on peut utiliser uninput_datetime)
# HH:MM
# Waits 1 hour
- delay: '01:00'
est équivalent à :
#Déclaration de l'entité
input_datetime:
temporisation:
name: "Temporisation modifiable dans Lovelace et par automatisations/scripts"
has_date: false
has_time: true
#Utilisation de l'entité pour l'action délay
# HH:MM:SS
- delay: "{{ states('input_datetime.temporisation') }}"
Ici, l’action attends un texte donc pas de conversion à faire. Il faut simplement englober la formule et ne pas utiliser les mêmes que dans la formules : on englobe avec des guillemets "
car la formule utilise déjà des apostrophes '
.
- Avec toutes les clés définies :
#Temporisation de 1 minute et 30 secondes
- delay:
days: 0
hours: 0
minutes: 1
seconds: 30
milliseconds: 0
est équivalent à :
#Déclaration de l'entité
input_number:
temporisation_heures:
name: "Temporisation (H)"
min: 0
max: 24
step: 1
input_number:
temporisation_minutes:
name: "Temporisation (m)"
min: 0
max: 59
step: 1
input_number:
temporisation_secondes:
name: "Temporisation (s)"
min: 0
max: 59
step: 1
#Utilisation de l'entité pour l'action délay
# HH:MM:SS
- delay:
hours: {{ states('input_number.temporisation_heures') | int }}
minutes: {{ states('input_number.temporisation_minutes') | int }}
seconds: {{ states('input_number.temporisation_secondes') | int }}
Du coup, pour ton code :
position: {{(states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int)}}
Tu récupère l’état de l’entité input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree
:
position: {{ states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") }}
Mais comme la clé position
attend un nombre, il faut convertir l’état en nombre d’où | int
:
position: {{ states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int }}
Et donc pour reprendre ton code du premier post :
position: {{ 100 - ( states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int ) }}`
Pour pouvoir retourner une valeur calculée, il faut indiquer à l’interpréteur où se trouve ton calcul d’où les accolades {{ }}
(qui manquent dans ton premier post pour la position).
Elles indiquent à l’interpréteur que le texte à l’intérieur est du code :
- {{ le code ici }} : fait le traitement du code et renvoie la valeur dans la clé
- {% %} : fait le traitement du code mais ne renvoie pas de valeur (utilisé pour les affectations)
-
: >
ou: |
: indique à l’interpréteur que le code se trouve sur plusieurs ligne. C’est l’indentation qui fixe le début et la fin du code (généralement 2 espaces après le début de la clé)
Un exemple concret avec ton code serait :
position: >
{% set Position_Ouverte = 100 %}
{% set Position_Pre_Fermeture = states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int %}
{{ Position_Ouverte - Position_Pre_Fermeture }}
Des questions ? Attention ! Car tu auras des réponses !
Effectivement, et quelle réponse ! Je te remercie pour cette superbe réponse, tu me donnes plein de clés de compréhension. Ce qui va bien m’aider à décrypter ta première réponse avec toutes les manipulations pour le décalage lever du soleil.
Dans ton explication tu parles de ne pas pouvoir dépasser les 60 secondes, j’avais testé avant ton explication et effectuer un test de 180 secondes qui fonctionne à moins qu’il ai une subtilité qui m’échappe je ne vois pas pourquoi on ne peut pas dépasser la minute si l’on raisonne toujours en seconde.
En revanche je n’arrive toujours pas à faire fonctionner le code de position.
Si je rentre la ligne de code :
position: {{ states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int }}
lors de la vérification du serveur j’obtiens le message suivant :
Error loading /config/configuration.yaml: invalid key: "OrderedDict([('states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int', None)])"
in "/config/scripts.yaml", line 15, column 0
J’ai encore une petite question, je cherche à écrire quelque chose du type :
message: {{ 100 - ( states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int ) }}`
afin de pouvoir visualiser les valeurs que les lignes me renvoient. Je te remercie encore du temps que tu m’accordes.
Si tu trouve mon post utile n’oublie pas de mettre un
Oui, car c’est la définition de l’entité utilisée dans l’exemple :
input_number:
temporisation:
name: "Temporisation modifiable dans Lovelace et par automatisations/scripts"
min: 0
max: 60 #<--- La valeur maximale définie ici représente la valeur maximale du délais
step: 1
Pour avoir un maximum de 20 min par exemple, il faut revoir la définition de l’entité comme ceci :
input_number:
temporisation:
name: "Temporisation modifiable dans Lovelace et par automatisations/scripts"
min: 0
max: 1200 #<--- 20 min maximum
step: 1
Montre nous le contenu de ton fichier scripts.yaml
car column 0
semble indiquer une erreur d’indentation (mais , None
semble indiquer que la valeur n’est pas récupérée et donc que ça plante sur le filtre car l’interpréteur ne sait pas filtrer sur une valeure nulle) ou peut être encore un problème d’englobement.
Tout se passe dans la partie Outils de développement
:
Désolé je n’ai pas encore le réflexe.
je pensais que c’était par rapport au code en lui-même et par rapport à l’entité car pour l’entité j’avais mis une valeur me permettant les trois minutes.
Voici mon code de script:
fermeture_securiser_du_volet_de_la_baie_vitree:
alias: Fermeture sécuriser du volet de la baie vitrée
sequence:
- choose:
- conditions:
- condition: state
entity_id: input_boolean.fermeture_securisee_du_volet
state: 'on'
sequence:
- device_id: 094433a079fc3abacb93177271540c77
domain: cover
entity_id: cover.shenzhen_neo_electronics_co_ltd_unknown_type_0200_id_102c_level
type: set_position
#position: 85
position: {{ 100 - ( states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int ) }}`
- delay: '{{(states("input_number.delai_avant_fermeture") | int)}}'
#- delay: '60'
- device_id: 094433a079fc3abacb93177271540c77
domain: cover
entity_id: cover.shenzhen_neo_electronics_co_ltd_unknown_type_0200_id_102c_switch
type: close
default:
- device_id: 094433a079fc3abacb93177271540c77
domain: cover
entity_id: cover.shenzhen_neo_electronics_co_ltd_unknown_type_0200_id_102c_switch
type: close
mode: single
un gros merci pour le tuyau des outils de développeur. Très utile!!
Et quand tu seras bien bien chaud, tu regarderas l’intégration template cover
Je tiens à vous présenter mes excuses pour le petit abandon du poste. Je place ce poste en résolu, je peux bien programmer ma fermeture et mon ouverture de volets ce qui en fait la demande originale et je me suis un peu focus sur mon problème de positionnement qui aurait dû faire parti d’un autre poste. J’aurais bien aimé apporter la solution à ce problème dans ce poste mais si mais je n’ai toujours pas trouvé de solution et cela fait un moment que ce poste est ouvert. @Clemalex Je te remercie sincèrement de tous tes précieux conseils et des connaissances que tu m’as apportées.
Non, mais on peux quand même essayer de résoudre ton problème ici, je mettrais à jour le post marqué résolu…
Je pensais que c’était bon cette histoire
Tu en es où exactement ? Qu’est ce qui ne fonctionne pas ?
Bonsoir et merci d’avance pour ton aide, j’ai ce code je cherche à contrôler la position de mon volet avec une intégration. J’arrive bien à contrôler la position de mon volet avec ce code :
- device_id: 094433a079fc3abacb93177271540c77
domain: cover
entity_id: cover.shenzhen_neo_electronics_co_ltd_unknown_type_0200_id_102c_level
type: set_position
position: 85
là il n’y a pas de problème le code fonctionne le problème apparaît quand je cherche à remplacer mon 85 par une intégration. Je pense avoir fait une erreur dans la ligne suivante :
position: {{ 100 - ( states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int ) }}`
mais je ne vois pas laquelle, dans l’outil de développement mon entrée à l’herbe correcte.
Exécute l’automatisation avec le code qui ne marche pas et poste le message contenu dans le fichier home-assistant.log
.
Peut être que le service n’accepte pas de modèle Jinja…car ton code est bon
Je n’ai pas pu exécuter le script, car juste en redémarrant il détecte l’erreur voici le contenu du fichier log.
2020-12-22 10:03:04 ERROR (SyncWorker_0) [homeassistant.util.yaml.loader] invalid key: "OrderedDict([("100-(states('input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree')| int)", None)])"
in "/config/packages/volet.yaml", line 204, column 0
2020-12-22 10:03:04 ERROR (MainThread) [homeassistant.bootstrap] Failed to parse configuration.yaml: invalid key: "OrderedDict([("100-(states('input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree')| int)", None)])"
in "/config/packages/volet.yaml", line 204, column 0. Activating safe mode
Et en ajoutant la balise _template
à la clé position
:
- device_id: 094433a079fc3abacb93177271540c77
domain: cover
entity_id: cover.shenzhen_neo_electronics_co_ltd_unknown_type_0200_id_102c_level
type: set_position
position_template: {{ 100 - ( states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int ) }}`
?
Sinon, essaye plutôt d’utiliser ce service pour contrôler ton entité (cover.set_cover_position).