Automatisation avec input_number.cover

Pas à ma connaissance…

Mais n’hésite pas à extraire des bout de code et demander :+1:

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 :

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

  1. Avec un format HH:MM (ou HH:MM:SS) (donc on peut utiliser un input_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 '.

  1. 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 ! :wink:

3 « J'aime »

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 :heart:

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 :

1 « J'aime »

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

1 « J'aime »

Et quand tu seras bien bien chaud, tu regarderas l’intégration template cover :smile:

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.

1 « J'aime »

Non, mais on peux quand même essayer de résoudre ton problème ici, je mettrais à jour le post marqué résolu…:innocent:

Je pensais que c’était bon cette histoire :grin:

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 :+1:

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

Merci de ta réponse, en rajoutant la balise _template cela ne fonctionne pas. Quant aux services il faut que je me penche dessus car il me manque des notions pour comprendre.

je viens de tester en créant un petit fichier de test:


input_boolean:
    bouton_test:
        name: test
        
automation:
  - id: 'notification_test'
    alias: 'notification_test'
    description: 'notification_test'
    trigger:
    - platform: state
      entity_id: input_boolean.bouton_test
    condition: []
    action:
     - service: cover.set_cover_position
       data:
        entity_id: cover.shenzhen_neo_electronics_co_ltd_unknown_type_0200_id_102c_level
        position: {{ 100 - ( states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int ) }}

Cela marche quand je mets une valeur numérique mais des que je mets la ligne je retrouve une erreur de configuration log:
Error loading /config/configuration.yaml: invalid key: « OrderedDict([(‹ 100 - ( states(« input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree ») | int ) ›, None)]) » in « /config/packages/test.yaml », line 17, column 0

13:57:34 – Hass.io (ERROR)

invalid key: « OrderedDict([(‹ 100 - ( states(« input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree ») | int ) ›, None)]) » in « /config/packages/test.yaml », line 17, column 0

13:57:34 – util/yaml/loader.py (ERROR)

Je viens de comprendre !

Pff des fois c’est un truc tout simple… :upside_down_face:

input_boolean:
    bouton_test:
        name: test
        
automation:
  - id: 'notification_test'
    alias: 'notification_test'
    description: 'notification_test'
    trigger:
    - platform: state
      entity_id: input_boolean.bouton_test
    condition: []
    action:
     - service: cover.set_cover_position
       data:
        entity_id: cover.shenzhen_neo_electronics_co_ltd_unknown_type_0200_id_102c_level
        position: '{{ 100 - ( states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int ) }}'

Quoi ?

Tu ne remarques même pas les guillemets après la clé position: :eyes: :grin: :sweat_smile:

:smiling_imp:

C’est pour cette raison que je préfère mettre sous cette forme :

position: >
  {{ 100 - ( states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int ) }}

Mais l’interface graphique est pas mal, car elle permet de détecter une erreur rapidement car en sauvegardant voici ce que contient l’automatisation :

- id: '1234567890'
  alias: Nouvelle automatisation
  description: ''
  trigger:
  - platform: state
    entity_id: input_boolean.bouton_test
    to: 'on'
  condition: []
  action:
  - service: cover.set_cover_position
    entity_id: cover.mon_volet
    data:
      position:
        '[object Object]':   #<-- ?????
  mode: single

Super cela fonctionne je te remercie aussi le code utilisé :

        position:  >
            {{ 100 - ( states("input_number.pourcentage_de_pre_fermeture_du_volet_de_la_baie_vitree") | int ) }}

il me reste plus qu’à étudier le code que tu m’as donné pour le calcul des heures je t’avoue que cette partie me reste complètement obscure
Un très gros merci @Clemalex pour toutes les connaissances que tu m’as reportées.

1 « J'aime »

N’hésite pas à poser des questions ?

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 %}

toute cette partie là je n’y comprends rien. Tu crées un tableau tu regardes si la taille du tableau est inférieure à 1 %

Pas à 1% mais à 1 simplement (le % va avec l’accolade pour marquer la fin de la syntaxe {% le code ici %} (documentation).

En fait la fonction split permet de récupérer un tableau avec comme séparateur, ici le caractère négative (-).

Donc, si la taille du tableau (le nombre d’élément le constituant) est de 1 (donc un seul élément) cela veux dire que le caractère n’a pas été retrouvé (et donc le decalage est positif).

Si l’offset (l’input_number) est negatif, l'état (state) équivaut à - XXX. Donc avec la fonction split et le délimiteur, on obtient un tableau de 2 éléments (dont le premier est null car rien devant le signe négatiif).

['15'] # tableau quand l'input_number est à la position +15
['', '15'] # tableau quand l'input_number est à la position -15

Le délimiteur choisi est le signe négatiif car c’est le seul caractère qui est différent entre une valeur positive et négative.

1 « J'aime »

OK super merci pour l’explication est encore une fois merci pour toutes les connaissances que tu m’as a portées.

1 « J'aime »