Calcul entre deux variables issues d'un module dsmr

Bonjour

Encore merci à @TheD6Bel pour son module et son aide.

Mon problème

J’essaye de trouver la méthode pour calculer une troisième valeur à partir de deux valeurs issues du dsmr

J’ai trouvé un code qui pourrait le faire. Je l’ai transformé, mais sans aucune connaissance de yaml ma part. Mais je découvre à fur et à mesure de mes lectures ici.

J’ai une erreur’ ici: service: input_number.set_value

Comment peut-on corriger cela, où cela se place-t-il, dans le fichier dsmr.yaml ou autre part ?

une des valeurs : energy_delivered_tariff1
deuxième valeur: energy_delivered_tariff2
service: input_number.set_value
data:
  value: >-
    {{states('energy_delivered_tariff1')|int(0) +
    states('energy_delivered_tariff2')|int(0)}}
target:
  entity_id: energy_delivered

Bonjour,

Je te conseille d’utiliser Outils de développement + l’onglet modèle pour coder ton Yaml par exemple, tu y mets ton calcul pour voir le résultat qu’il renvoie :
{{states(‹ energy_delivered_tariff1 ›)|int(0) +
states(‹ energy_delivered_tariff2 ›)|int(0)}}"

ça dans un premier temps puis quand ton yaml (le cacul) est bon tu peux aller dans paramètres > appareils et services > Entrées et créer une entrée de type template (comme c’est une valeur je mettrais modéliser un capteur) et y mettre ton calcul/yaml, après tu pourrras découvrir toutes les possibilités.

Bonjour et merci pour ce début de piste.

Bon, je m’en doutais un peu, pas de sortie à mon calcul, il manque sûrement la gestion des deux valeurs d’entrées (venant du module dsmr).

Je cherche, je cherche

Mes premiers essais ne fonctionnent pas

{% set dsmrp = {
« edt1 »: sensor.dsmr_reader_energy_delivered_tariff_1,
« edt2 »: sensor.dsmr_reader_energy_delivered_tariff_2
} %}

{{states(dsmrp.edt1)|int(0) + states(dsmrp.edt2)|int(0)}}

sensor is undefined , déclaration de variable manquante, je suppose ?

Salut,

Basé sur les différents posts ci-dessus, le plus simple serait de faire ça:

{{states('sensor.dsmr_reader_energy_delivered_tariff_1')|int(0) +
  states('sensor.dsmr_reader_energy_delivered_tariff_2')|int(0)}}

Mais ça c’est seulement si « sensor.dsmr_reader_energy_delivered_tariff_1 et 2 » sont les bons noms…
Autant commencer par voir avec 1 valeur seulement, pour voir s’il y a une sortie…

{{ states('sensor.dsmr_reader_energy_delivered_tariff_1')|int(0) }}

Pour commencer, merci.


Energie prélevée : {{states('sensor.dsmr_reader_energy_delivered_tariff_1')|int(0) +
  states('sensor.dsmr_reader_energy_delivered_tariff_2')|int(0)}} kwh

Energie injectée : {{states('sensor.dsmr_reader_energy_returned_tariff_1')|int(0) +
  states('sensor.dsmr_reader_energy_returned_tariff_2')|int(0)}} kwh

sortie:

Energie prélevée : 308 kwh
Energie injectée : 906 kwh

Comment puis-je transférer le résultat dans une variable pour pouvoir l’afficher avec les autres valeurs des variables dsmr ?

Hello, tu peux aussi modifier le code du module et laissé le module faire le calcule

tu dois ajouter un id sur chaque entitées exemples:

- platform: dsmr
    energy_delivered_tariff1:
      name: ${friendly_name} Energy Delivered Tariff 1
      id: Delivered_Tariff1
      state_class: total_increasing
    energy_delivered_tariff2:
      name: ${friendly_name} Energy Delivered Tariff 2
      id: Delivered_Tariff2
      state_class: total_increasing

et en dessous des sensors (avant text_sensor:)

  - platform: template
    name: Energy Delivered Total
    unit_of_measurement: kWh
    lambda: |-
      return (id(Delivered_Tariff1).state + id(Delivered_Tariff2).state);

plus qu’à faire pareille sur le returned si tu en as besoin, tu sauves le code, tu reflash l’esp et tu auras une nouvelle entitée Energy Delivered Total qui sera crée :blush:

Merci beaucoup. J’ai encore beaucoup à apprendre.

energy_delivered_tariff1:
      name: ${friendly_name} Energy Delivered Tariff 1
      id: Delivered_Tariff1
      state_class: total_increasing
energy_delivered_tariff2:
      name: ${friendly_name} Energy Delivered Tariff 2
      id: Delivered_Tariff2
      state_class: total_increasing
energy_returned_tariff1:
      name: ${friendly_name} Energy Returned Tariff 1
      id: Returned_Tariff1
energy_returned_tariff2:
      name: ${friendly_name} Energy Returned Tariff 2
      id: Returned_Tariff2
- platform: template
    name: Energy Delivered Total
    unit_of_measurement: kWh
    lambda: |-
      return (id(Delivered_Tariff1).state + id(Delivered_Tariff2).state);
- platform: template    
    name: Energy Returned Total
    unit_of_measurement: kWh
    lambda: |-
      return (id(Returned_Tariff1).state + id(Returned_Tariff2).state);

mais j’ai une erreur

INFO ESPHome 2023.9.1
INFO Reading configuration /config/esphome/smartmeter.yaml...
ERROR Error while reading config: Invalid YAML syntax:

while parsing a block mapping
  in "/config/esphome/smartmeter.yaml", line 2, column 1:
    substitutions:
    ^
expected <block end>, but found '-'
  in "/config/esphome/smartmeter.yaml", line 107, column 1:
    - platform: template
    ^

EDIT : trouvé, je n’ai pas mis assez de marge pour - template. Maintenant, c’est bon.

Et dire que je dois organiser la sauvegarde de tout cela lorsque j’installerai HA sur mon mini pc lundi

il faut faire attention à l’indentation (les espaces avant le code)

substitutions:
  name: p1-reader
  friendly_name: DSMR Reader

esphome:
  name: p1-reader
  platform: ESP8266
  board: d1_mini

# Enable Home Assistant API
api:
  encryption:
    key: "XXX"

ota:
  password: "XXX"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Dsmr Fallback Hotspot"
    password: "XXX"

captive_portal:

logger:
  # Serial logging is disabled by setting the logger baud rate to 0.
  # Otherwise the logger will occupy the hardware UART, making it unavailable
  # for receiving smart meter data on pin D7 (GPIO13).
  baud_rate: 0
  level: VERBOSE
  
uart:
  rx_pin: D7
  baud_rate: 115200
  rx_buffer_size: 1500


dsmr:
  request_pin: D5
  request_interval: 15s

sensor:
  - platform: dsmr
    energy_delivered_tariff1:
      name: ${friendly_name} Energy Delivered Tariff 1
      id: Delivered_Tariff1
      state_class: total_increasing
    energy_delivered_tariff2:
      name: ${friendly_name} Energy Delivered Tariff 2
      id: Delivered_Tariff2
      state_class: total_increasing
    energy_returned_tariff1:
      name: ${friendly_name} Energy Returned Tariff 1
      id: Returned_Tariff1
    energy_returned_tariff2:
      name: ${friendly_name} Energy Returned Tariff 2
      id: Returned_Tariff2
    power_delivered:
      name: ${friendly_name} Power Consumed
    power_returned:
      name: ${friendly_name} Power Returned
    voltage_l1:
      name: ${friendly_name} Voltage L1
    current_l1:
      name: ${friendly_name} Current L1
    power_delivered_l1:
      name: ${friendly_name} Power Delivered L1
    power_returned_l1:
      name: ${friendly_name} Power Returned L1
    gas_delivered_be:
      name: ${friendly_name} Gas Delivered BE
    active_energy_import_current_average_demand:
      name: ${friendly_name} Current Average
    active_energy_import_maximum_demand_running_month:
      name: ${friendly_name} Max Demande Running Month
    active_energy_import_maximum_demand_last_13_months:
      name: ${friendly_name} Max Demande Last 13 months
    water_delivered:
      name: ${friendly_name} Water Delivered

  - platform: wifi_signal
    name: "WiFi Signal Strenght"
    id: wifi_signal_db
    update_interval: 60s

  - platform: copy
    source_id: wifi_signal_db
    name: "WiFi Signal (percent)"
    id: wifi_signal_pct
    unit_of_measurement: "Signal %"
    accuracy_decimals: 0
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    entity_category: "diagnostic"

  - platform: template
    name: Energy Delivered Total
    unit_of_measurement: kWh
    lambda: |-
      return (id(Delivered_Tariff1).state + id(Delivered_Tariff2).state);
  - platform: template
    name: Energy Returned Total
    unit_of_measurement: kWh
    lambda: |-
      return (id(Returned_Tariff1).state + id(Returned_Tariff2).state);
    
text_sensor:
  - platform: dsmr
    identification:
      name: ${friendly_name} Identification
    p1_version_be:
      name: ${friendly_name} Version BE
    message_long:
      name: ${friendly_name} Message Long
  - platform: wifi_info
    ip_address:
      name: "IP Address"
    ssid:
      name: "WiFi SSID"
    bssid:
      name: "WiFi BSSID"

je te met mon yaml, j’ai tester tout fonctionne :wink: attention j’ai pas de L2 et L3 dans ce code

PS le water_delivered: ne fonctionne pas c’est en attente du nouveau compteur d’eau

1 « J'aime »

Merci j’avais mis à jour mon message précédent. Désolé pour le dérangement inutile.

EDIT : trouvé, je n’ai pas mis assez de marge pour - template. Maintenant, c’est bon.

Effectivement j’avais oublié l’indentation devant - template

C’est précis quand même yaml !!