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}}
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:
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.
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 :
tu peux déclarer des variables dans ton script (bloc variables),
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.