Creer une variable suivant plusieurs etats

Bonjour à tous,
je continue mon apprentissage de HA, j’ouvre ce sujet pour aider les futur nouveaux qui pourrait avoir besoin de creer une variable (terme propre a jeedom),
de ce que j’ai compris on parle d’input_number pour HA.

Voila, comme un autre membre du forum, je dispose d’un EcoPV, qui va devenir dans un futur proche un MaxPV, en attendant la nouvelle mouture, j’ai besoin de continuer a avoir a peu prés le mêmes process que sur mon Jeedom, cette variable me sert a connaitre la quantité d’énergie disponible en journée (cette énergie est mise dans mon Ballon d’eau chaude ECS), j’ai disposer quelques notif heure dans la maison, qui me donne avec un scenarii dans la journée cette valeur, afin de connaitre ma production dispo ou bien si je consomme sur le réseau aussi, j’utilise aussi cette valeur pour savoir si mon ECS a été complètement chauffé. Voila pour le cadre de la variable que je veux pratiquer,
cette variable sera composée de plusieurs valeurs venant de plusieurs entités suivant la production ou non production.

Variable = Eau chaude
Sensor.pvimport = puissance importer du réseau
Sensor.pvrouted = puissance router dans l’ECS le max est 3000
Sensor.pvexport = puissance exporter sur le reseau

j’ai créé une automatisation mais je ne suis pas sur d’avoir le résultat escompté.
et surtout comment l’afficher

- id: '1668006078877'
  alias: Variable Eau Chaude
  description: Variable Eau Chaude
  trigger: []
  condition:
  - condition: sun
    before: sunset
    after: sunrise
  action:
  - if:
    - condition: numeric_state
      entity_id: sensor.pvrouted
      above: 0
      attribute: ==
    then:
    - condition: state
      entity_id: sensor.pvimport
      attribute: unit_of_measurement
      state: apparent_power
    else:
    - if:
      - condition: numeric_state
        entity_id: sensor.pvrouted
        attribute: ==
        above: 3000
      then:
      - condition: state
        entity_id: sensor.pvexport
        attribute: unit_of_measurement
        state: apparent_power
      else:
      - condition: state
        entity_id: sensor.pvrouted
        attribute: unit_of_measurement
        state: apparent_power
  mode: single

Le but de cette variable,
avoir le PV import lorsque je suis en négatif, < 0
avoir le pvrouted si 0 à 2999,
avoir le pvexport si pvrouted = 3000

cette variable sera afficher sur mes notif heures, me permettant de connaitre la puissance pour déclencher des actions ou passer l’aspirateur ou savoir si mon ECS est chaud
je déclenche cette variable en fonction du coucher ou lever du soleil, mais cela pourrait être enlever pour fonctionné en permanence.

je n’arrive pas a l’afficher pour le moment, et je n’utilise surement pas la meilleur façon de faire.
merci de votre aide.

Une automatisation permet de lancer une ou des action suite à un évènement.
Ta partie trigger est vide donc ton automatisation ne sera jamais lancer.
Et dans les actions, je n’y vois aucune action réel (qui modifie ton input number)

1 « J'aime »

Merci du tuyau, j’ai donc modifier mes triggers, j’ai mis les 3 sensor qui me font ce dont j’ai besoin,
mais cela n’écrit pas pour autant une variable quelque part

alias: Variable Eau Chaude
description: Variable Eau Chaude
trigger:
  - platform: state
    entity_id:
      - sensor.pvrouted
      - sensor.pvexport
      - sensor.pvimport
condition:
  - condition: sun
    before: sunset
    after: sunrise
action:
  - if:
      - condition: numeric_state
        entity_id: sensor.pvrouted
        above: 0
        attribute: "=="
    then:
      - condition: state
        entity_id: sensor.pvimport
        attribute: unit_of_measurement
        state: apparent_power
    else:
      - if:
          - condition: numeric_state
            entity_id: sensor.pvrouted
            attribute: "=="
            above: 3000
        then:
          - condition: state
            entity_id: sensor.pvexport
            attribute: unit_of_measurement
            state: apparent_power
        else:
          - condition: state
            entity_id: sensor.pvrouted
            attribute: unit_of_measurement
            state: apparent_power
mode: single

Alors si la variable est bien créer, je n’ai pas l’input_number qui est défini dans la suite,
bien sur mon yaml ne mentionne pas l’input number, mais ou est ce qu’il faut le mettre?

Salut
Perso, vu le code de l’automatisation moi je ferrai ça un via un template et pas via une automatisation

et le code est réutilisable tel quel dans ce cas ?

Non, mais ça reste qu’une serie de if/elif/else

je vais repartir dans les templates alors :wink:

Ecrit en français que ce que ça doit fait…
Là par exemple moi je comprends/deduit : tu as 3 sensors dans lequel tu mets une valeur texte « apparent_power »… Et ce qui m’ennuie c’est que dans le dernier cas pour sensor.pvrouted, sa valeur numérique qui sert de condition se fait écraser par la valeur texte… du coup je suis pas certain de la logique et rien qui me fait penser à une variable. ça ressemble plus à 3 variables et un bug

Par extension je comprends que tu veux chauffer ton eau si ta production pv est > 3000, correct ?

en faite, c’est une variable pour remonter les infos sur des affichage Led installé dans la maison,
le chauffe eau est indépendant de toute installation, il se gère avec un appareil autonome, mais je récupère les infos de cette appareil (l’ecoPV), qui sont de 3 ordres:

  • PV Import : valeur lorsque j’importe de l’électricité du réseau (la nuit par ex.)
  • PV Export : valeur lorsque j’exporte sur le réseau mais souvent proche du 0 car je route dans le Chauffe-eau avant
  • PV Routed : valeur envoyé dans le chauffe-eau qui correspond a une « dispo électrique » gratuite.
    elle varie de 0 à 3000 lorsque je produis, mais je n’ai pas 3000 a envoyé, lorsque qu’il m’indique 3000 c’est que l’eau est chaude. et j’exporte forcement avec PV-routed.

donc pour résumé :
si PV routed = 0 alors affichage PV Import
si PV routed = 1-2999 alors PV routed
si PV routed = 3000 alors PV export.

Donc on parle d’afficher la valeur de PV import/PV routed/PV export ? Ou d’afficher un texte ?
Si c’est ça le template se limite à cette partie de code (pour l’état et aux noms adaptés que je n’ai pas)

{% set pv=states('sensor.pv_routed') %}
{% if pv == 0 %}
  PV Import
{% elif  pv > 0 and  pv  < 3000 %}
  PV routed
{% else %}
  PV export
{% endif %}

cas 0


cas 1/3000

Cas 3000+

ok plus simple que ce que je ne pensais, vais triffouiller de mon coté :wink:
et je mettrais mon résultat :wink:

Merci encore !!

J’ai une erreur avec sur le code, j’ai remplacer pour mettre les « bons noms ou sensor »
je fais le template du coup, j’ai l’impression qu’il ne supporte pas le >

TypeError: '>' not supported between instances of 'str' and 'int'
- platform: template
  sensors:
    name: VarEauChaude
    unit_of_measurement: "W"
    value_template: >
      {% set VarEauChaude=states('sensor.pvrouted') %}
      {% if VarEauChaude == 0 %}
        'sensor.PVimport'
      {% elif  VarEauChaude > 0 and  VarEauChaude  < 2999 %}
        'sensor.PVrouted'
      {% elif VarEauChaude == 3000 %}
        'sensor.PVexport'
      {% endif %}

là le > c’est à celui {% elif VarEauChaude > 0 and VarEauChaude < 2999 %}

states('sensor.pvrouted') ça retourne probablement plus un string (str) qu’une valeur numérique (int)… Donc essaye de corriger avec

- platform: template
  sensors:
    name: VarEauChaude
    unit_of_measurement: "W"
    value_template: >
      {% set VarEauChaude=states('sensor.pvrouted')|int(0) %}
      {% if VarEauChaude == 0 %}
        'sensor.PVimport'
      {% elif  VarEauChaude > 0 and  VarEauChaude  < 2999 %}
        'sensor.PVrouted'
      {% elif VarEauChaude == 3000 %}
        'sensor.PVexport'
      {% endif %}

t’es pas humain, lol
ça fonctionne dans modèles mais pas pour la validation de la configuration

j’ai pas encore tout suivi pour les fonctions "| int ou float %}

Invalid config for [sensor.template]: expected dictionary for dictionary value @ data['sensors']['name']. Got 'VarEauChaude'
expected dictionary for dictionary value @ data['sensors']['unit_of_measurement']. Got 'W'
expected dictionary for dictionary value @ data['sensors']['value_template']. Got "{% set VarEauChaude=states('sensor.pvrouted')|int(0) %} {% if VarEauChaude == 0 %}\n 'sensor.PVimport'\n{% elif VarEauChaude > 0 and VarEauChaude < 2999 %}\n 'sensor.PVrouted'\n{% elif VarEauChaude == 3000 %}\n 'sensor.PVexport'\n{% endif %}\n". (See ?, line ?).

ça c’est un souci de syntaxe yaml et de format du template : pas de majuscule, pas de mot clé name
ça, ça devrait être mieux

- platform: template
  sensors:
    vareauchaude:
      unique_id: vareauchaude
      value_template: >
        {% set vareauchaude = states('sensor.pvrouted')|int(0) %}
        {% if vareauchaude == 0 %}
          "PVimport"
        {% elif  vareauchaude > 0 and vareauchaude < 2999 %}
          "PVrouted"
        {% elif vareauchaude == 3000 %}
          "PVexport"
        {% endif %}

Chut, c’est un secret :wink:

cela dit pour avoir les valeurs des sensors pointer, comment faut faire,
la il me dit bien le bon sensor mais pas la valeur de celui-ci

- platform: template
  sensors:
    vareauchaude:
      unique_id: vareauchaude
      value_template: >
        {% set vareauchaude = states('sensor.pvrouted')|int(0) %}
        {% if vareauchaude == 0 %}
          "sensor.pvimport"
        {% elif  vareauchaude > 0 and vareauchaude < 2999 %}
          "sensor.pvrouted"
        {% elif vareauchaude == 3000 %}
          "sensor.pvexport"
        {% endif %}

Comme ça

- platform: template
  sensors:
    vareauchaude:
      unique_id: vareauchaude
      value_template: >
        {% set vareauchaude = states('sensor.pvrouted')|int(0) %}
        {% if vareauchaude == 0 %}
          {{ states('sensor.pvimport') }}
        {% elif  vareauchaude > 0 and vareauchaude < 2999 %}
          {{ states('sensor.pvrouted') }}
        {% elif vareauchaude == 3000 %}
          {{ states('sensor.pvexport') }}
        {% endif %}

Franchement merci beaucoup, je vais pouvoir avancer sur beaucoup de chose maintenant !!

En relisant le code, il y a 1 voire, 2 erreurs:

  • pour la valeur 2999 ça n’affichera rien, il faut remplacer vareauchaude < 2999 par vareauchaude <= 2999
  • pour les valeurs 3001 (et plus) ça n’affiche rien non plus. C’est pas forcément gênant si ça n’est pas un cas existant