[TUTO] Prises "Power Meter" Chacon / Edisio : ESPHome et Calibration (bonus : modification d'une prise standard en prise "Power Meter")

Bonjour,
Aujourd’hui, nouveau tuto !

Je vous avais déjà parlé du hack des prises Chacon, Edisio et Essentiel B (ici : [TUTO] Hack de prises wifi Chacon-DiO / EDISIO et intégration dans HA à l'aide d'ESPHome).

Je vous avais dit que j’allais vous proposer le code pour les versions « Power Meter » de ces prises, promesse tenue ici ! Mais nous allons aller plus loin, nous allons voir comment recalibrer le capteur et comment transformer les modèles sans « Power Meter » en modèles avec !

Une prise avec l’option « Power Meter » :


0. Avertissements :

Laïus habituel :

→ Intervenir sur un appareil qui fonctionne sur secteur présente des risques d’électrisation et d’incendie (menant à l’électrocution ou/et à la destruction de biens). Vous devez être formé·s ou, à minima, savoir ce que vous faites. En cas de doute, d’absence de formation ou de manque d’expérience, n’intervenez pas sur un appareil qui fonctionne avec le secteur. Vous êtes seul·s responsables de vos actes.

→ Il est important de préciser que les systèmes décrits dans cet article ne présentent pas d’éléments d’isolation entre le secteur et la basse tension. Il est donc formellement interdit d’intervenir sur ces systèmes lorsqu’ils sont reliés au secteur.

→ Ouvrir l’appareil peut faire perdre la garantie. Téléverser un nouveau programme dans la prise fera définitivement perdre les fonctions initiales du constructeur, et les applications prévues par les constructeurs n’auront plus accès à cette prise. L’opération est irréversible, vous êtes prévenus !


A. Programmation et calibration d’une prise « Power Meter »

A-1. Programmation YAML :

Pour ce qui est de nos prises avec l’option « Power Meter » d’usine, voici le programme YAML ESPHome.

# Version : V2.1.SD.03052025

substitutions:
  device_name:    socket-03
  friendly_name: "Socket 03"

  current_resistor:  "0.0019" # Facteur de calibration du courant. |Nouveau facteur de calibration = facteurCalibActuel * ( (TensionLueMultimetre / 560 ) / (CourantLueCapteur) ) | Note : valeur retournée par le capteur en RMS.
  voltage_divider:   "2152"    # Facteur de calibration de la tension | Nouveau facteur de calibration = facteurCalibActuel * (TensionLueCapteur / TensionLueMultimétre) |Note, les valeurs retournées par le capteur et le multi sont en RMS.
  power_limit_watts: "2350"    # Valeur de protection contre les surcharges.

  gpio_led_red:  "13"  # LED rouge
  gpio_led_blue: "12" # LED bleue
  gpio_relay:    "33"  # Relais de puissance
  gpio_button:   "10"  # Bouton physique
  gpio_sel:      "14"  # HLW8012 SEL
  gpio_cf:       "11"  # HLW8012 CF
  gpio_cf1:      "9"   # HLW8012 CF1

# @=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@
# @=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@
# @=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@=@

esphome:
  name: ${device_name}
  friendly_name: ${friendly_name}
  compile_process_limit: 2
  on_boot:
    priority: 600
    then:
      - logger.log: "Démarrage : clignotement des LED pendant 10 secondes"
      - repeat:
          count: 10
          then:
            - output.turn_on: led_red
            - output.turn_off: led_blue
            - delay: 500ms
            - output.turn_off: led_red
            - output.turn_on: led_blue
            - delay: 500ms
      - output.turn_off: led_red
      - output.turn_off: led_blue

esp32:
  board: esp32-s2-saola-1
  framework:
    type: arduino

logger:

api:
  encryption:
    key: "G2vhBr5OXEQ6Qb8J8ulxKlLerw2bExNl3eudxlH3BHM="

ota:
  - platform: esphome
    password: "f3d3d235d63f57a6dc2a798fdaf03bfc"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "${friendly_name} Fallback Hotspot"
    password: !secret ap_password

captive_portal:

output:
  - platform: gpio
    pin:
      number: ${gpio_led_red}
      inverted: true
    id: led_red
  - platform: gpio
    pin:
      number: ${gpio_led_blue}
      inverted: true
    id: led_blue

globals:
  - id: manual_activation
    type: bool
    restore_value: no
    initial_value: 'false'

switch:
  - platform: gpio
    pin:
      number: ${gpio_relay}
      inverted: false
    id: socket_switch
    name: "${friendly_name} Switch"
    on_turn_on:
      then:
        - if:
            condition:
              - lambda: 'return id(manual_activation);'
            then:
              - output.turn_on: led_blue
            else:
              - output.turn_on: led_red
              - output.turn_on: led_blue
    on_turn_off:
      then:
        - output.turn_off: led_red
        - output.turn_off: led_blue
        - globals.set:
            id: manual_activation
            value: 'false'

binary_sensor:
  - platform: gpio
    pin:
      number: ${gpio_button}
      inverted: true
    name: "${friendly_name} Bouton"
    id: socket_button
    on_press:
      then:
        - globals.set:
            id: manual_activation
            value: 'true'
        - switch.toggle: socket_switch

time:
  - platform: homeassistant

sensor:
  - platform: hlw8012
    sel_pin:
      number: ${gpio_sel}
      inverted: true
    cf_pin:
      number: ${gpio_cf}
    cf1_pin:
      number: ${gpio_cf1}
      inverted: true
    current_resistor: ${current_resistor}
    voltage_divider: ${voltage_divider}
    current:
      name: "${friendly_name} Courant"
      unit_of_measurement: "A"
      accuracy_decimals: 3
    voltage:
      name: "${friendly_name} Tension"
      unit_of_measurement: "V"
      accuracy_decimals: 1
    power:
      name: "${friendly_name} Puissance"
      id: socket_power
      unit_of_measurement: "W"
      accuracy_decimals: 1
      on_value_range:
        above: ${power_limit_watts}
        then:
          - logger.log:
              level: WARN
              format: "> Détection surconsommation (${power_limit_watts}W+) : coupure du relais"
          - switch.turn_off: socket_switch
    update_interval: 10s

  - platform: total_daily_energy
    name: "${friendly_name} Énergie Totale"
    power_id: socket_power
    unit_of_measurement: "kWh"
    accuracy_decimals: 3
    filters:
      - multiply: 0.001

Nous pouvons facilement ajuster le nom du device ou les valeurs de calibration qui se trouvent en en-tête du programme. Le programme permet une commande physique mais aussi depuis HA de la prise. Une LED rouge/bleue en fonction de l’état de la prise. Mesure de la tension, du courant, de la puissance et de l’énergie consommée sur une période d’un jour. Enfin, une protection qui coupe la prise si la puissance consommée dépasse la puissance admissible par la prise.

Pour les cartes microcontrôleur « RF0034PLCG VC » (ESP32-S2), le pinout :

  gpio_led_red:  "13"  # LED rouge
  gpio_led_blue: "12"  # LED bleue
  gpio_relay:    "33"  # Relais de puissance
  gpio_button:   "10"  # Bouton physique
  gpio_sel:      "14"  # HLW8012 SEL
  gpio_cf:       "11"  # HLW8012 CF
  gpio_cf1:      "9"   # HLW8012 CF1

  esp32:
    board: esp32-s2-saola-1
    framework:
      type: arduino

Pour les cartes microcontrôleur « RFM8266W VB1 » (ESP8266), le pinout :

  gpio_led_red:  "2"   # LED rouge
  gpio_led_blue: "13"  # LED bleue
  gpio_relay:    "16"  # Relais de puissance
  gpio_button:   "12"  # Bouton physique
  gpio_sel:      "4"   # HLW8012 SEL
  gpio_cf:       "14"  # HLW8012 CF
  gpio_cf1:      "5"   # HLW8012 CF1

  esp8266:
    board: esp01_1m

A-2. Schéma / Hardware :

J’ai même relevé le schéma pour que vous puissiez dépanner la prise en cas de besoin :slight_smile:
Cartes : « WIFI3680-15A », « WIFI3680-15C » et « RFM8266W VB1 » ou « RF0034PLCG VC »

A-3. Procédure de calibration

Pour la calibration, vous devrez :

→ Préparer une charge de référence.

Utilisez une résistance stable (560 Ω 1% – 100 W) à brancher sur votre prise.
ATTENTION : risque de brûlures et d’incendie, cette résistance chauffe beaucoup ! Soyez prudent et utilisez-la seulement quelques secondes à quelques minutes, le temps de la calibration, pas plus. Pièces nues sous tension, risque d’électrisation (pouvant entraîner l’électrocution).

→ Mesurer la tension RMS

Branchez votre multimètre en mode AC RMS sur la prise.
Notez la tension lue (ex. 239 V) Vtrue.

→ Mesurer la tension et la puissance du capteur

Dans Home Assistant, relevez :

Vmeas (du capteur HLW8012, en V)
Pmeas (du capteur HLW8012, en W)

Exemple : Vmeas=253 V, Pmeas=106 W.

→ Calculer le nouveau voltage_divider

FacteurTensionNew = FacteurOld × ( Vtrue / Vmeas )
FacteurTensionNew = 2278 × ( 239 / 253 )
FacteurTensionNew ≈ 2152

→ Calculer le nouveau current_resistor

Courant mesuré par le capteur :

Imeas = Pmeas * Vmeas
Imeas = 106 * 253
Imeas ≈ 0,419A

Courant réel attendu :

Itrue = Vtrue/R
Itrue = 239 / 560
Itrue ≈ 0,427A

Nouvelle valeur :

FacteurCourantNew = Rold × Itrue / Imeas
FacteurCourantNew = 0,00187 × ( 0,427 / 0,419 )
FacteurCourantNew ≈ 0,00190

→ Remplacez dans le YAML :

current_resistor: 0.00190
voltage_divider: 2152

Le montage en question :



B. Modification d’une prise standard en prise « Power Meter »

Maintenant, les choses sérieuses !

J’ai remarqué que le modèle de prise sans « Power Meter » et le modèle avec partagent le même pcb ! Pour le modèle sans, les composants nécessaires à la mesure de puissance ne sont tout simplement pas assemblés, c’est une pratique courante chez les industriels.
Et c’est pratique ! Grâce à ça, nous allons pouvoir upgrader très facilement nos prises.

B-1. Liste des courses :

La modification consiste à placer sur le PCB d’origine 8 composants + un petit PCB (avec 11 composants) qui accueille le capteur de courant HLW8012, une mise à jour du programme et le tour est joué !

Les composants à placer sur le PCB d’origine :

  • R04 : 1M (CMS - 1206)
  • R05 : 1M (CMS - 1206)
  • R02 : 0,002R (CMS - 2512 2W 1%)
  • R14 : 1K5 (CMS - 0603)
  • R06 : 1K (CMS - 0804)
  • R11 : 1K5 (CMS - 0804)
  • C06 : 100nF (CMS - 0804)
  • Q02 : J3Y / S8050
  • PCB : WIFI3680-15C-SD

Pour le PCB qui embarque le capteur de puissance HLW8012, voici ma version revisitée, c’est kdo : Fab PCBWay

Pour ce PCB, nous allons avoir besoin de :

  • C1 : 33nF (CMS - 0603)
  • C2 : 33nF (CMS - 0603)
  • C3 : 2.2µF (CMS - 0603)
  • C4 : 100nF (CMS - 0603)
  • R1 : 1K (CMS - 0603)
  • R2 : 1K (CMS - 0603)
  • R3 : 1K (CMS - 0603)
  • R4 : 1K (CMS - 0603)
  • R5 : 2K (CMS - 0603)
  • R6 : 2K (CMS - 0603)
  • U1 : HLW8012

Pour le HLW8012, si vous le commandez sur des sites chinois (il n’y a pas beaucoup d’autres alternatives pour s’en procurer), soyez vigilants : j’ai déjà reçu des contrefaçons de ce composant qui ne fonctionnaient absolument pas… (N’hésitez pas à en commander chez plusieurs vendeurs et à vous faire rembourser les composants inutilisables).
Ca s’assemble bien à la main :

S’il vous reste encore de la place sur votre liste d’achats, n’hésitez pas à remplacer les condensateurs électrochimiques par des condensateurs de qualité, ceux d’origine sont réputés pour lâcher au bout de quelques années seulement… (notamment EC3 et EC4).

  • EC4 100µF 16V
  • EC3 470µF 10V (Recommandation : 470µF 16V)
  • EC1 3.3µF 400V
  • EC2 3.3µF 400V

B-2. Modification est assemblage :

Maintenant que l’on a tout ce qu’il faut :

Commencez par démonter la prise (hors tension, évidemment et toujours) :

Nous allons réaliser l’étape la plus délicate. Le plot de neutre est constitué d’un bloc unique. C’est entre N-In et N-Out que nous ferons la mesure de courant. Il va donc falloir séparer le bloc de neutre en deux sans pouvoir le démonter (car le plot est serti dans le plastique). Avec une pince, on vient faire des allers-retours de gauche à droite pour casser la languette en métal et séparer le plot de neutre en deux parties. Une fois fait, on brase un câble (16 A 230 V mini) à la languette sertie et on plie la languette vers le bas. Assurez-vous de réaliser une brasure de qualité à cet endroit là !!!

Maintenant, il va falloir sectionner la piste du neutre, c’est la résistance de mesure de courant (0,002 R sur l’autre face) qui fera le pont entre le N-In et le N-Out. Sur la piste se trouve à gauche le câble d’arrivée du neutre et à droite le câble de sortie du neutre.

Maintenant, il s’agira simplement de placer les composants manquants :

Avant et après de la face inférieure du PCB :

Avant et après de la face supérieure du PCB :

À partir d’ici, il faudra injecter le programme et réaliser la procédure de calibration, comme décrit en début d’article. Vous avez maintenant amélioré votre prise connectée, bravo !