Utility Meter mesurer votre consommation d'énergie

bonjour je vais vous partager mon Utility Meter
Cette intégration permet de connaître ses consommations électriques

1/ matériel :
comptage: PZEM-004t 100a
esp: esp32
J’ai choisi le modèle avec anneau monté directement sur la phase de mon arrivée EDF

2/ flash de l’esp avec esp home

prog
esphome:
  name: esp_garage
  platform: ESP32
  board: esp32doit-devkit-v1

wifi:
  networks:
    - ssid: "xxxxx"
      password: "xxxxxxx"  
    - ssid: "xxxxxxx"
      password: "xxxxxxxxx"

  ap:
    ssid: "Esp tableau"
    password: "xxxxxxxx"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  
uart:
  - id: ubus1
    tx_pin: GPIO1
    rx_pin: GPIO3
    baud_rate: 9600
    stop_bits: 2     #pour un ESP8266, essayer plutôt la valeur 1
  

time:
  platform: sntp
  id: my_time
  
  on_time:
      - seconds: 57
        minutes: 59
        hours: 23
        then:  
          - sensor.template.publish:
              id: template_Wh_tableau_veille
              state: !lambda return id(puissance_tableau_du_jour).state;
  
sensor:

  - platform: pzemac
    address: 1
    current:
      name: "intensite_tableau"
      accuracy_decimals: 2
    voltage:
      name: "tension_tableau"
      accuracy_decimals: 2
    power:
      name: "puissance_tableau"
      unit_of_measurement: W
      accuracy_decimals: 2
      id: puissance_tableau
    frequency:
      name: "frequence_tableau"
      unit_of_measurement: Hz
      accuracy_decimals: 2
    power_factor:
      name: "fi_tableau"
      accuracy_decimals: 2
      id: fi_tableau
    energy:
      name: "Wh_tableau"
      unit_of_measurement: Wh
      accuracy_decimals: 1
      id: Wh_tableau
    update_interval: 5s

    
  - platform: template
    name: "puissance_tableau_cumulee"
    unit_of_measurement: "kWh"
    accuracy_decimals: 1
    update_interval: 5s
    icon: mdi:power
    lambda: return (( (id(Wh_tableau).state)/1000.0));
    
  - platform: total_daily_energy
    name: "Wh_tableau_jour"
    power_id: puissance_tableau 
    unit_of_measurement: "kWh"
    accuracy_decimals: 2
    id: puissance_tableau_du_jour
    filters:
        # Multiplication factor from W to kW is 0.001
        - multiply: 0.001
    icon: mdi:counter
    
  - platform: template
    name: "Wh_tableau_veille"
    id: template_Wh_tableau_veille
    unit_of_measurement: "kwh"
    accuracy_decimals: 2
    icon: mdi:power
    update_interval: 10s
    
  - platform: template
    name: "puissance_tableau_apparente"
    id: puissance_tableau_apparente
    unit_of_measurement: "VA"
    accuracy_decimals: 2
    update_interval: 10s
    icon: mdi:power
    lambda: return ( (id(puissance_tableau).state/id(fi_tableau).state));
  
  - platform: template
    name: "puissance_tableau_reactive"
    id: puissance_tableau_reactive
    unit_of_measurement: "VAr"
    accuracy_decimals: 2
    update_interval: 10s
    icon: mdi:power
    #lambda: return ( ((id(puissance_tableau_reactive).state)*sin(acos((id(fi_tableau).state))) ) );
    lambda: return ( ( sqrt( (id(puissance_tableau_reactive).state)*(id(puissance_tableau_reactive).state)   -  (id(fi_tableau).state)*(id(fi_tableau).state) ) )  );
    
  - platform: wifi_signal
    name: "WiFi puissance_enedis"
    update_interval: 10s
    
  - platform: uptime
    name: "up"
    id: uptime_sec 
 
switch:
  - platform: restart
    name: "tableau_restart"
    
    
binary_sensor:
  - platform: status
    name: "tableau_status"    
    
    
text_sensor:
  - platform: template
    name: enedis_uptime
    lambda: |-
      int seconds = (id(uptime_sec).state);
      int days = seconds / (24 * 3600);
      seconds = seconds % (24 * 3600); 
      int hours = seconds / 3600;
      seconds = seconds % 3600;
      int minutes = seconds /  60;
      seconds = seconds % 60;
      return { (String(days) +"d " + String(hours) +"h " + String(minutes) +"m "+ String(seconds) +"s").c_str() };
    icon: mdi:clock-start
    update_interval: 113s      

web_server:
  port: 80

3/ fichier configuration.yaml pour utility meter et hp/hc

configuration.yaml
#############################
########  consomation  ########
#############################
utility_meter:
  energy_total_usage_daily:
    source: sensor.wh_tableau_jour
    cycle: daily
    tariffs:
      - hp
      - hc

  energy_total_usage_weekly:
    source: sensor.wh_tableau_jour
    cycle: weekly
    tariffs:
      - hp
      - hc

  energy_total_usage_monthly:
    source: sensor.wh_tableau_jour
    cycle: monthly
    tariffs:
      - hp
      - hc


  energy_total_usage_yearly:
    source: sensor.wh_tableau_jour
    cycle: yearly
    tariffs:
      - hp
      - hc

4/ l’automation pour changé les hc et hp

automation
- id: '1622132545289'
  alias: mise à jour hc/hp (Dupliquer)
  description: ''
  trigger:
  - platform: time
    at:
    - '21:00:00'
    - '23:00:00'
    - '01:30:00'
    - '07:30:00'
  - platform: homeassistant
    event: start
  condition: []
  action:
  - choose:
    - conditions:
      - condition: template
        value_template: '{{ ((states.sensor.time.state >= "07:30")  and (states.sensor.time.state
          < "21:00")) or ((states.sensor.time.state >= "23:00")  or (states.sensor.time.state
          < "01:30")) }} '
      sequence:
      - service: utility_meter.select_tariff
        data:
          entity_id:
          - utility_meter.energy_total_usage_yearly
          - utility_meter.energy_total_usage_daily
          - utility_meter.energy_total_usage_weekly
          - utility_meter.energy_total_usage_monthly
          tariff: hp
    - conditions:
      - condition: template
        value_template: '{{ ((states.sensor.time.state >= "21:00")  and (states.sensor.time.state
          < "23:00")) or ((states.sensor.time.state >= "01:30")  and (states.sensor.time.state
          < "07:30")) }} '
      sequence:
      - service: utility_meter.select_tariff
        data:
          entity_id:
          - utility_meter.energy_total_usage_yearly
          - utility_meter.energy_total_usage_daily
          - utility_meter.energy_total_usage_weekly
          - utility_meter.energy_total_usage_monthly
          tariff: hc
    default: []
  mode: single

5/ les petits plus sensor conso , pourcentage etc.

sensor.yaml
#############################
########  conso elec ########
#############################         
- platform: template 
  sensors:
energy_total_daily:
  friendly_name: 'Energie journalière consommée'
  value_template: "{{ (states('sensor.energy_total_usage_daily_hp')|float + states('sensor.energy_total_usage_daily_hc')|float)|round(2) }}"
  unit_of_measurement: "kWh"
  

[details="sensor.yaml"]
- platform: template 
  sensors:
energy_total_weekly:
  friendly_name: 'Energie hebdo consommée'
  value_template: "{{ (states('sensor.energy_total_usage_weekly_hp')|float + states('sensor.energy_total_usage_weekly_hc')|float)|round(2) }}"
  unit_of_measurement: "kWh"    
  
- platform: template 
  sensors:
energy_total_montly:
  friendly_name: 'Energie mensuel consommée'
  value_template: "{{ (states('sensor.energy_total_usage_monthly_hp')|float + states('sensor.energy_total_usage_monthly_hc')|float)|round(2) }}"
  unit_of_measurement: "kWh"
  
- platform: template 
  sensors:
energy_total_yearly:
  friendly_name: 'Energie annuel consommée'
  value_template: "{{ (states('sensor.energy_total_usage_yearly_hp')|float + states('sensor.energy_total_usage_yearly_hc')|float)|round(2) }}"
  unit_of_measurement: "kWh"
  
- platform: template 
  sensors:
hp_hc:
  friendly_name: 'Energie mensuel € hp+hc'
  value_template: "{{ ((((states('sensor.energy_total_usage_monthly_hp')|float)*states('input_number.prix_hp')|float) + ((states('sensor.energy_total_usage_monthly_hc')|float)*states('input_number.prix_hc')|float)) + states('input_number.abo_hchp')|float )|round (3)}}"
  unit_of_measurement: "€"
  
- platform: template 
  sensors:
base:
  friendly_name: 'Energie mensuel € base'
  value_template: "{{ ((((states('sensor.energy_total_usage_monthly_hp')|float)*states('input_number.prix_base')|float) + ((states('sensor.energy_total_usage_monthly_hc')|float)*states('input_number.prix_base')|float)) + states('input_number.abo_base')|float)|round(3)}}"
  unit_of_measurement: "€"
  

- platform: template 
  sensors:
mensuel:
  friendly_name: 'Energie mensuel '
  value_template: "{{states('sensor.energy_total_usage_monthly_hc')}} HC et {{states('sensor.energy_total_usage_monthly_hp')}} HP"    

- platform: template 
  sensors:
hc_hp:
  friendly_name: 'pourcentage '
  value_template: >-
  {% set hchp = (states('sensor.energy_total_usage_monthly_hc')| float) /((states('sensor.energy_total_usage_monthly_hp')| float)+(states('sensor.energy_total_usage_monthly_hc')| float)) %}
  {% if hchp <= 1  %} 
  {{ hchp| round(2)}} % d'heures creuses
  {% endif %}
[/details]

les input_number

input_nunber.yaml
#############################
###### tarif edf   ##########
#############################
prix_hp:
    name: tarif_hp
    initial: 0.1707
    min: 0
    max: 2
    unit_of_measurement: €
    mode: box
prix_hc:
    name: tarif_hc
    initial: 0.1257
    min: 0
    max: 2
    unit_of_measurement: €
    mode: box
prix_base:
    name: tarif_base
    initial: 0.1507
    min: 0
    max: 2
    unit_of_measurement: € 
    mode: box
abo_base:
    name: abo_base
    initial: 12.67
    min: 10
    max: 20   
    unit_of_measurement: €   
    mode: box
abo_hchp:
    name: abo_hphc
    initial: 15.14
    min: 10
    max: 20
    unit_of_measurement: € 
    mode: box

6/ le résultat

image
image

1 « J'aime »

Bonjour,
Même si ce tuto date un peu, je tiens à te remercier.
Cependant, j’ai un petit problème… Mes heures creuses sont de 22h36 à 6h36 et je ne sais pas comment les saisir dans automatisation.
Pourrais-tu m’aider s’il te plaît ?
Merci d’avance.

bonjour je pense qu’il faut changer les heures de déclenchement dans l’automation du même noms:

les modifs
- id: '1622132545289'
  alias: mise à jour hc/hp (Dupliquer)
  description: ''
  trigger:
  - platform: time
    at:
    - '21:00:00'   # ici
    - '23:00:00'  # ici
    - '01:30:00'  #supprimé
    - '07:30:00'  #supprimé

aussi ici

    - condition: template
            value_template: '{{ ((states.sensor.time.state >= "07:30")  and (states.sensor.time.state
              < "21:00")) or ((states.sensor.time.state >= "23:00")  or (states.sensor.time.state
              < "01:30")) }} '

et enfin ici

 - condition: template
    value_template: '{{ ((states.sensor.time.state >= "21:00")  and (states.sensor.time.state
      < "23:00")) or ((states.sensor.time.state >= "01:30")  and (states.sensor.time.state
      < "07:30")) }} '

tu n’as qu’une plage donc:

normalement ca
- id: '1622132545289'
  alias: mise à jour hc/hp (Dupliquer)
  description: ''
  trigger:
  - platform: time
    at:
    - '20:36:00'
    - '06:36:00'
  - platform: homeassistant
    event: start
  condition: []
  action:
  - choose:
    - conditions:
      - condition: template
        value_template: '{{ ((states.sensor.time.state >= "06:36")  and (states.sensor.time.state
          < "20:36")) }} '
      sequence:
      - service: utility_meter.select_tariff
        data:
          entity_id:
          - utility_meter.energy_total_usage_yearly
          - utility_meter.energy_total_usage_daily
          - utility_meter.energy_total_usage_weekly
          - utility_meter.energy_total_usage_monthly
          tariff: hp
    - conditions:
      - condition: template
        value_template: '{{ ((states.sensor.time.state >= "20:36")  and (states.sensor.time.state
          < "23:59")) or ((states.sensor.time.state >= "00:00")  and (states.sensor.time.state
          < "06:36")) }} '
      sequence:
      - service: utility_meter.select_tariff
        data:
          entity_id:
          - utility_meter.energy_total_usage_yearly
          - utility_meter.energy_total_usage_daily
          - utility_meter.energy_total_usage_weekly
          - utility_meter.energy_total_usage_monthly
          tariff: hc
    default: []
  mode: single

a vérifier la condition 2 20h36—>6h36 :

        value_template: '{{ ((states.sensor.time.state >= "20:36")  and (states.sensor.time.state
          < "23:59")) or ((states.sensor.time.state >= "00:00")  and (states.sensor.time.state
          < "06:36")) }} '

car je suis pas trop sur du template
pour info le Linky peut aussi te donner un sensor HC et un sensor HP qui seront alors tes déclencheurs et tes conditions.
et comme l’intégration de compteur à été facilité
tu fais paramètre ----> appareille et service-------> entrées ------>ajouter une entrée---->compteur de service publique . et voila tu rentre ton sensor WH tes sensorHP et sensorHC du linky

stefan

1 « J'aime »

Bonjour,

Merci, c’est sympa je vais tester.
En fait, là c’est pour calculer le coût de la filtration de ma pompe piscine que je cherche à faire ton automatisation.

Pour mon compteur linky, j’ai réussi à avoir un module teleinfokit qui fonctionne parfaitement via Mqtt.

1 « J'aime »

bonjour,
tien ca peux aider :

compte le temps de fonctionnement sur une journée d’une entitée:

Résumé

dans sensor.yaml

- platform: history_stats
  name: Lamp ON today
  entity_id: light.ventilateur
  state: "on"
  type: time
  start: "{{ now().replace(hour=0, minute=0, second=0) }}"
  end: "{{ now() }}"

et le service notify.file
peux te permettre d’extraire des donnée sur un .txt ou autres.
en gros un txt a transformer en exel avec date et conso.

Résumé
service: notify.filenotify
data:
  message: '{{states(''sensor.date_time'')}} {{states(''sensor.eau_consommation_jour'')}}'

pour revenir à nos moutons:

tu choisi deux tariff HP… et HC… (mon choix a voire si idem chez toi) qui te crée un select.eau (eau c’est mon choix le tiens sera différent)
et une petite automation. le declencheur est le linky , tu peux mettre les heures .

automation chgt tariff
alias: 'changement de tariff '
description: ''
trigger:
  - platform: state
    entity_id:
      - sensor.tariff
condition: []
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: sensor.tariff
            state: HP..# faudra changer
        sequence:
          - service: select.select_option
            data:
              option: HP..# faudra changé
            target:
              entity_id: select.eau2 # faudra changer
      - conditions:
          - condition: state
            entity_id: sensor.tariff
            state: HC..# faudra changer
        sequence:
          - service: select.select_option
            data:
              option: HC..# faudra changer
            target:
              entity_id: select.eau2 # faudra changer
    default: []
mode: queued
max: 2

pour le cout ca reste identique à l’article

stefan

1 « J'aime »

Salut,
Encore merci, je vais essayer car à force de faire ou de modifier les sensors, les automations et des inputs, je t’avoue que je me suis perdu tout seul là.
Je vais faire un peu le ménage/trie afin que je puisse avoir les infos sur cette fameuse prise.
Je te tiens au courant. :crossed_fingers:

@steffleur
Salut, bon finalement je n’y arrive pas… Je suis dépité. Je vais devoir essayer de supprimer tout ce que j’ai fait car les heures creuses ne s’affichent pas sur ma prise.
Sinon, j’avais pensé la mettre dans l’onglet Energy mais il ne me trouve pas la prise :confused:.
Si tu as une idée, stp.
Encore merci
En mp attention au attribut des sensors lors des copier coller je suis français j’utilise hp et hc les anglophone utilisent Peak et offpeak…:face_with_monocle: Stefan