Les bases, variables et scenario, difficile de passer sur HA pour un Jeedomien

Bonjour à tous,

ExJeedomien, je me teste à HA depuis une quinzaine de jours. HA est tellement different de jeedom sur la partie variable / scenario, que je suis un peu perdu…

Je cherche à réguler la puissance de bornes de recharges WALLBOX selon l’excedent solaire de mon installation FRONIUS.

Mon problème

Je souhaiterai affecter des variables, pour qu’elles soient disponibles dans des automations, dans les conditions notamment. J’ai cru comprendre qu’il fallait les ajouter à configuration.yaml, partie template. Mais aucun des « variables » / « sensor » créés n’est disponible pour le dashboard ou mes automations, je loupe certainement quelques choses…

Ci-dessous mon code:


template:
  - sensor:
      current_exceeded_by_solar:
        friendly_name: Energie (A) injecté sur le réseau
        unit_of_measurement: "A"
        device_class: power
        state: >
            {{ ((states('sensor.smart_meter_ts_65a_3_power_real')|float) / -700 |round(0) }}
#Energie diviser par la tension en TRI et inversé pour avoir une valeur positive.

  - sensor:
      power_usedbychargestation_on_solar:
        friendly_name: Puissance déjà utilsé par les bornes solaires
        unit_of_measurement: 'on'
        value_template: >
          {% set total = 0 %}
          {% if is_state('input_select.borne_2a', 'on') %}
            {% set total = total + sensor.wallbox_portal_charging_power_3 %}
          {% endif %}
          {% if is_state('input_select.borne_2b', 'on') %}
            {% set total = total + sensor.wallbox_portal_charging_power_4 %}
          {% endif %}
          {% if is_state('input_select.borne_2c', 'on') %}
            {% set total = total + sensor.wallbox_portal_charging_power_5 %}
          {% endif %}
          {% if is_state('input_select.borne_3a', 'on') %}
            {% set total = total + sensor.wallbox_portal_charging_power %}
          {% endif %}
          {% if is_state('input_select.borne_3b', 'on') %}
            {% set total = total + sensor.wallbox_portal_charging_power_2 %}
          {% endif %}
          {{total}}

  - sensor:
      current_chargestation_on_solar:
        friendly_name: Nombre de chargeur allumé sur le solaire
        unit_of_measurement: 'on'
        value_template: >
          {% set total = 0 %}
          {% if is_state('input_select.borne_2a', 'on') %}
            {% set total = total + 1 %}
          {% endif %}
          {% if is_state('input_select.borne_2b', 'on') %}
            {% set total = total + 1 %}
          {% endif %}
          {% if is_state('input_select.borne_2c', 'on') %}
            {% set total = total + 1 %}
          {% endif %}
          {% if is_state('input_select.borne_3a', 'on') %}
            {% set total = total + 1 %}
          {% endif %}
          {% if is_state('input_select.borne_3b', 'on') %}
            {% set total = total + 1 %}
          {% endif %}
          {{total}}

Ma configuration


System Information

version core-2023.7.3
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.11.4
os_name Linux
os_version 6.1.34
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 10.3
update_channel stable
supervisor_version supervisor-2023.07.1
agent_version 1.5.1
docker_version 23.0.6
disk_total 30.8 GB
disk_used 4.7 GB
healthy true
supported true
board ova
supervisor_api ok
version_api ok
installed_addons File editor (5.6.0)
Dashboards
dashboards 1
resources 0
mode auto-gen
Recorder
oldest_recorder_run 23 juillet 2023 à 08:41
current_recorder_run 1 août 2023 à 00:54
estimated_db_size 108.26 MiB
database_engine sqlite
database_version 3.41.2
___

Bonjour,

Les variables doivent être des input.*
Ça se crée par le biais de l’interface dans Paramètres > appareils et services > Entrées. Il en existe pas mal dont Nombre et Texte. Ces input peuvent être modifiés manuellement par le biais de l’interface ou par le biais d’automatisation à l’aide de services.

Les templates sont l’équivalent des virtuels sous jeedom. Ils permettent de créer des entités de tout type dont on peut définir toutes les propriétés (valeurs, unité, icône, etc.) en fonction de tout ce que l’on veut

Dans votre code, il ne faut pas utiliser value_template mais state. Friendly_name n’existe pas. Unit_of_measurement doit être une unité.

Un template pour un sensor doit avoir cette tête :

- sensor:
    name: "Nom"
    unique_id: identifiant_unique
    unit_of_measurement: "unité"
    state_class: measurement | total | total_increasing
    device_class: type du sensor
    state: "template définissant l’état ou les états du capteur"
    availability: "template définissant la disponibilité du capteur"

On peut ajouter icon: si l’on utilise pas device_class:

La doc est ici : Template - Home Assistant

Les erreurs dans votre code doivent apparaître dans les logs de HA.

4 « J'aime »

J’ai pu avancer et commencer avec vos conseils mon automation. Mais je n’arrive pas a affecter les variables, qu’est ce que je fais de travers? Aucune erreur ne remonte sur HA

alias: ENERGIE (W) UTILISE PAR BORNE SOLAIRE
description: ""
trigger:
  - platform: time_pattern
    hours: "*"
    minutes: /5
condition: []
action:
  - variables:
      energyUsedByEVChargerOnSolar = 0: null
      numberOfEVChargerOnSolar = 0: null
      powerAvailableForCharger = 0: null
      currentAvailableForCharger = 0: null
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.borne_2a
            state: ECO (SOLAIRE SEULEMENT)
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description_3
                state: Waiting for car demand
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description_3
                state: Ready
        sequence:
          - variables:
              energyUsedByEVChargerOnSolar = energyUsedByEVChargerOnSolar + sensor.wallbox_portal_charging_power_3: float
              numberOfEVChargerOnSolar = numberOfEVChargerOnSolar + 1: null
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.borne_2b
            state: ECO (SOLAIRE SEULEMENT)
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description_4
                state: Waiting for car demand
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description_4
                state: Ready
        sequence:
          - variables:
              energyUsedByEVChargerOnSolar = energyUsedByEVChargerOnSolar + sensor.wallbox_portal_charging_power_4: float
              numberOfEVChargerOnSolar = numberOfEVChargerOnSolar + 1: int
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.borne_2c
            state: ECO (SOLAIRE SEULEMENT)
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description_5
                state: Waiting for car demand
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description_5
                state: Ready
        sequence:
          - variables:
              energyUsedByEVChargerOnSolar = energyUsedByEVChargerOnSolar + sensor.wallbox_portal_charging_power_5: float
              numberOfEVChargerOnSolar = numberOfEVChargerOnSolar + 1: null
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.borne_3a
            state: ECO (SOLAIRE SEULEMENT)
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description
                state: Waiting for car demand
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description
                state: Ready
        sequence:
          - variables:
              energyUsedByEVChargerOnSolar = energyUsedByEVChargerOnSolar + sensor.wallbox_portal_charging_power: float
              numberOfEVChargerOnSolar = numberOfEVChargerOnSolar + 1: null
  - choose:
      - conditions:
          - condition: state
            entity_id: input_select.borne_3b
            state: ECO (SOLAIRE SEULEMENT)
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description_2
                state: Waiting for car demand
          - condition: not
            conditions:
              - condition: state
                entity_id: sensor.wallbox_portal_status_description_2
                state: Ready
        sequence:
          - variables:
              energyUsedByEVChargerOnSolar = energyUsedByEVChargerOnSolar + sensor.wallbox_portal_charging_power_2: float
              numberOfEVChargerOnSolar = numberOfEVChargerOnSolar + 1: null
  - variables:
      powerAvailableForCharger = energyUsedByEVChargerOnSolar + (sensor.smart_meter_ts_65a_3_power_real*-1): float
      currentAvailableForCharger = powerAvailableForCharger/700: float
      currentAvailablePerCharger = currentAvailableForCharger/numberOfEVChargerOnSolar: float
mode: single

Il ne devrait y avoir qu’un seul choose dans votre automatisation.
Je ne comprend pas les : null ou : float après les variables, ou avez-vous vu ça ? Je trouve rien dans la doc.
Pour les variables, si vous avez des formules comme c’est le cas vous devez utiliser des {{ }} afin que cela soit interprété comme des templates.
Enfin, les variables telles que définies ici n’ont pas de vie en dehors de l’automatisation. Ainsi la modification de celles-ci en fin d’automatisation n’a pas d’intérêt.

La doc est ici :

salut @ricks ,

Pour aider voici un script (et pas une automatisation) exemple qui permet de calculer des choses avec des variables intermédiaires (ton besoin à priori). Ca calcule une durée d’arrosage en fonction de paramètre donnés par l’utilisateur (input_number), de l’archive météo (sensor.archive_meteo_beynes_temperature) et d’une formule. Ca devrait t’aider pour la syntaxe:

arrosage_automatique:
  alias: Pilotage arrosage automatique
  mode: restart
  icon: mdi:access-point-network
  variables:
    tempMin: '{{ states(''input_number.arrosage_temperature_min'') | float }}'
    precMin: '{{ states(''input_number.arrosage_precipitation_min'') | float }}'
    dureeMax: '{{ states(''input_number.arrosage_duree_max'') | float }}'
    coefTemp: '{{ states(''input_number.arrosage_coefficient_temperature'') | float
      / 100.0  }}'
    coefPrec: '{{ states(''input_number.arrosage_coefficient_precipitation'') | float
      / 100.0  }}'
    dureeArrosage: '{%- set now = namespace(d = utcnow()) %}

      {%- set d=now.d.year | string + "-" +now.d.month | string + "-" + now.d.day
      | string %}

      {%- set now.d = strptime(d, "%Y-%m-%d") %}

      {%- set data= namespace(temp=[], prec=[]) %}

      {%- for i in range(0, 5) %}

      {%-    set t  = state_attr(''sensor.archive_meteo_beynes_temperature'', now.d.isoformat()+"Z")
      %}

      {%-    set t = tempMin if t==None else t %}

      {%-    set p  = state_attr(''sensor.archive_meteo_beynes_precipitation'', now.d.isoformat()+"Z")
      %}

      {%-    set p = precMin | float if p==None else p %}

      {%-    set data.temp = data.temp + [t] %}

      {%-    set data.prec = data.prec + [p] %}

      {%-    set now.d = now.d - timedelta(hours=24) %}

      {%- endfor %}

      {%- set factTemp = data.temp[0]*0.5 + data.temp[1]*0.25 + data.temp[2]*0.125
      + data.temp[3]*0.0625 + data.temp[4]*0.0625 %}

      {%- set factTemp = (factTemp - tempMin) / tempMin %}

      {%- set factPrec = data.prec[0]*0.5 + data.prec[1]*0.25 + data.prec[2]*0.125
      + data.prec[3]*0.0625 + data.prec[4]*0.0625 %}

      {%- set factPrec = (precMin - factPrec) / precMin %}

      {{ (dureeMax * ( coefTemp * factTemp + coefPrec * factPrec) ) | round }}

      '
  sequence:
  - service: system_log.write
    data:
      logger: homeassistant.components.script.pilotage_arrosage_automatique
      message: 'Pilotage de l''''arrosage automatique à {{ now() }}, dureeArrosage={{
        dureeArrosage }}

        tempMin={{ tempMin}} minutes, precMin={{ precMin }} mm, dureeMax={{ dureeMax
        }}, coefTemp={{ coefTemp }}, coefPrec={{ coefPrec }}'
      level: info
  - choose:
    - conditions:
      - condition: template
        value_template: '{{ dureeArrosage >= 1 }}'
      sequence:
      - service: input_number.set_value
        data:
          value: '{{ dureeArrosage }}'
        target:
          entity_id: input_number.arrosage_duree_calculee
      - service: script.turn_on
        data: {}
        target:
          entity_id: script.arrosage_manuel
    default:
    - service: system_log.write
      data:
        message: Pas besoin d''arroser. On ne démarre pas l''arrosage automatique
        logger: homeassistant.components.script.pilotage_arrosage_automatique
        level: info
    - event: NOTIFIER
      event_data:
        action: send_to_all
        title: Arrosage automatique
        message: Pas besoin d'arrosage aujourd'hui
        callback:
        - title: Allumer arrosage
          event: allumer_arrosage
        image_url: /media/local/arrosage.webp
        click_url: lovelace/Arrosage
        icon: mdi:sprinkler
        tag: arrosage
        persistent: true

Te focalise pas sur la formule elle-même mais sur la syntaxe.

En 2 mots :

  1. tu peux déclarer des variables dans ton script (bloc variables),
  2. les init de valeurs et les calculs doivent être fait dans des templates (entre {% %}) avec la syntaxe Jinja2 (voir des exemples sur Google),

Une fois que ton script fonctionne, tu l’appelles depuis une automatisation avec des triggers et des conditions spécifiques.

A l’usage tu verras que cette séparation automatisation (trigger, conditions) et script (le partie comportement) est bien pratique.

J’espère que ça aide.

1 « J'aime »