Script - étrangeté d'interprétation de variable (ou non)

Bonjour à tous,

Je me suis construit un petit script pour faire un toggle sur mes climatisations :

alias: Toggle clim on / off
sequence:
  - if:
      - condition: template
        value_template: "{{ states(climate_entity_id) == 'off' }}"
    then:
      - service: homeassistant.turn_on
        target:
          entity_id: "{{ climate_entity_id }}"
        data: {}
    else:
      - service: homeassistant.turn_off
        target:
          entity_id: "{{ climate_entity_id }}"
        data: {}
mode: single
icon: mdi:air-conditioner

Ce dernier fonctionne parfaitement.

En revanche, j’étais parti comme ça au départ :

alias: Toggle clim on / off
sequence:
  - if:
      - condition: state
        entity_id: "{{ climate_entity_id }}"
        state: "off"
    then:
      - service: homeassistant.turn_on
        target:
          entity_id: "{{ climate_entity_id }}"
        data: {}
    else:
      - service: homeassistant.turn_off
        target:
          entity_id: "{{ climate_entity_id }}"
        data: {}
mode: single
icon: mdi:air-conditioner

Et impossible d’enregistrer le script :

Message malformed: Entity {{ climate_entity_id }} is neither a valid entity ID nor a valid UUID for dictionary value @ data['sequence'][0]['if'][0]['entity_id']

Au final, j’ai un peu de mal à comprendre pourquoi ma variable est interprétée dans le then, mais pas dans le if sur un condition state…

Si vous aviez une explication claire (ou un lien vers la doc) ça serait top SVP, pour m’éviter de refaire la même erreur :slight_smile:

Merci d’avance !

Bonjour,

Pourquoi ne pas utiliser l’interface graphique pour créer votre script? Vous pouvez mettre du YAML pour les cas non pris en charge. C’est bien plus simple pour trouver les erreurs.

J’ai fait un if then pour une de mes entités climate via l’interface et ensuite j’ai demandé de montrer la version YAML et ça me donne:

if:
  - condition: state
    entity_id: climate.bedroom
    state: heat
then: []

Je ne suis pas sûr de comprendre ce qu’est « climate_entity_id » pour toi?

Merci de ton retour,

Justement, {{ climate_entity_id }} est en fait une variable, ce qui me permet d’appeler mon script pour plusieurs entités distinctes, et ça fonctionne dans le cas du premier script. Mais pas dans le cas du second, ce qui est mon problème :slight_smile:

exemple d’appel qui fonctionne :

service: script.toggle_clim_on_off
data:
  climate_entity_id: climate.salon

Et du coup, passer par l’interface ne change pas le problème :wink:

Je comprends le rejet de l’interface graphique, surtout quand on travaille avec des variables, donc des templates :slight_smile: Mais c’est la direciton que prend HA alors qu’ils avaient une philosophie 100% à l’opposé il y a encore quelques années.

Néanmoins, j’ai copié tes scripts dans l’interface graphique de création d’home assistant en mode YAML depuis les 3 points en haut à droite, puis je suis repassé en mode graphique avant de sauvegarder.

Le script 1, aucun problème. Le script 2 effectivement il ne va pas. Voici la différence:
OK:

Pas OK d’utiliser une entité en variable:

La documentation officielle dit bien:
« variables can be passed along to a script so they become available within templates in that script »

qui peut se traduire par:
« les variables peuvent être passées à un script en devenant accessible à travers des temapltes dans ce script »

Donc ton script 2 n’est pas une façon supportée d’utiliser les variables.

J’ai bien compris ça, mais c’est le « pourquoi » qui m’intéresse, essayer de comprendre la logique derrière que je n’ai pas :wink:

Ahhh excuse moi, en relisant je comprends mieux. J’ai fait des tests, j’ai d’abord cru que j’avais compris, j’ai commencé une explication puis en fait… non :smiley:

Effectivement c’est louche. J’imagine que la façon dont les conditions sont interprêtées dans le code d’HA utilise une mécanique différente que dans les appels de services.

Salut,
je pense que la différence vient du fait que dans le script qui ne marche pas, tu ne passes pas l’entité mais une chaine de caractères et c’est ça qui ne passe pas.

Après interprétation il a pris en compte ça:

      - condition: state
        entity_id: "climate.salon"
        state: "off"

Alors qu’il aurait aime ça:

      - condition: state
        entity_id: climate.salon
        state: "off"

Et de la même, dans le script qui marche. La fonction states elle elle attend bien une chaine de caractère qui contient le nom d’une entité…

states("climate.salon")  => OK
states(climate.salon)  => PAS OK
2 « J'aime »

Merci beaucoup.
Est-ce que tu sais si il y aurait un endroit où signaler cette étrangeté ?
Peut-être pour une future modification de HA ?

Merci d’avance :pray:

En fait j’expliquais que ce n’était pas une étrangeté mais lié au typage de données qui est lié aux langages de programmation qui sont derrière.

2 « J'aime »