Problème de structuration de configuration

Mon problème

Je suis perdu dans la gestion de mes fichiers de configuration.
Voici ce que j’ai en place:

configuration.yaml
# Loads default set of integrations. Do not remove.
default_config:

  # Text to speech
tts:
  - platform: google_translate

homeassistant:
  packages: !include_dir_named configuration/


automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
sensor: !include sensor.yaml
#input_number: !include input_number.yaml
#input_boolean: !include input_boolean.yaml
#input_datetime: !include input_datetime.yaml
sensor.yaml
- platform: template
  sensors:
    sunelevation:
      friendly_name: "elevation soleil"
      value_template: "{{ state_attr('sun.sun', 'elevation') }}"
    #on indique que la valeur de cette entité sera égale à la valeur de l'attribut elevation de l'entité sun.sun
    sunazimuth:
      friendly_name: "azimut soleil"
      value_template: "{{ state_attr('sun.sun', 'azimuth') }}"
    #on indique que la valeur de cette entité sera égale à la valeur de l'attribut azimuth de l'entité sun.sun

Je souhaitais suivre le partage de @jerome6994 :

J’ai donc ajouté à mon fichier sensor ceci

ajout
    # Suivi de la consommation des panneaux solaires
    pv_puissance_net:
      friendly_name: PV Puissance Net
      state_class: measurement
      unit_of_measurement: W
      device_class: power
      icon: >
        {% if (states("sensor.pv_puissance_net") | int > 0) -%}
          mdi:solar-panel
        {%- elif (states("sensor.pv_puissance_net") | int < 0) -%}
          mdi:transmission-tower
        {%- else -%}
          mdi:power-off
        {%- endif %}
      state: >
        {% set prod = states('sensor.pv_puissance_corrigee') | int(0) %}
        {% set conso = states('sensor.envoy_122250018513_current_power_consumption') | int(0) %}
        {{prod - conso}}

    pv_puissance_corrigee:
      friendly_name: PV Puissance corrigée
      state_class: measurement
      icon: mdi:solar-panel
      unit_of_measurement: W
      device_class: power
      state: >
        {% set value = states('sensor.envoy_122250018513_current_power_production') | int(0) %}
        {% if value  <= 5 -%}
          0
        {% elif is_state("sun.sun", "below_horizon")%}
          0
        {%else%}
          {{value}}
        {%endif%}

Seulement j’obtiens les erreurs suivantes:

erreurs
Avertissements de configuration
Invalid config for 'template' from integration 'sensor' at sensor.yaml, line 13: required key 'value_template' not provided
Invalid config for 'template' from integration 'sensor' at sensor.yaml, line 15: 'state_class' is an invalid option for 'sensor.template', check: sensors->pv_puissance_net->state_class
Invalid config for 'template' from integration 'sensor' at sensor.yaml, line 18: 'icon' is an invalid option for 'sensor.template', check: sensors->pv_puissance_net->icon
Invalid config for 'template' from integration 'sensor' at sensor.yaml, line 26: 'state' is an invalid option for 'sensor.template', check: sensors->pv_puissance_net->state
Invalid config for 'template' from integration 'sensor' at sensor.yaml, line 31: required key 'value_template' not provided
Invalid config for 'template' from integration 'sensor' at sensor.yaml, line 33: 'state_class' is an invalid option for 'sensor.template', check: sensors->pv_puissance_corrigee->state_class
Invalid config for 'template' from integration 'sensor' at sensor.yaml, line 34: 'icon' is an invalid option for 'sensor.template', check: sensors->pv_puissance_corrigee->icon
Invalid config for 'template' from integration 'sensor' at sensor.yaml, line 37: 'state' is an invalid option for 'sensor.template', check: sensors->pv_puissance_corrigee->state

Je démarre sur le gestion des template et dois avouer que le découpage des yaml n’est pas encore très clair chez moi

Pouvez-vous m’aider svp? merci

System Information

Résumé

System Information

version core-2024.3.0
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.12.2
os_name Linux
os_version 6.1.73-haos-raspi
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 4917
Installed Version 1.34.0
Stage running
Available Repositories 1402
Downloaded Repositories 14
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 12.1
update_channel stable
supervisor_version supervisor-2024.03.0
agent_version 1.6.0
docker_version 24.0.7
disk_total 109.3 GB
disk_used 7.4 GB
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.10.0), Samba Backup (5.2.0), Z-Wave JS (0.4.5), Node-RED (17.0.9), Mosquitto broker (6.4.0), File editor (5.8.0), Studio Code Server (5.15.0), Zigbee2MQTT (1.36.0-1)
Dashboards
dashboards 7
resources 7
views 11
mode storage
Recorder
oldest_recorder_run 6 mars 2024 à 02:03
current_recorder_run 15 mars 2024 à 05:49
estimated_db_size 223.64 MiB
database_engine sqlite
database_version 3.44.2
Sonoff
version 3.6.0 (8dd8af9)
cloud_online 4 / 5
local_online 1 / 1

Salut @alexb81

Tu devrais lire cette doc :

Tu verras qu’on a plusieurs formats.

  • Template.
  • Format « Legacy ».

Là, tu es parti pour mixer les 2 formats dans un seul fichier :wink:

Voilà la piste à creuser.

Re,

J’ai tenté de comprendre mais je dois avouer que je suis perdu. Jusqu’ici, je me suis contenté de recopier des exemples pensant les comprendre.

J’ai réussi à piloter mes volets j’en ai même fait un tuto: Pilotage de mes volets sous Tuya

Je dois bien reconnaitre que de passer des fichiers yaml à l’interface reste abstrait.

Quand je regarde l’arborescence de mon installation, je me rends compte que les notions de:
template
sensor
etc…

Reste flou dans leur positionnement dans l’arborescence de HA. Sans compter que cette histoire de modification d’architecture des fichiers ne m’aide pas vraiment vu que j’étais déjà paumé :slight_smile:

Voici ce que j’ai dans mon fichier configuration:

homeassistant:
  packages: !include_dir_named configuration/

là j’ai compris que HA allait charger tous les fichiers situé dans ./configuration
Je pense avoir bon puisqu’il me charge bien les entités de mes volets qui ont cette syntaxe

Au passe je dois avouer, que je ne sais plus, si je suis sur la nouvelle ou l’ancienne syntaxe (je suis perdu)

A coté de cela dans mon fichier configuration.yaml j’ai:

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
template: !include template.yaml
sensor: !include sensor.yaml

Je ne sans trop ce qu’il représente ces fichiers hormis le fait que j’utilise sensor.yaml pour l’élévation du soleil

- platform: template
  sensors:
    sunelevation:
      friendly_name: "elevation soleil"
      value_template: "{{ state_attr('sun.sun', 'elevation') }}"
    #on indique que la valeur de cette entité sera égale à la valeur de l'attribut elevation de l'entité sun.sun
    sunazimuth:
      friendly_name: "azimut soleil"
      value_template: "{{ state_attr('sun.sun', 'azimuth') }}"
#on indique que la valeur de cette entité sera égale à la valeur de l'attribut azimuth de l'entité sun.sun

là je crois être sur l’ancienne syntaxe OUI/NON???

Je retrouve 2 entités correspondantes dans HA donc ça fonctionne

Maintenant c’est quoi: « platform: template »

Quand dans un tuto, l’on me demande de créer les 2 choses :

template:
  - sensor:
        name: Grid Import Power
        state_class: measurement
        icon: mdi:transmission-tower
        unit_of_measurement: W
        device_class: power
        state: >
            {{ [0, states('sensor.envoy_SERIALNUMBER_current_power_consumption') | int(0) - states('sensor.envoy_SERIALNUMBER_current_power_production') | int(0) ] | max }}
  - sensor:
        name: Grid Export Power
        state_class: measurement
        icon: mdi:transmission-tower
        unit_of_measurement: W
        device_class: power
        state: >
            {{ [0, states('sensor.envoy_SERIALNUMBER_current_power_production') | int(0) - states('sensor.envoy_SERIALNUMBER_current_power_consumption') | int(0) ] | max }}

et

sensor:
  - platform: integration
    name: Grid Import Energy
    source: sensor.grid_import_power
    unit_prefix: k
    unit_time: h
    method: left
    
  - platform: integration
    name: Grid Export Energy
    source: sensor.grid_export_power
    unit_prefix: k
    unit_time: h
    method: left

Je ne comprends pas où les mettre ni si la syntaxe et compatible avec ce que j’ai.

Pourriez vous m’éclairer/aider, je crois qu’il me manque les base, HA des différentes briques.

Merci

Salut @alexb81

C’est compliqué, car tu utilises différentes notions, sans forcément encore maitriser.

Si on met de côté les « packages » :

Dans le cas du code cité au-dessus de cette remarque, tu as bien le format « legacy ». Donc à intégrer dans le fichier sensor.yaml.

Vu le code, on doit pouvoir le convertir au nouveau format.

Ensuite pour :

template:
  - sensor:
        name: Grid Import Power
        state_class: measurement
        icon: mdi:transmission-tower
        unit_of_measurement: W
        device_class: power
        state: >
            {{ [0, states('sensor.envoy_SERIALNUMBER_current_power_consumption') | int(0) - states('sensor.envoy_SERIALNUMBER_current_power_production') | int(0) ] | max }}
  - sensor:
        name: Grid Export Power
        state_class: measurement
        icon: mdi:transmission-tower
        unit_of_measurement: W
        device_class: power
        state: >
            {{ [0, states('sensor.envoy_SERIALNUMBER_current_power_production') | int(0) - states('sensor.envoy_SERIALNUMBER_current_power_consumption') | int(0) ] | max }}

C’est du nouveau format, donc pour l’intégrer :

  • Dans configuration.yaml, tu peux ajouter :
template: !include template.yaml
  • Créer le fichier correspondant et intégrer le code de cette façon :

- sensor:

    - name: Grid Import Power
      state_class: measurement
      icon: mdi:transmission-tower
      unit_of_measurement: W
      device_class: power
      state: >
          {{ [0, states('sensor.envoy_SERIALNUMBER_current_power_consumption') | int(0) - states('sensor.envoy_SERIALNUMBER_current_power_production') | int(0) ] | max }}

    - name: Grid Export Power
      state_class: measurement
      icon: mdi:transmission-tower
      unit_of_measurement: W
      device_class: power
      state: >
          {{ [0, states('sensor.envoy_SERIALNUMBER_current_power_production') | int(0) - states('sensor.envoy_SERIALNUMBER_current_power_consumption') | int(0) ] | max }}

Enfin pour :

sensor:
  - platform: integration
    name: Grid Import Energy
    source: sensor.grid_import_power
    unit_prefix: k
    unit_time: h
    method: left
    
  - platform: integration
    name: Grid Export Energy
    source: sensor.grid_export_power
    unit_prefix: k
    unit_time: h
    method: left

Celui-ci aussi est à l’ancien format, donc à intégrer dans sensor.yaml comme ça :

- platform: integration
  name: Grid Import Energy
  source: sensor.grid_import_power
  unit_prefix: k
  unit_time: h
  method: left
  
- platform: integration
  name: Grid Export Energy
  source: sensor.grid_export_power
  unit_prefix: k
  unit_time: h
  method: left

En gros tu peux retenir qu’il y a :

  • Un format legacy pour les sensors et binary_sensors.

    • à mettre dans sensor.yaml ou binary_sensor.yaml
    • Que ces formats peuvent utiliser différentes « platform », dont template, ce qui peut porter à confusion.
    • Perso je pense qu’il faut éviter ce format autant qu’on peut.
  • Un format « template », avec lequel on peut définir, des sensors et des binary_sensors.

    • à mettre dans template.yaml.
    • tout ça, sans notion de « platform ».
    • avec la notion de sate_class (ou pas d’ailleurs), mais qui peut te permettre de définir un sensor dont l’historique ira dans les stats à long terme.
    • ce format est à privilégier.

Maintenant pour les packages :

Dans la doc on a :

Les packages dans Home Assistant permettent de regrouper la configuration de différentes intégrations. Avec les packages, nous avons un moyen d'inclure différentes intégrations

Donc en gros, tu vas pouvoir y mettre un peu ce que tu veux, de l’ancien, du nouveau format, etc …

Mais pour chaque « intégration » il faudra préciser sa « nature ».

Exemples :

  • sensor.yaml avec l’include qui va bien dans configuration.yaml
code
### date

- platform: time_date
  display_options:
    - 'date'
  • template.yaml avec l’include qui va bien dans configuration.yaml
code
########################################
###              sensor              ###
########################################

- sensor:

### température ressentie

    - name: "Température Ressentie"
      unique_id: temperature_ressentie
      device_class: temperature
      state_class: measurement
      availability: >
        {% set element = state_attr('weather.saint_philbert_sur_boissey', 'wind_speed') %}
        {% if element is defined %}
        True
        {% else %}
        False
        {% endif %}         
      state: >
        {% set t = states('sensor.org_exterieur_temperature') | float(0) %}
        {% set v = state_attr('weather.saint_philbert_sur_boissey', 'wind_speed') | float(0) %}
        {% set h = states('sensor.org_exterieur_humidity') | float(0) %}
        {% if t <= 10 and v >= 5 %}  
          {{ (13.12 + (0.6215 * t) + (((0.3965 * t) - 11.37) * v**0.16)) | round (1) }}
        {% elif t<= 10 and v <5 %}
          {{ ( t + 0.2 * ( 0.1345 * t - 1.59 ) * v ) | round (1) }}
        {% elif t >= 27 and h >= 40 %}
          {{ ( -8.785 + 1.611*t + 2.339*h - 0.146*t*h - 1.231e-2*t**2 - 1.642e-2*h**2 + 2.212e-3*t**2*h + 7.255e-4*t*h**2 - 3.582e-6*t**2*h**2 ) | round (1) }}  
        {% else %}
          100
        {% endif %}
      icon: mdi:thermometer
      unit_of_measurement: "°C"

########################################
###          binary-sensor           ###
########################################

- binary_sensor:

### Présence Orage

    - name: "Orage"
      unique_id: orage
      state: "{{ states('sensor.blitzortung_lightning_counter') | int(default=0) >= 1 }}"
      icon: mdi:weather-lightning
      delay_off:
        minutes: 60

  • Mon package pour tout ce qui touche au chauffage :
code
#### template binary & sensor 

template:

## binary

  - binary_sensor:
      - name: maison_occupee
        unique_id: maison_occupee
        state: "{{is_state('device_tracker.iphoneseb', 'home') or is_state('device_tracker.iphoneln', 'home') or not is_state('alarm_control_panel.alarmo', 'armed_away')}}"
        device_class: occupancy
        delay_off: 00:10:00

      - name: opening_sejour
        unique_id: opening_sejour 
        state: >
          {{
             is_state('binary_sensor.drs_cuisine', 'on') or
             is_state('binary_sensor.drs_entree', 'on') or
             is_state('binary_sensor.drs_salle', 'on') or
             is_state('binary_sensor.drs_salon', 'on')  
          }}
        device_class: opening

      - name: vacances_absent
        unique_id: vacances_abs
        state: >
          {% set start_period = states('input_text.absence_start') | as_timestamp(0) %}
          {% set end_period = states('input_text.absence_end') | as_timestamp(0) %}
          {% set current_date = now().timestamp() %}
          {{ start_period <= current_date <= end_period }}
        icon: mdi:home-export-outline

      - name: vacances_present
        unique_id: vacances_pres
        state: >
          {% set start_period = states('input_text.vacances_start') | as_timestamp(0) %}
          {% set end_period = states('input_text.vacances_end') | as_timestamp(0) %}
          {% set current_date = now().timestamp() %}
          {{ start_period <= current_date <= end_period }}
        icon: mdi:home-import-outline

## sensor

  - sensor:

      - name: "Heating Consumption"
        unique_id: heating_consumption
        state: >
          {{
          states('sensor.radiateur_bureau_energy') | float(default=0) +  
          states('sensor.radiateur_ch_charlotte_energy') | float(default=0) +
          states('sensor.radiateur_ch_maxime_energy') | float(default=0) +
          states('sensor.radiateur_ch_parents_energy') | float(default=0) +  
          states('sensor.radiateur_couloir_eta_energy') | float(default=0) +
          states('sensor.radiateur_couloir_rdc_energy') | float(default=0) +
          states('sensor.radiateur_cuisine_energy') | float(default=0) +
          states('sensor.radiateur_salle_energy') | float(default=0) +
          states('sensor.radiateur_salon_energy') | float(default=0) +
          states('sensor.radiateur_sdb_eta_energy') | float(default=0) +
          states('sensor.radiateur_sdb_rdc_energy') | float(default=0)           
          }}
        state_class: total_increasing
        unit_of_measurement: kWh
        device_class: energy


#### Utility Meter

utility_meter:

# daily

  radiateur_bureau_daily:
    unique_id: rad_bureau_d
    source: sensor.radiateur_bureau_energy
    cycle: daily
  radiateur_ch_charlotte_daily:
    unique_id: rad_ch_charlotte_d
    source: sensor.radiateur_ch_charlotte_energy
    cycle: daily
  radiateur_ch_maxime_daily:
    unique_id: rad_ch_maxime_d
    source: sensor.radiateur_ch_maxime_energy
    cycle: daily
  radiateur_ch_parents_daily:
    unique_id: rad_ch_parents_d
    source: sensor.radiateur_ch_parents_energy
    cycle: daily
  radiateur_couloir_eta_daily:
    unique_id: rad_couloir_eta_d
    source: sensor.radiateur_couloir_eta_energy
    cycle: daily
  radiateur_couloir_rdc_daily:
    unique_id: rad_couloir_rdc_d
    source: sensor.radiateur_couloir_rdc_energy
    cycle: daily    
  radiateur_cuisine_daily:
    unique_id: rad_cuisine_d
    source: sensor.radiateur_cuisine_energy
    cycle: daily    
  radiateur_salle_daily:
    unique_id: rad_salle_d
    source: sensor.radiateur_salle_energy
    cycle: daily
  radiateur_salon_daily:
    unique_id: rad_salon_d
    source: sensor.radiateur_salon_energy
    cycle: daily            
  radiateur_sdb_eta_daily:
    unique_id: rad_sdb_eta_d
    source: sensor.radiateur_sdb_eta_energy
    cycle: daily                      
  radiateur_sdb_rdc_daily:
    unique_id: rad_sdb_rdc_d
    source: sensor.radiateur_sdb_rdc_energy
    cycle: daily

# weekly

  radiateur_bureau_weekly:
    unique_id: rad_bureau_w
    source: sensor.radiateur_bureau_energy
    cycle: weekly
  radiateur_ch_charlotte_weekly:
    unique_id: rad_ch_charlotte_w
    source: sensor.radiateur_ch_charlotte_energy
    cycle: weekly
  radiateur_ch_maxime_weekly:
    unique_id: rad_ch_maxime_w
    source: sensor.radiateur_ch_maxime_energy
    cycle: weekly
  radiateur_ch_parents_weekly:
    unique_id: rad_ch_parents_w
    source: sensor.radiateur_ch_parents_energy
    cycle: weekly
  radiateur_couloir_eta_weekly:
    unique_id: rad_couloir_eta_w
    source: sensor.radiateur_couloir_eta_energy
    cycle: weekly
  radiateur_couloir_rdc_weekly:
    unique_id: rad_couloir_rdc_w
    source: sensor.radiateur_couloir_rdc_energy
    cycle: weekly
  radiateur_cuisine_weekly:
    unique_id: rad_cuisine_w
    source: sensor.radiateur_cuisine_energy
    cycle: weekly
  radiateur_salle_weekly:
    unique_id: rad_salle_w
    source: sensor.radiateur_salle_energy
    cycle: weekly
  radiateur_salon_weekly:
    unique_id: rad_salon_w
    source: sensor.radiateur_salon_energy
    cycle: weekly                
  radiateur_sdb_eta_weekly:
    unique_id: rad_sdb_eta_w
    source: sensor.radiateur_sdb_eta_energy
    cycle: weekly                      
  radiateur_sdb_rdc_weekly:
    unique_id: rad_sdb_rdc_w
    source: sensor.radiateur_sdb_rdc_energy
    cycle: weekly

# Monthly

  radiateur_bureau_monthly:
    unique_id: rad_bureau_m
    source: sensor.radiateur_bureau_energy
    cycle: monthly
  radiateur_ch_charlotte_monthly:
    unique_id: rad_ch_charlotte_m
    source: sensor.radiateur_ch_charlotte_energy
    cycle: monthly
  radiateur_ch_maxime_monthly:
    unique_id: rad_ch_maxime_m
    source: sensor.radiateur_ch_maxime_energy
    cycle: monthly
  radiateur_ch_parents_monthly:
    unique_id: rad_ch_parents_m
    source: sensor.radiateur_ch_parents_energy
    cycle: monthly
  radiateur_couloir_eta_monthly:
    unique_id: rad_couloir_eta_m
    source: sensor.radiateur_couloir_eta_energy
    cycle: monthly
  radiateur_couloir_rdc_monthly:
    unique_id: rad_couloir_rdc_m
    source: sensor.radiateur_couloir_rdc_energy
    cycle: monthly
  radiateur_cuisine_monthly:
    unique_id: rad_cuisine_m
    source: sensor.radiateur_cuisine_energy
    cycle: monthly
  radiateur_salle_monthly:
    unique_id: rad_salle_m
    source: sensor.radiateur_salle_energy
    cycle: monthly
  radiateur_salon_monthly:
    unique_id: rad_salon_m
    source: sensor.radiateur_salon_energy
    cycle: monthly               
  radiateur_sdb_eta_monthly:
    unique_id: rad_sdb_eta_m
    source: sensor.radiateur_sdb_eta_energy
    cycle: monthly                      
  radiateur_sdb_rdc_monthly:
    unique_id: rad_sdb_rdc_m
    source: sensor.radiateur_sdb_rdc_energy
    cycle: monthly

# yearly

  radiateur_bureau_yearly:
    unique_id: rad_bureau_y
    source: sensor.radiateur_bureau_energy
    cycle: yearly
  radiateur_ch_charlotte_yearly:
    unique_id: rad_ch_charlotte_y
    source: sensor.radiateur_ch_charlotte_energy
    cycle: yearly
  radiateur_ch_maxime_yearly:
    unique_id: rad_ch_maxime_y
    source: sensor.radiateur_ch_maxime_energy
    cycle: yearly
  radiateur_ch_parents_yearly:
    unique_id: rad_ch_parents_y
    source: sensor.radiateur_ch_parents_energy
    cycle: yearly
  radiateur_couloir_eta_yearly:
    unique_id: rad_couloir_eta_y
    source: sensor.radiateur_couloir_eta_energy
    cycle: yearly
  radiateur_couloir_rdc_yearly:
    unique_id: rad_couloir_rdc_y
    source: sensor.radiateur_couloir_rdc_energy
    cycle: yearly
  radiateur_cuisine_yearly:
    unique_id: rad_cuisine_y
    source: sensor.radiateur_cuisine_energy
    cycle: yearly
  radiateur_salle_yearly:
    unique_id: rad_salle_y
    source: sensor.radiateur_salle_energy
    cycle: yearly
  radiateur_salon_yearly:
    unique_id: rad_salon_y
    source: sensor.radiateur_salon_energy
    cycle: yearly                
  radiateur_sdb_eta_yearly:
    unique_id: rad_sdb_eta_y
    source: sensor.radiateur_sdb_eta_energy
    cycle: yearly                      
  radiateur_sdb_rdc_yearly:
    unique_id: rad_sdb_rdc_y
    source: sensor.radiateur_sdb_rdc_energy
    cycle: yearly      

#### Switch

switch:
  - platform: template
    switches:

# BUREAU

      radiateur_bureau:
        friendly_name: "Switch Radiateur Bureau"
        unique_id: sw_rad_bureau
        value_template: "{{ is_state('select.radiateur_bureau_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_bureau_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_bureau_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_bureau_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"

# CHAMBRE CHARLOTTE

      radiateur_ch_charlotte:
        friendly_name: "Switch Radiateur Ch Charlotte"
        unique_id: sw_rad_ch_charlotte
        value_template: "{{ is_state('select.radiateur_ch_charlotte_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_ch_charlotte_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_ch_charlotte_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_ch_charlotte_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"

# CHAMBRE MAXIME

      radiateur_ch_maxime:
        friendly_name: "Switch Radiateur Ch Maxime"
        unique_id: sw_rad_ch_maxime
        value_template: "{{ is_state('select.radiateur_ch_maxime_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_ch_maxime_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_ch_maxime_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_ch_maxime_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"

# CHAMBRE PARENTS

      radiateur_ch_parents:
        friendly_name: "Switch Radiateur Ch Parents"
        unique_id: sw_rad_ch_parents
        value_template: "{{ is_state('select.radiateur_ch_parents_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_ch_parents_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_ch_parents_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_ch_parents_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"

# COULOIR ÉTAGE

      radiateur_couloir_eta:
        friendly_name: "Switch Radiateur Couloir Éta"
        unique_id: sw_rad_couloir_eta
        value_template: "{{ is_state('select.radiateur_couloir_eta_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_couloir_eta_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_couloir_eta_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_couloir_eta_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"

# COULOIR RDC

      radiateur_couloir_rdc:
        friendly_name: "Switch Radiateur Couloir Rdc"
        unique_id: sw_rad_couloir_rdc
        value_template: "{{ is_state('select.radiateur_couloir_rdc_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_couloir_rdc_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_couloir_rdc_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_couloir_rdc_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"

# CUISINE

      radiateur_cuisine:
        friendly_name: "Switch Radiateur Cuisine"
        unique_id: sw_rad_cuisine
        value_template: "{{ is_state('select.radiateur_cuisine_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_cuisine_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_cuisine_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_cuisine_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"

# SALLE

      radiateur_salle:
        friendly_name: "Switch Radiateur Salle"
        unique_id: sw_rad_salle
        value_template: "{{ is_state('select.radiateur_salle_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_salle_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_salle_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_salle_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"

# SALON

      radiateur_salon:
        friendly_name: "Switch Radiateur Salon"
        unique_id: sw_rad_salon
        value_template: "{{ is_state('select.radiateur_salon_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_salon_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_salon_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_salon_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"        

# SDB ÉTAGE

      radiateur_sdb_eta:
        friendly_name: "Switch Radiateur Sdb Éta"
        unique_id: sw_rad_sdb_eta
        value_template: "{{ is_state('select.radiateur_sdb_eta_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_sdb_eta_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_sdb_eta_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_sdb_eta_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"        

# SDB RDC

      radiateur_sdb_rdc:
        friendly_name: "Switch Radiateur Sdb Rdc"
        unique_id: sw_rad_sdb_rdc
        value_template: "{{ is_state('select.radiateur_sdb_rdc_pilot_wire_mode', 'comfort') }}"
        turn_on:
          service: select.select_option
          data:
            option: comfort
          target:
            entity_id:
              - select.radiateur_sdb_rdc_pilot_wire_mode
        turn_off:
          service: select.select_option
          data:
            option: "off"
          target:
            entity_id:
              - select.radiateur_sdb_rdc_pilot_wire_mode
        icon_template: "{% if is_state('select.radiateur_sdb_rdc_pilot_wire_mode', 'off') %}mdi:radiator-disabled{% else %}mdi:radiator{% endif %}"        

3 « J'aime »

Merci beaucoup @Herbs

pour ton temps et ta patience.

Je confirme oui. Je me rends bien compte que je me suis lancé dans Home assistant, j’ai fait tourner des choses avec Node-Red, mais il faut bien avouer que la programmation de HA, je suis à coté de la plaque :sweat_smile:

Tout d’abord, j’ai plus d’erreur de chargement de la configuration en suivant tes réponses. Merci beaucoup.

Je vais tenter de résumer voir si j’ai compris au moins en partie tes explications :slightly_smiling_face:

Les intégrations: on parle de ce que l’on installe comme LocalTuya par exemple?

Actuellement, mon arborescence packages, ne contient que la définition d’input (input_number, input_boolean,input_datetime…). Je les retrouve tous dans la page entrées de HA. Si je comprends, se ne sont que des définitions de commandes me permettant de réaliser des actions depuis un tableau de bord, par exemple.

Si je veux créer une entité qui s’historisera et fournira une valeur, je dois la créer dans mon fichier sensor.yaml?

Nouveau fichier sensor.yaml
- platform: template
  sensors:
    sunelevation:
      friendly_name: "elevation soleil"
      value_template: "{{ state_attr('sun.sun', 'elevation') }}"
    #on indique que la valeur de cette entité sera égale à la valeur de l'attribut elevation de l'entité sun.sun
    sunazimuth:
      friendly_name: "azimut soleil"
      value_template: "{{ state_attr('sun.sun', 'azimuth') }}"
#on indique que la valeur de cette entité sera égale à la valeur de l'attribut azimuth de l'entité sun.sun

- platform: integration
  name: Grid Import Energy
  source: sensor.grid_import_power
  unit_prefix: k
  unit_time: h
  method: left

- platform: integration
  name: Grid Export Energy
  source: sensor.grid_export_power
  unit_prefix: k
  unit_time: h
  method: left

Toujours si j’ai compris, la première partie de ce fichier est sur l’ancienne méthode d’écriture et la fin sur la nouvelle.
Si je voulais modifier la première partie du fichier dans la nouvelle syntaxe, je devrais écrire:

Nouvelle syntaxe
- platform: template
  name: sunelevation
  friendly_name: "elevation soleil"
  value_template: "{{ state_attr('sun.sun', 'elevation') }}"
    #on indique que la valeur de cette entité sera égale à la valeur de l'attribut elevation de l'entité sun.sun

- platform: template
  name: sunazimuth
  friendly_name: "azimut soleil"
  value_template: "{{ state_attr('sun.sun', 'azimuth') }}"
#on indique que la valeur de cette entité sera égale à la valeur de l'attribut azimuth de l'entité sun.sun

j’ai bon?

J’avoue que là tu m’as perdu. Que représente cette clé platform? Puis-je retrouver ses valeurs quelque part dans HA? Tu préconises de ne plus l’utilisé. Dans ce cas:

- platform: integration
  name: Grid Import Energy
  source: sensor.grid_import_power
  unit_prefix: k
  unit_time: h
  method: left

deviendrait… (bah j’ai tenté une conversion et bloqué):
Au vu des paramètres on crée une entrée Rieuman
Je comprends pas comment HA sait avec ces valeurs que je crée une entrée Rieumen?? (j’avoue que l’ancienne syntaxe je ne vois pas non plus)

J’ai tenté ça mais je ne sais pas ce que je dois faire des clés unit_prefix et les suivantes :sob::

- name: Grid Import Energy
  state: {{ sensor.grid_import_power }}
  unit_prefix: k
  unit_time: h
  method: left

J’en déduis donc qu’il y a des cas on l’on ne peut que garder l’ancienne syntaxe.

Ca, c’était l’exemple. Plus généralement:

Sensor/binary_sensor: c’est la description d’une entité qui renverra une valeur qui sera historisée. On les verra apparaître dans HA sur la page des entités?

Template\sensor: C’est un autre moyen de décrire un sensor d’entité? J’ai bon?

Cela veux dire que dans mon arborescence packages, je ne peux pas créer de sensor seulement des commandes utilisable sur le dashboard par exemple?

Ce qui est appelé modèle en fin de compte ce n’ai que la description d’une nouvelle entité? c’est bien ça?

Désolé cela fait beaucoup de question sans réponse. Ai-je au moins certaine notion juste dans tout cela?

Vraiment merci à la communauté d’exister

Désolé, j’ai encore ajouté un peu de confusion avec cette phrase :stuck_out_tongue:

Non en fait, je voulais dire que dans un fichier package, il faut préciser le type chaque élément.

Si tu regardes l’exemple de mon package, tu verras :

template:

## binary

  - binary_sensor:
      blablablabla
  - sensor:
      blablablabla

utility_meter::
    blablablabla
    blablablabla
    blablablabla

switch:
  - platform: template
    switches:

      blablablabla
      blablablabla
      blablablabla

Donc, tu commences chaque bloc par son « type » (template, utility_meter, switch).

Alors que si tu fais par exemple un fichier dédié aux utility_meter, il te faudra l’include qui va bien dans configuration.yaml, comme ça :

utility_meter: !include utility_meter.yaml

Et tu remplis le fichier directement sans répéter le type :

### utility meter compteur eau

compteur_eau_daily:
  unique_id: compteur_eau_d
  source: sensor.compteur_eau_total
  cycle: daily

Alors oui et non ^^ Dans HA, on a 2 types d’historisation :

  • court terme, peu importe le type d’entité, suffit juste que ce soit pris en compte par le recorder.
  • long terme, pareil, mais il faut que l’entité dispose d’un « state_class ». Et si c’est un sensor que tu définis toi-même, tu ne peux le faire qu’en le déclarant avec le nouveau format « template ».

Je dirai que oui.

Non, dans un package, tu mets ce que tu veux, du moment que tu respectes la syntaxe.

Désolé si je t’embrouille, la pédagogie, ce n’est pas forcément ma meilleure qualité :smiley: !!!

Sans compter que je ne suis pas à l’abri de faire quelques raccourcis :stuck_out_tongue:

Bonjour Herbs,

Non au contraire, je trouve que les notions sont complexes et il n’est pas facile d’y entrée d’autan qu’une bascule s’oppère en ce moment sur la syntaxe. Tu prends le temps avec des exemples, je trouve ça super même si je suis long à comprendre.

Je dois partir encadrer des enfants aujourd’hui. Je lirai tes explications en rentrant ou demain matin tranquillement pour comprendre.

En attendant merci et si tu es d’accord je continuerai à te demander d’éclairer ma lanterne

Re,

après une bonne nuit, j’ai repris mon apprentissage et certaine chose semble s’éclaircirent:

Pour ‹ switch ›, je comprends que c’est ‹ interrupteur › sur la page des entrées. Sa description se trouve ici:

Pour être à la dernière monture de syntaxe, j’ai 2 solutions:

  1. Fichier dédié à tous mes switchs:

Ajout de la ligne suivante au fichier configuration.yaml

switch: !include switch.yaml

Création d’un fichier switch.yaml à la racine de mon répertoire /config. Ce dernier portant le nom du type d’intégration qu’il va contenir, il ne faut pas le répéter dans le fichier.

ce qui donnerai:

skylight:  #friendly_name
    value_template: "{{ is_state('sensor.skylight', 'on') }}"
    turn_on:
      service: switch.turn_on
      target:
        entity_id: switch.skylight_open
    turn_off:
      service: switch.turn_off
      target:
        entity_id: switch.skylight_close

Le bloc peut-être répété en changeant le ‹ friendly_name › à chaque nouvel interrupteur devant être créé.

  1. L’utilisation de packages

Un fichier ‹ packages › pouvant contenir plusieurs type d’objet, il faut impérativement repréciser le type d’objet qui sont décrit:

Ajout des lignes suivantes au fichier configuration.yaml

homeassistant:
  packages: !include_dir_named configuration/

Création d’un répertoire ‹ configuration › à la racine de /config. Ce répertoire peut contenir toute une arborescence de répertoires/fichiers. Chaque fichier pouvant contenir différent type d’objet.
C’est pourquoi avant de décrire l’objet à preprement parlé il faut préciser son type.

switch:  # Le type dentité
  - platform: template
    switches:
      skylight:
        value_template: "{{ is_state('sensor.skylight', 'on') }}"
        turn_on:
          service: switch.turn_on
          target:
            entity_id: switch.skylight_open
        turn_off:
          service: switch.turn_off
          target:
            entity_id: switch.skylight_close

      skylight_2:
        value_template: xxxxxx
        turn_on:
          service: switch.turn_on
          target:
            entity_id: switch.skylight_open
        turn_off:
          service: switch.turn_off
          target:
            entity_id: switch.skylight_close

Jusque là ma compréhension est-elle bonne?

Maintenant mes questions:
Tout d’abord dans l’exemple juste au dessus, on inscrit la ligne:

- platform: template

A quoi correspond-t-elle exactement? Est-ce pour préciser que tu veux créer une ‹ entrée › dans l’UI de HA?

Et quand tu commences par template, c’est pour décrire l’un des objet de la page:

Ceux sont les objet de la page ‹ Entités › de l’UI de HA?

Dans les possibilités de cet objet on peut déclarer un switch (la page proposée pour sa configuration est la même que précédemment).

Du coup ma question: Quelle différence cela fait-il de déclarer

template:
  - switch
       blablabla

plutôt que:

switch:
  - platform: template
    switches:

      blablablabla

Pour ‹ utility_meter ›, je dois utiliser le § ‹ YAML configuration › de la page:

pour le configurer.

Pour la parte historisation, j’ai regarder la page ‹ utility_meter › je n’ai pas trouvé de référence à « state_class » j’en déduit donc que l’objet ne peut être historisé à long terme. C’est cela?
C’est pareil pour switch?

J’espère avoir compris.

Merci pour tes retours

Salut,
oui.

Pour les templates, il y a un nouveau format pour les sensors. Mais pas pour les reste.

Sensor template (nouveau format) :

template:
  - sensor:
      - name: "Average temperature"
        unit_of_measurement: "°C"
        state: >
          {% set bedroom = states('sensor.bedroom_temperature') | float %}
          {% set kitchen = states('sensor.kitchen_temperature') | float %}
          {{ ((bedroom + kitchen) / 2) | round(1, default=0) }}

Sensor template (ancien format):

sensor:
  - platform: template
    sensors:
      solar_angle:
        friendly_name: "Sun angle"
        unit_of_measurement: "degrees"
        value_template: "{{ state_attr('sun.sun', 'elevation') }}"

Pour un switch template:

switch:
  - platform: template
    switches:
      skylight:
        value_template: "{{ is_state('sensor.skylight', 'on') }}"
        turn_on:
          service: switch.turn_on
          target:
            entity_id: switch.skylight_open
        turn_off:
          service: switch.turn_off
          target:
            entity_id: switch.skylight_close
1 « J'aime »

Salut @alexb81

Elle sert à spécifier que l’état de ton élément « switch » sera basé sur une ou plusieurs template.

Pas certain d’avoir saisi :wink: , mais dans l’absolu quoi que tu déclares comme élément et peu importe la façon, tu dois retrouver l’entité correspondante dans la page que tu cites.

Sauf erreur de ma part, l’un est possible (le premier), l’autre ne fonctionnera tout simplement pas.

Tu peux, mais tu peux aussi le créer an allant à :

« Paramètres \ Appareil et services », onglet « entrées » / « + créer une entrée » et sélectionner : « Compteur de services publics ».

A priori c’est bien ça :wink:

Messieurs merci,

Grace à vos explications, j’ai pu comprendre plein de chose et même transformer certaines parties de mes fichiers de l’ancienne à la nouvelle syntaxe et tout stocker dans des fichiers package.

Je dois avouer néanmoins que je rencontre quand même in souci de transformation. C’est toujours cet objet ‹ template › vs ‹ sensor ›

j’ai dans un fichier sensor.yaml

- platform: template
  sensors:
    sunelevation:
      friendly_name: "elevation soleil"
      value_template: "{{ state_attr('sun.sun', 'elevation') }}"
    #on indique que la valeur de cette entité sera égale à la valeur de l'attribut elevation de l'entité sun.sun
    sunazimuth:
      friendly_name: "azimut soleil"
      value_template: "{{ state_attr('sun.sun', 'azimuth') }}"

J’ai tenté de le déplacer dans un fichier de mon arborescence ‹ Packages › comme cela:

template:
  - sensor:
      - sunelevation:
          name: "elevation soleil"
          state: "{{ state_attr('sun.sun', 'elevation') }}"
        #on indique que la valeur de cette entité sera égale à la valeur de l'attribut elevation de l'entité sun.sun
      - sunazimuth:
          name: "azimut soleil"
          state: "{{ state_attr('sun.sun', 'azimuth') }}"

Quand je teste, je n’ai pas d’erreur mais mes entités ont disparues. Qu’est-ce que j’ai loupé?

Salut,
mauvaise indexion du template.

exemple:

template:
  - sensor:
      - name: "Average temperature"
        unit_of_measurement: "°C"
        state: >
          {% set bedroom = states('sensor.bedroom_temperature') | float %}
          {% set kitchen = states('sensor.kitchen_temperature') | float %}
          {{ ((bedroom + kitchen) / 2) | round(1, default=0) }}

      - name: "Webhook Temperature"
        state: "{{ trigger.json.temperature }}"
        unit_of_measurement: °C

Effectivement, j’ai vu ça entre temps en revanche avant je les trouvais sous le nom ‹ sunelevation › et ‹ sunazimuth › et maintenant sous '« elevation soleil »

on perd la différence entre le nom du sensor et le friendly_name. Ou il y a moyen de retrouver les 2 valeurs?

Faut ajouter unique_id, qui correspond a ton sunelevation sous l’ancien format.
le friendly name est devenu name sous le nouveau format.

template:
  - sensor:
      - name: "elevation soleil"  #le friendly name
        unique_id: sunelevation
1 « J'aime »

Merci pour ce retour,

j’ai testé de rajouter unique_id: mais malgré cela dans la liste de mes entités, j’ai toujours ‹ elevation soleil ›.
Ce n’est pas très grave, j’en ai que 2 mais je vais être vigilent pour les autres.

Je vous remercie encore pour toutes vos explications et votre temps.