Création d'un calcul simple entre deux entités

Mon problème

Bonjour,

Après avoir perdu les quelques cheveux qu’il me reste, je vais m’adresser à vous :grinning:
Je débute, donc soyez indulgent si je dis des bêtises … :

J’ai installé HA sans (trop) de problèmes sur un Synology (en VM), j’ai pu installer quelques services dont la connexion Modbus avec l’onduleur de mes panneaux solaires.
Maintenant je tente de faire quelques calculs, un peu comme dans ce tuto :

SolarEdge local connection to home assistant

Pour essayer de partir proprement, j’aimerais mettre mes « sensors » dans un fichier déporté sensors.yaml.
J’ai donc créé un entrée :

sensor: !include sensors.yaml

et un fichier sensors.yaml

pour valider que mon fichier fonctionne, j’ai collé ce code (trouvé dans un autre tuto) :

  - platform: systemmonitor
    resources:
      - type: disk_use_percent
        arg: /home
      - type: memory_use_percent
      - type: swap_use_percent
      - type: processor_use
      - type: last_boot

et ça fonctionne, mais si je rajoute (ou simplement remplace dans le sensors.yaml) par le code qui vient de mon tuto SolarEdge qui ne fait que passer la production de W en KW :

  - sensor:
      - name: "SE - Generation"
        unit_of_measurement: "kW"
        state_class: total_increasing
        device_class: "energy"
        state: '{{ (states("sensor.solaredge_ac_power") | float) / 1000}}'

quand je teste le fichier, j’ai cette erreur :

Configuration non valide !
Invalid config for [sensor]: required key not provided @ data[‹ platform ›]. Got None. (See /config/configuration.yaml, line 11).

J’ai bien tenté de me mettre (entre autre !) :

template :

Mais rien n’y fait, une idée de la c*** que je fait ?

Le contenu de mon sensors.yaml

  - platform: systemmonitor
    resources:
      - type: disk_use_percent
        arg: /home
      - type: memory_use_percent
      - type: swap_use_percent
      - type: processor_use
      - type: last_boot
      
  - sensor:
    - name: "SE - Generation"
      unit_of_measurement: "kW"
      state_class: total_increasing
      device_class: "energy"
      state: '{{ (states("sensor.solaredge_ac_power") | float) / 1000}}'

Ma configuration


System Information

version core-2023.9.2
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.11.5
os_name Linux
os_version 6.1.45
arch x86_64
timezone Europe/Zurich
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 4974
Installed Version 1.32.1
Stage running
Available Repositories 1283
Downloaded Repositories 3
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.5
update_channel stable
supervisor_version supervisor-2023.09.2
agent_version 1.5.1
docker_version 23.0.6
disk_total 30.8 GB
disk_used 3.9 GB
healthy true
supported true
board ova
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.7.1), File editor (5.6.0)
Dashboards
dashboards 1
resources 0
views 1
mode storage
Recorder
oldest_recorder_run 15 septembre 2023 à 12:53
current_recorder_run 18 septembre 2023 à 20:39
estimated_db_size 53.04 MiB
database_engine sqlite
database_version 3.41.2
___

Salut @wd_newbie

Alors tu as 2 choses différentes, donc dans configuration il te faut ça ;

sensor: !include sensors.yaml
template: !include template.yaml

Bref 2 fichiers différents.

Dans le premier fichier tu mets le code de « systemmonitor », et dans le second celui de ton sensor « SE - Generation ».

Ensuite tu peux aller jeter un oeil à cette doc :

Après lecture tu verras qu’il existe un nouveau format pour déclarer des sensors ou des binary_sensors, et un format « legacy » :wink:

« system monitor » reste sous l’ancien format (on va dire), alors que le code de « SE- Generation » passe sous le nouveau.

Bonjour, @wd_newbie
Et dans ton fichier sensor.yaml
ne met pas

car tout ce qui est de dans est sensor !

L’erreur te dit qu’il manque la clé ‹ platform › dans ta conf.

1 « J'aime »

Pour moi la confusion vient du tuto qui à mon sens n’est pas correct :

  • Exemple dans la capture suivante où l’on voit plusieurs fois la clé « - sensor » se répéter plusieurs fois (pas obligatoire). Et vu l’indentation il manque le « début ».


Ensuite, si il s’agissait d’un « sensor » de type « legacy » il manquerait bien la « platform » et dans sensor.yaml ça donnerait :

- platform: template
  sensors:
    se_generation:
      friendly_name: "SE - Generation"
      unit_of_measurement: "kW"
      device_class: "energy"
      value_template: '{{ (states("sensor.solaredge_ac_power") | float) / 1000}}'

Mais vu la capture, le code fourni, et la présence de la clé « state_class », pour moi l’idée de base du tuto était de créer des « sensor template » (nouveau format).

image

Bref si on reprend le code fourni par l’auteur du tuto, on devrait avoir :

  • dans configuration.yaml
sensor: !include sensor.yaml
template: !include template.yaml
  • dans sensor.yaml :
- platform: systemmonitor
  resources:
    - type: disk_use_percent
      arg: /home
    - type: memory_use_percent
    - type: swap_use_percent
    - type: processor_use
    - type: last_boot   
  • dans template.yaml :
- sensor:
    - name: "Solar Positive"
      state: >
        {% if (states("sensor.se_generation") | float > states("sensor.se_consumption") | float) %}
          yes
        {% else %}
          no
        {% endif %}

    - name: "SE - Consumption"
      unit_of_measurement: "kW"
      state_class: total_increasing
      device_class: "energy"
      state: '{{ (states("sensor.solaredge_ac_power") |float - states("sensor.solaredge_m1_ac_power_a") | float) / 1000 }}'

    - name: "SE - Export/Import"
      unit_of_measurement: "kW"
      state_class: total_increasing
      device_class: "energy"
      state: '{{ (states("sensor.solaredge_m1_ac_power_a") | float) / 1000}}'

    - name: "SE - Generation"
      unit_of_measurement: "kW"
      state_class: total_increasing
      device_class: "energy"
      state: '{{ (states("sensor.solaredge_ac_power") | float) / 1000}}'

Évidemment vu qu’on utilise des « include » , ne pas multiplier les clé « sensor » ou « template » dans configuration.yaml

Salut,
tout a fait, l’auteur aime les - sensor: qui ne servent a rien vu qu’un seul - sensor: est obligatoire.
J’aurais penser que ca mettrais une erreur, mais ca pas l’air :stuck_out_tongue:

Il y a même un exemple dans la doc:

Je suis quasi certain que si :wink:

Après rien n’empêche d’écrire n’imp sous vscode pour faire un screen, avant de sauvegarder, de restart HA et de « manger » l’erreur :smiley: !!!

[EDIT] je vais quand même tester pour voir :wink:
[EDIT-2] Bon ça passe, mais je confirme c’est bien des sensors nouveau format.

1 « J'aime »

c’est parfait j’ai pu créer mes calculs.

Merci pour tout

1 « J'aime »

Bonjour,
je suis un newbie sur HA et je voudrai faire un calcul
entre mon tarif tempo du jour et ma conso du jour
j’ai tenté avec ce code la :

{% set tempo = states('sensor.rte_tempo_couleur_actuelle')%} 
{% set hc = states('binary_sensor.rte_tempo_heures_creuses')%} 
    {% if tempo == 'Bleu' %} 
      {% if hc == 'on' %} 
      {{states('input_number.tarif_hc_bleu')}} * {{states('sensor.ecojoko_consommation_hc_bleu_reseau', rounded=False, with_unit=False)}}
      {% elif hc =='off' %}
      {{states('input_number.tarif_hp_bleu')}} * {{states('sensor.ecojoko_consommation_hp_bleu_reseau', rounded=False, with_unit=False)}}
      {%endif %}
    {% elif tempo =='Blanc' %}
      {% if hc == 'on' %}
      {{states('input_number.tarif_hc_blanc')}} * {{states('sensor.ecojoko_consommation_hc_blanc_reseau', rounded=False, with_unit=False)}}
      {% elif hc =='off' %}
      {{states('input_number.tarif_hp_blanc')}} * {{states('sensor.ecojoko_consommation_hp_blanc_reseau', rounded=False, with_unit=False)}}
      {%endif %}
    {% elif tempo =='Rouge' %} 
      {% if hc == 'on' %}
      {{states('input_number.tarif_hc_rouge')}} * {{states('sensor.ecojoko_consommation_hc_rouge_reseau', rounded=False, with_unit=False)}}
      {% elif hc =='off' %}
      {{states('input_number.tarif_hp_rouge')}} * {{states('sensor.ecojoko_consommation_hp_rouge_reseau', rounded=False, with_unit=False)}}
      {%endif %}
    {% else %} 
    
      Indeterminé 
      
    {%endif %}

Mais cela ne marche pas !

est ce qq pourrai me dire ce qu’il va pas !
merci pour vos retour

Hello,

je ne sais pas si ça peut aider, mais j’ai utilisé ce template pour calculer le prix du kWh selon le jour et l’heure

    - name: "Prix du Kwh"
      unit_of_measurement: "CHF/kWh"
      unique_id: 'prix_kwh_bleu'
      state_class: 'measurement'
      state: >
          {% set prix_hp  = 0.3363 %}
          {% set prix_hc  = 0.223 %}
          {{ prix_hp if (now().hour >= 6 and now().hour <22 and now().weekday()<5 )  else prix_hc}}  
1 « J'aime »

Les states qui donnent des nombres doivent être transformés en float pour pouvoir des opérations dessus.
Exemple :

states('input_number.tarif_hc_bleu') | float(0)

Après tu as un testeur de template dans Outils de dev / Modèle. Ca sert exactement à debugger ton template.

1 « J'aime »