[Tuto] LSC Action Power Plug, méthode pour les passer sous ESPhome

ATTENTION : ne faire aucune manipulation en étant connecté au secteur. Toutes les opérations ci-dessous se font uniquement sur du courant faible. Si vous n’êtes pas sûr de vous ne FAITES PAS. Je ne veux pas être tenu pour responsable de tout accident ou brickage de vos périphériques.

J’ai été étonné de voir que l’enseigne Action dispose de nombreux périphériques Tuya dont les LSC Smart Power Plug (LSC étant probablement une marque du groupe Action) qui sont des prises connectées Wifi, avec mesure d’énergie, au standard français UTE.

Au prix de 7,95€ TTC, c’est un périphérique abordable, que l’on trouve en local et simple d’usage pour améliorer son dashboard énergétique.

N’étant pas fan de Tuya on va passer le firmware sous ESPhome. Bien sûr, on va perdre les fonctionnalités natives… LSC Smart Connect, Hey Google, Alexa, etc. Mais bon rien d’irremplaçable avec Home Assistant.

Première étape, l’ouverture…

Heureusement pour nous, les deux parties du boîtier ne sont pas soudées mais simplement clipsées ensemble. On utilise une spatule dans les angles pour démonter les deux éléments.

Pour simplifier l’opération, on peut, dans un premier temps utiliser une lame de démontage, plus fine…

…et faire levier pour y glisser la spatule.

On fait ça a proximité des angles et on obtient l’ensemble démonté…

A l’intérieur ça donne quoi ?

La conception est plutôt simple (on ne va pas s’attarder sur la qualité de l’électronique). En (1) on a le relai, qui est conçu pour maximum 16A sous 277V AC… Sous le repère (2), la carte électronique qui gère la logique.

De l’autre côté, on trouve en (1), le chipset BL0937 qui assure la mesure des valeurs énergétiques (courant, tension, puissance) avec la résistante de shunt (2) qui est exploité par le circuit. A noter que le relai ne coupe ici que la phase, le neutre et la terre étant simplement connecté du côté mâle au côté femelle.

Côté logique, on trouve ici un module Tuya CB2S dont le datasheet, tourne autour d’une puce BK7231N. C’est elle que l’on va flasher pour ESPhome.

Pour ça, on va utiliser un adaptateur TTL vers USB que l’on va connecter au module CB2S.

Un petit peu de soudure

C’est l’étape peut être un peu complexe pour des néophytes, on va devoir souder des fils sur les bornes 3V3, GND, RX et TX du module CB2S. Le schéma suivant reprend la logique (simplifié) du câblage et du fonctionnement de la carte. A noter qu’il faut un fil volant pour faire un reset du circuit pendant l’envoi du firmware, celui-ci doit être connecté à la masse.

Comme sur le schéma, on soude quatre fil sur la carte. Le plus simple est de souder directement des connecteurs Dupont male, c’est souvent beaucoup plus rapide et solide qu’un fil étamé.

Les fils soudés et raccordés au convertisseur TTL vers USB ainsi que le câble volant pour le reset du module.

Préparation du template

On va dans un premier temps créer un « template » commun à toutes les prises que l’on souhaitera par la suite installer. Dans ESPhome, on va créer un nouveau périphérique.

Que l’on va nommer « LSC Smart Power Plug » puis on clique sur « Next ».

Sur l’étape suivante on fait simplement « Skip this step ».

Puis on choisit ensuite n’importe quel périphérique. Aucune incidence car nous allons mettre un fichier de configuration.

On clique à nouveau sur le bouton « Skip ». Aucun intérêt de stocker la clé de cryptage.

On clique enfin sur le bouton « Edit » :

Configuration du template

Ici on ne se pose pas trop de questions, on fait un copier coller de la source suivante (créé à l’origine par Sander Keet). Techniquement le code est plutôt simple :

  • La plateform hlw8012 configurée pour le BL0937 mesure les différentes énergies depuis les PIN 11, 24 et 26. Le BL0937, renvoi la puissance sur le PIN CF (26), Le courant sur le PIN CF1 (24) si le PIN SEL (11) est à 0, ou le voltage si il est à 1. La passage de l’un à l’autre se fait automatiquement après plusieurs mises à jour des valeurs.
  • Un binary sensor attend que l’on appui sur le bouton P7 ce qui agit sur le relai en P8 et agit sur la led de status en P10 suivant l’état souhaité (activé, désactivé ou inversé).
  • Enfin la PIN 6, permet de passer la led de status bleue en rouge…

J’ai uniquement rajouté par rapport à la configuration de Sander, l’interface Web, pas réellement utile sauf pour le debug…

esphome:
  name: ${device_name}
  friendly_name: ${friendly_name}

bk72xx:
  board: generic-bk7231n-qfn32-tuya

logger:
  baud_rate: 0

web_server:
  port: 80

captive_portal:

mdns:

api:
  encryption:
    key: "mBtA/WMgP/iFholMqh2HuuWYT2/56yeBUerCwewaFtQ="

ota:
  - platform: esphome
    password: "e45ac45a43cecaa45671727cd123eef1"
    
wifi:
  networks:
    - ssid: !secret wifi_ssid
      password: !secret wifi_password
  ap:
    ssid: "Action-Smart-Power-Plug"
    password: "hHuaALbLNC3L"

button:
  - platform: restart
    name: Restart

debug:
  update_interval: 30s

text_sensor:
  - platform: debug
    reset_reason:
      name: Reset Reason
  - platform: libretiny
    version:
      name: LibreTiny Version

sensor:
  - platform: uptime
    name: Uptime
  - platform: hlw8012
    model: BL0937
    update_interval: 500ms
    change_mode_every: 2
    cf_pin:
      number: P26
      inverted: true
    cf1_pin:
      number: P24
      inverted: true
    sel_pin:
      number: P11
      inverted: true
    current:
      name: Current
      id: current
      accuracy_decimals: 3
      on_value:
        component.update: apparent_power
      filters:
        - multiply: ${current_multiply}
        - sliding_window_moving_average:
            window_size: 4
            send_every: 2
    voltage:
      name: Voltage
      id: voltage
      on_value:
        component.update: apparent_power
      filters:
        - sliding_window_moving_average:
            window_size: 4
            send_every: 2
    power:
      name: Power
      id: power
      on_value:
        component.update: power_factor
      filters:
        - sliding_window_moving_average:
            window_size: 4
            send_every: 2
    energy:
      name: Energy
    voltage_divider: ${voltage_divider}
    current_resistor: ${current_resistor}

  - platform: template
    name: "Apparent power"
    id: apparent_power
    unit_of_measurement: VA
    device_class: apparent_power
    lambda: |-
      return id(voltage).state * id(current).state;
    update_interval: never
    on_value:
        component.update: power_factor
        
  - platform: template
    name: "Power factor"
    id: power_factor
    unit_of_measurement: ''
    device_class: power_factor
    lambda: |-
      return id(power).state / id(apparent_power).state;
    filters:
      - clamp:
          min_value: 0
          max_value: 1
    update_interval: never

binary_sensor:
  - platform: gpio
    id: binary_switch_1
    pin:
      number: P7
      inverted: true
      mode: INPUT_PULLUP
    filters:
      - delayed_on: 10ms
    on_press:
      then:
        - switch.toggle: switch_1

switch:
  - platform: gpio
    id: switch_1
    name: none
    pin: P8
    restore_mode: RESTORE_DEFAULT_OFF
    on_turn_on:
      script.execute: set_status_led
    on_turn_off:
      script.execute: set_status_led

light:
  - platform: status_led
    id: light_red
    name: "Red led"
    pin: P6
    restore_mode: RESTORE_DEFAULT_OFF
  - platform: binary
    name: "Status led"
    id: blue_led
    output: output_blue_led
    restore_mode: RESTORE_DEFAULT_OFF
    internal: true

output:
  - platform: gpio
    id: output_blue_led
    pin: P10

select:
  - platform: template
    name: "Status led mode"
    id: status_led_mode
    optimistic: true
    restore_value: True
    entity_category: CONFIG
    update_interval: never
    options:
      - "Normal"
      - "Invert"
      - "Off"
    initial_option: "Normal"
    on_value:
      script.execute: set_status_led

script:
  - id: set_status_led
    then:
      - if:
          condition:
            lambda: |-
              return strcmp(id(status_led_mode).state.c_str(), "Normal") == 0;
          then:
            if:
              condition:
                switch.is_on: switch_1
              then:
                light.turn_on: blue_led
              else:
                light.turn_off: blue_led
      - if:
          condition:
            lambda: |-
              return strcmp(id(status_led_mode).state.c_str(), "Invert") == 0;
          then:
            if:
              condition:
                switch.is_on: switch_1
              then:
                light.turn_off: blue_led
              else:
                light.turn_on: blue_led
      - if:
          condition:
            lambda: |-
              return strcmp(id(status_led_mode).state.c_str(), "Off") == 0;
          then:
            light.turn_off: blue_led

Compilation du firmware

On va maintenant créer un second périphérique, celui-ci va correspondre à la prise que l’on souhaite flasher et qui va utiliser notre template. On en créera autant qu’il y a de prises ce qui permet de les mettre à jour ou de les configurer indépendamment. Comme pour le template, on commence par créer un nouveau périphérique :

Puis on le nomme comme on le souhaite et comme pour le template, on fait « Skip » sur l’écran suivant, on prend un modèle de puce au hasard puis à nouveau « Skip ».

On modifie ensuite sa configuration qui comprend au delà de son nom, les caractéristiques utilisées pour la calibration. On trouve la méthode pour refaire la calibration via une pince ampèremétrique sur le site de ESPHome.

substitutions:
  device_name: lsc-powerplug-001
  friendly_name: LSC Powerplug 001
  voltage_divider: '795'
  current_resistor: '0.001'
  current_multiply: '0.450' 

<<: !include lsc-smart-power-plug.yaml

On compile ensuite le firmware en cliquant sur le bouton « Install » :

Puis on sélectionne « Manual download » :

Une fois la compilation terminée, on récupère le fichier UF2 pour flash la puce :

On flash (enfin) le firmware

Première étape, on installe depuis Github, itchiptool pour installer le firmware. Personnellement je suis sur Mac, je le fais depuis une VM dans Parallels.

On télécharge l’exécutable et on l’ouvre après avoir connecté le convertisseur TTL vers USB.

On vérifie que le port COM du convertisseur est bien affiché (ou sélectionné si la machine dispose d’autres ports COM) puis on sélectionne le fichier UF2. La LED de la prise doit clignoter lentement (c’est presque imperceptible). Si elle clignote rapidement c’est que les liaisons TX/RX sont inversées. Le TX du convertisseur doit aller sur le RX de la prise et vice versa (pendant que l’un parle, l’autre écoute). On fait « start ».

Lorsque c’est demandé (Hardware reset), on utilise notre fil volant pour le connecter rapidement au PIN CEN. Ce PIN fait le reset du module CB2S. Tant que le téléchargement du firmware ne débute pas c’est que ça n’a pas fonctionné. Ce n’est pas forcément évident (en particulier en raison du vernis de la carte), on s’y reprend à plusieurs fois, mais ça finit par fonctionner. L’upload met environ 2 minutes.

Une fois terminé, le nouveau firmware se recharge est l’interface Web est directement disponible :

Et le périphérique détecté par Home Assistant :

Avec l’ensemble des éléments configurés :

On débranche, on dessoude les fils, on remonte l’ensemble et c’est OK. A vous de jouer maintenant… sachant qu’il est possible de rajouter via ESPhome de nombreuses autres options et comportements.

Merci beaucoup pour ce tutoriel complet et simple à suivre !
J’en ai passé 3 sous ESPHome et tout fonctionne parfaitement, bien content de ne plus avoir à passer par Tuya.
J’ai remarqué en achetant les 2 dernières prises il y a quelques jours, qu’il y a un léger changement de packaging et de marquage sur les boîtiers entre les 2, qui semble indiquer une nouvelle révision de l’électronique. Le seul changement électronique observé lors du démontage est le remplacement du relais 16A max. par un relais qui fait un click plus fort et donné pour 20A max. Tout le reste est strictement identique à la précédente révision et le tutoriel reste tout à fait valide.
A gauche la précédente révision, à droite la nouvelle révision :


Je n’ai hélas pas pensé à prendre de photo du nouveau relais lors du démontage et les prises sont déjà en place…

Hello. Bon je bloque sur l’install avec un message d’erreur:

INFO ESPHome 2025.12.5 INFO Reading configuration /config/esphome/action-prise-1.yaml… ERROR Error while reading config: Invalid YAML syntax:

Error reading file /config/esphome/secrets.yaml: [Errno 2] No such file or directory: ‹ /config/esphome/secrets.yaml ›

J’ai bien suivi le tuto mais lors de la création d’un “new device” je n’ai pas exactement les mêmes menus je n’ai pas le menu demande de periphérique ni la demande de stockage de l’encryption key. c’est certainement là que ça coince. Je viens juste d’installer ESPHome (2025-12-5).

secrets.yaml est vide. Une idée pour continuer.

C’est bon j’ai créé à la main le fichier secrets.yaml et ça marche

Bonjour et merci,

J’ai suivi ce formidable tuto qui m’a sauvé avec 2-3 modifs car j’ai flashé mes prises mais ce ne sont pas celles de chez Action, elles proviennent d’Amazon.

Marque : ANTELA

Modèle : F1s202-EU

Specs : 16A 250V 4000Wmax -Module TUYA WB2S et circuit BL0937

Crédit image nkuehnel86 https://www.elektroda.com/rtvforum/topic3935136.html

Du coup je pensais partager mon expérience avec ces prises et ce tuto HACF, et bien-sur les quelques modifications que j’ai du faire pour que cela fonctionne.

Je remercie l’auteur pour les images et les infos complémentaires dont j’ai eu besoin obtenues sur son topic sur “elektroda”. https://www.elektroda.com/rtvforum/topic3935136.html

Sa façon de faire doit être très bonne aussi mais pour moi impossible de faire fonctionner « bk_writer1.60.exe » j’ai donc appliquer la méthode via ESPHome Builder.

Alors, 1ère chose qui ne fonctionnait pas avec cette prise c’était d’utiliser

bk72xx:
  board: generic-bk7231n-qfn32-tuya

dans la configuration du template ( je m’en suis rendu compte qu’a la fin du tuto car le flash se passait bien mais aucun signe de vie de la prise sur mon réseau ni dans le Log).

En remplaçant bêtement cela avec

bk72xx:
  board: wb2s

Quelques secondes après la fin du flash (du fichier de config de la prise “LSC Powerplug 001”) avec Itchiptool, les infos se sont mises à défiler dans le Log, serveur WEB et la prise est apparue dans HA. Bingo !

Sauf que, pas d’effet du bouton, ni physique ni logiciel, le relais n’avait aucune réaction… Rien… Juste la LED, enfin y’en a 2 mais c’est la même qui est doublée (2 bleues) qui fonctionne mais reste allumée malgré les différents modes essayés.

Les PIN… Pas tout à fait les mêmes que les prises d’Action, et encore une fois merci au tuto trouvé sur “Elektroda” qui m’a permis de confirmer et configurer ceux qui me manquaient pour le BL0937 ( car en essayant pas mal de fois j’avais fini par trouver le bouton, la led, le relais mais je n’avais que la puissance et l’énergie, pas d’info de tension ni de courant).

Donc pour la prise ANTELA :

Module: WB2S
MCU: BK7231T
Circuit de mesures électriques: BL0937

P24 = BL0937 SEL
P7 = BL0937 CF
P8 = BL0937 CF1
P10 = Bouton
P26 = Relais
P6 = LED (inversée)

Et là on est tout bon !

Mon fichier template LSC Smart Power Plug

esphome:
  name: ${device_name}
  friendly_name: ${friendly_name}


bk72xx:
  board: wb2s
logger:
  baud_rate: 0

web_server:
  port: 80

captive_portal:

mdns:

api:
  encryption:
    key: "Sab88jl8ya5Ir51jQRw/S5tLCWPq0wlS3nK/xjfTYmo="
ota:
  - platform: esphome
    password: "ba9457739ea0dd7531ee8d1ed9728f9a"
    
wifi:
  networks:
    - ssid: !secret wifi_ssid
      password: !secret wifi_password
  ap:
    ssid: "Action-Smart-Power-Plug"
    password: "hHuaALbLNC3L"

button:
  - platform: restart
    name: Restart

debug:
  update_interval: 30s

#text_sensor:
  #- platform: debug
    #reset_reason:
      #name: Reset Reason
  #- platform: libretiny
    #version:
      #name: LibreTiny Version

sensor:
  - platform: uptime
    name: Uptime
  - platform: hlw8012
    model: BL0937
    update_interval: 500ms
    change_mode_every: 2
    cf_pin:
      number: P7
      inverted: true
    cf1_pin:
      number: P8
      inverted: true
    sel_pin:
      number: P24
      inverted: true
    current:
      name: Current
      id: current
      accuracy_decimals: 3
      on_value:
        component.update: apparent_power
      filters:
        - multiply: ${current_multiply}
        - sliding_window_moving_average:
            window_size: 4
            send_every: 2
    voltage:
      name: Voltage
      id: voltage
      on_value:
        component.update: apparent_power
      filters:
        - sliding_window_moving_average:
            window_size: 4
            send_every: 2
    power:
      name: Power
      id: power
      on_value:
        component.update: power_factor
      filters:
        - sliding_window_moving_average:
            window_size: 4
            send_every: 2
    energy:
      name: Energy
    voltage_divider: ${voltage_divider}
    current_resistor: ${current_resistor}

  - platform: template
    name: "Apparent power"
    id: apparent_power
    unit_of_measurement: VA
    device_class: apparent_power
    lambda: |-
      return id(voltage).state * id(current).state;
    update_interval: never
    on_value:
        component.update: power_factor
        
  - platform: template
    name: "Power factor"
    id: power_factor
    unit_of_measurement: ''
    device_class: power_factor
    lambda: |-
      return id(power).state / id(apparent_power).state;
    filters:
      - clamp:
          min_value: 0
          max_value: 1
    update_interval: never

binary_sensor:
  - platform: gpio
    id: binary_switch_1
    pin:
      number: P10
      inverted: true
      mode: INPUT_PULLUP
    filters:
      - delayed_on: 10ms
    on_press:
      then:
        - switch.toggle: switch_1

switch:
  - platform: gpio
    id: switch_1
    name: none
    pin: P26
    restore_mode: RESTORE_DEFAULT_OFF
    on_turn_on:
      script.execute: set_status_led
    on_turn_off:
      script.execute: set_status_led

light:
  #- platform: status_led
   # id: light_red
    #name: "Red led"
    #pin: P11
    #restore_mode: RESTORE_DEFAULT_OFF
  - platform: binary
    name: "Status led"
    id: blue_led
    output: output_blue_led
    restore_mode: RESTORE_DEFAULT_OFF
    internal: true

output:
  - platform: gpio
    id: output_blue_led
    pin: P6
    inverted: true

select:
  - platform: template
    name: "Status led mode"
    id: status_led_mode
    optimistic: true
    restore_value: True
    entity_category: CONFIG
    update_interval: never
    options:
      - "Normal"
      - "Invert"
      - "Off"
    initial_option: "Normal"
    on_value:
      script.execute: set_status_led

script:
  - id: set_status_led
    then:
      - if:
          condition:
            lambda: |-
              return strcmp(id(status_led_mode).state.c_str(), "Normal") == 0;
          then:
            if:
              condition:
                switch.is_on: switch_1
              then:
                light.turn_on: blue_led
              else:
                light.turn_off: blue_led
      - if:
          condition:
            lambda: |-
              return strcmp(id(status_led_mode).state.c_str(), "Invert") == 0;
          then:
            if:
              condition:
                switch.is_on: switch_1
              then:
                light.turn_off: blue_led
              else:
                light.turn_on: blue_led
      - if:
          condition:
            lambda: |-
              return strcmp(id(status_led_mode).state.c_str(), "Off") == 0;
          then:
            light.turn_off: blue_led
    

Désolé si c’est mal formaté c’est mon premier post ici…

Et mon fichier LSC Powerplug 001 avec la calibration que j’ai du revoir :

substitutions:
  device_name: lsc-powerplug-001
  friendly_name: LSC Powerplug 001
  voltage_divider: '889.9949453389166'
  current_resistor: '0.0009779087400055143'
  current_multiply: '0.463454471212' 

<<: !include lsc-smart-power-plug.yaml

Voilà j’éspère que ça pourra en aider d’autres autant que ce tuto m’a aider.

Merci Jquintard et merci nkuehnel86 d’Elektroda.

Bonjour,

Je suis en train de tenter la même chose sur la multiprise LSC Smart de chez Action également. Le pont diviseur de tension est assez visible pour relever les résistances et calculer la valeur de voltage_divider. Par contre, j’ai 6 à 8% d’erreur. Quelqu’un saurait me dire s’il faut corriger d’un coeff autre que les valeurs de résistances ?

Une fois ce point éclairci je pourrais faire un petit pour la multiprise également

Bonne journée

Merci pour ce tuto.
Suivi à la lettre et tout fonctionne parfaitement :+1:

Bonjour,

Merci pour le tuto qui m'a été bien utile.

J'ai tout récemment racheté des prises et ai constaté qu'il y a une nouvelle version avec un chip différent (le bk7238).
Ce chip est en cours de validation sur esphomeet n'est pas encore intégré dans ltchiptool.
Afin de pouvoir flasher le chip, j'ai dû adapter la procédure.

J'ai acheté 3 prises, 2 étaient équipées du nouveau chip l'autre avait l'ancien… Donc j'imagine que c'est tout récent.

Petite remarque en passant, ils ont mis une espèce de mastic sanitaire dégeulasse (cf photos), cela complique un poil le démontage mais rien d'insurmontable.

Je me suis en partie basé sur des ressources glanées sur esphome (désolé je ne peux pas vous mettre le lien le système me l'interdit ... une recherche sur lsc-plug-32020872 devrait vous aider à trouver la page)

J'ai utilisé le template suivant:
(tous les champs entre < > doivent être adaptés: <votre clé d'encryption>, <un mot de passe>, <votre ssid>, <mot de passe wifi> et <password ap> )

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  platformio_options:
    custom_versions.beken-bdk: 3.0.78

bk72xx:
  board: generic-bk7238-tuya
  family: BK7238
  framework:
    version: 0.0.0
    source: https://github.com/libretiny-eu/libretiny#feature/bk7238

logger:
  baud_rate: 0

web_server:
  port: 80

captive_portal:

mdns:

api:
  encryption:
    key: "<votre clé d'encryption>"

ota:
  - platform: esphome
    password: "<un mot de passe>"

wifi:
  networks:
    - ssid: <votre ssid>
      password: <mot de passe wifi>
  ap:
    ssid: "Action-Smart-Power-Plug"
    password: "<password ap>"

status_led:
  pin:
    number: P11
    inverted: true

output:
  - platform: gpio
    id: relay_led_output
    pin:
      number: P9
      inverted: true

switch:
  - platform: gpio
    name: "None"
    id: relay_1
    pin:
      number: P24
    restore_mode: RESTORE_DEFAULT_OFF
    on_turn_on:
      - output.turn_on: relay_led_output
    on_turn_off:
      - output.turn_off: relay_led_output

binary_sensor:
  - platform: gpio
    name: Button
    id: button_1
    internal: true
    pin:
      number: P26
      inverted: true
      mode: INPUT_PULLUP
    on_press:
      - switch.toggle: relay_1
  - platform: status
    name: Status
    entity_category: diagnostic

sensor:
  - platform: internal_temperature
    name: Internal Temperature
    entity_category: diagnostic
  - platform: hlw8012
    model: BL0937
    sel_pin:
      number: P1
      inverted: true
    cf_pin:
      number: P6
      inverted: true
    cf1_pin:
      number: P8
      inverted: true
    current_resistor: ${current_resistor}
    voltage_divider: ${voltage_divider}
    current:
      name: Current
      id: plug_current
      unit_of_measurement: A
      accuracy_decimals: 3
      filters:
        - multiply: ${current_multiply}
    voltage:
      name: Voltage
      id: plug_voltage
      unit_of_measurement: V
      accuracy_decimals: 1
    power:
      name: Power
      id: plug_power
      unit_of_measurement: W
      accuracy_decimals: 1
    energy:
      name: Energy
      id: plug_energy
      unit_of_measurement: kWh
      accuracy_decimals: 3
      filters:
        - multiply: 0.001
    update_interval: 2s
    change_mode_every: 2
  - platform: wifi_signal
    name: WiFi Signal
    entity_category: diagnostic
    update_interval: 60s
  - platform: uptime
    name: Uptime
    entity_category: diagnostic

text_sensor:
  - platform: wifi_info
    ip_address:
      name: IP Address
    ssid:
      name: Connected SSID

button:
  - platform: restart
    name: Restart
    entity_category: diagnostic

Pour le flashing. ltchiptool ne reconnait pas encore le nouveau chip.
J'ai donc utilisé bk7231tools

Après compilation dans ESP Home Builder
il faut télécharger le binaire Beken (extension rbl)

On obtient un fichier du type lsc_powerplug_new_xxxxxxxxx-image_bk7238_app.0x011000.rbl
Notez bien l'offset: 0x011000

On en a besoin pour la commande de flashing.

Avec Python installé, on installe facilement l'utilitaire bk7231tools

pip install bk7231tools

Et on flashe avec la commande suivante

bk7231tools write_flash -d COM4 -s 0x11000 -S 0 lsc_powerplug_new_xxxxxxxxx-image_bk7238_app.0x011000.rbl

Une fois lancée, ne pas oublier de reset en mettant CEN à la masse un instant
Si cela ne fonctionne pas, recommencer, l'idéal est de maintenir le contact un peu moins d'une seconde.

Vous aurez ensuite les infos suivantes lors du flashing

BK72xx connected - protocol: FULL, chip: BK7238, bootloader: BK7238_T1_2_0_0, chip ID: 0x7238, boot version: None
Connected! Chip info: BK7238 / Flash ID: 85 20 15 / Flash size: 0x200000 / Protocol: FULL
Writing 1150832 bytes to 0x11000
Trying to unprotect flash memory...
Erasing and writing at 0x11000 (0.00%)
 - Checking block pre-erase @ 0x11000
 - Trying to erase block @ 0x11000
 - Checking block post-erase @ 0x11000
 - Erase succeeded @ 0x11000
Erasing and writing at 0x12000 (0.36%)
Erasing and writing at 0x13000 (0.71%)
Erasing and writing at 0x14000 (1.07%)
Erasing and writing at 0x15000 (1.42%)
Erasing and writing at 0x16000 (1.78%)
Erasing and writing at 0x17000 (2.14%)
Erasing and writing at 0x18000 (2.49%)
Erasing and writing at 0x19000 (2.85%)
Erasing and writing at 0x1A000 (3.20%)
Erasing and writing at 0x1B000 (3.56%)
Erasing and writing at 0x1C000 (3.92%)
Erasing and writing at 0x1D000 (4.27%)
Erasing and writing at 0x1E000 (4.63%)
Erasing and writing at 0x1F000 (4.98%)
Erasing and writing at 0x20000 (5.34%)
Erasing and writing at 0x21000 (5.69%)
Erasing and writing at 0x22000 (6.05%)
Erasing and writing at 0x23000 (6.41%)
Erasing and writing at 0x24000 (6.76%)
Erasing and writing at 0x25000 (7.12%)
Erasing and writing at 0x26000 (7.47%)
Erasing and writing at 0x27000 (7.83%)
Erasing and writing at 0x28000 (8.19%)
Erasing and writing at 0x29000 (8.54%)
Erasing and writing at 0x2A000 (8.90%)
Erasing and writing at 0x2B000 (9.25%)
Erasing and writing at 0x2C000 (9.61%)
Erasing and writing at 0x2D000 (9.97%)
Erasing and writing at 0x2E000 (10.32%)
Erasing and writing at 0x2F000 (10.68%)
Erasing and writing at 0x30000 (11.03%)
Erasing and writing at 0x31000 (11.39%)
Erasing and writing at 0x32000 (11.75%)
Erasing and writing at 0x33000 (12.10%)
Erasing and writing at 0x34000 (12.46%)
Erasing and writing at 0x35000 (12.81%)
Erasing and writing at 0x36000 (13.17%)
Erasing and writing at 0x37000 (13.52%)
Erasing and writing at 0x38000 (13.88%)
Erasing and writing at 0x39000 (14.24%)
Erasing and writing at 0x3A000 (14.59%)
Erasing and writing at 0x3B000 (14.95%)
Erasing and writing at 0x3C000 (15.30%)
Erasing and writing at 0x3D000 (15.66%)
Erasing and writing at 0x3E000 (16.02%)
Erasing and writing at 0x3F000 (16.37%)
Erasing and writing at 0x40000 (16.73%)
Erasing and writing at 0x41000 (17.08%)
Erasing and writing at 0x42000 (17.44%)
Erasing and writing at 0x43000 (17.80%)
Erasing and writing at 0x44000 (18.15%)
Erasing and writing at 0x45000 (18.51%)
Erasing and writing at 0x46000 (18.86%)
Erasing and writing at 0x47000 (19.22%)
Erasing and writing at 0x48000 (19.58%)
Erasing and writing at 0x49000 (19.93%)
Erasing and writing at 0x4A000 (20.29%)
Erasing and writing at 0x4B000 (20.64%)
Erasing and writing at 0x4C000 (21.00%)
Erasing and writing at 0x4D000 (21.35%)
Erasing and writing at 0x4E000 (21.71%)
Erasing and writing at 0x4F000 (22.07%)
Erasing and writing at 0x50000 (22.42%)
Erasing and writing at 0x51000 (22.78%)
Erasing and writing at 0x52000 (23.13%)
Erasing and writing at 0x53000 (23.49%)
Erasing and writing at 0x54000 (23.85%)
Erasing and writing at 0x55000 (24.20%)
Erasing and writing at 0x56000 (24.56%)
Erasing and writing at 0x57000 (24.91%)
Erasing and writing at 0x58000 (25.27%)
Erasing and writing at 0x59000 (25.63%)
Erasing and writing at 0x5A000 (25.98%)
Erasing and writing at 0x5B000 (26.34%)
Erasing and writing at 0x5C000 (26.69%)
Erasing and writing at 0x5D000 (27.05%)
Erasing and writing at 0x5E000 (27.41%)
Erasing and writing at 0x5F000 (27.76%)
Erasing and writing at 0x60000 (28.12%)
Erasing and writing at 0x61000 (28.47%)
Erasing and writing at 0x62000 (28.83%)
Erasing and writing at 0x63000 (29.19%)
Erasing and writing at 0x64000 (29.54%)
Erasing and writing at 0x65000 (29.90%)
Erasing and writing at 0x66000 (30.25%)
Erasing and writing at 0x67000 (30.61%)
Erasing and writing at 0x68000 (30.96%)
Erasing and writing at 0x69000 (31.32%)
Erasing and writing at 0x6A000 (31.68%)
Erasing and writing at 0x6B000 (32.03%)
Erasing and writing at 0x6C000 (32.39%)
Erasing and writing at 0x6D000 (32.74%)
Erasing and writing at 0x6E000 (33.10%)
Erasing and writing at 0x6F000 (33.46%)
Erasing and writing at 0x70000 (33.81%)
Erasing and writing at 0x71000 (34.17%)
Erasing and writing at 0x72000 (34.52%)
Erasing and writing at 0x73000 (34.88%)
Erasing and writing at 0x74000 (35.24%)
Erasing and writing at 0x75000 (35.59%)
Erasing and writing at 0x76000 (35.95%)
Erasing and writing at 0x77000 (36.30%)
Erasing and writing at 0x78000 (36.66%)
Erasing and writing at 0x79000 (37.02%)
Erasing and writing at 0x7A000 (37.37%)
Erasing and writing at 0x7B000 (37.73%)
Erasing and writing at 0x7C000 (38.08%)
Erasing and writing at 0x7D000 (38.44%)
Erasing and writing at 0x7E000 (38.79%)
Erasing and writing at 0x7F000 (39.15%)
Erasing and writing at 0x80000 (39.51%)
Erasing and writing at 0x81000 (39.86%)
Erasing and writing at 0x82000 (40.22%)
Erasing and writing at 0x83000 (40.57%)
Erasing and writing at 0x84000 (40.93%)
Erasing and writing at 0x85000 (41.29%)
Erasing and writing at 0x86000 (41.64%)
Erasing and writing at 0x87000 (42.00%)
Erasing and writing at 0x88000 (42.35%)
Erasing and writing at 0x89000 (42.71%)
Erasing and writing at 0x8A000 (43.07%)
Erasing and writing at 0x8B000 (43.42%)
Erasing and writing at 0x8C000 (43.78%)
Erasing and writing at 0x8D000 (44.13%)
Erasing and writing at 0x8E000 (44.49%)
Erasing and writing at 0x8F000 (44.85%)
Erasing and writing at 0x90000 (45.20%)
Erasing and writing at 0x91000 (45.56%)
Erasing and writing at 0x92000 (45.91%)
Erasing and writing at 0x93000 (46.27%)
Erasing and writing at 0x94000 (46.63%)
Erasing and writing at 0x95000 (46.98%)
Erasing and writing at 0x96000 (47.34%)
Erasing and writing at 0x97000 (47.69%)
Erasing and writing at 0x98000 (48.05%)
Erasing and writing at 0x99000 (48.40%)
Erasing and writing at 0x9A000 (48.76%)
Erasing and writing at 0x9B000 (49.12%)
Erasing and writing at 0x9C000 (49.47%)
Erasing and writing at 0x9D000 (49.83%)
Erasing and writing at 0x9E000 (50.18%)
Erasing and writing at 0x9F000 (50.54%)
Erasing and writing at 0xA0000 (50.90%)
Erasing and writing at 0xA1000 (51.25%)
Erasing and writing at 0xA2000 (51.61%)
Erasing and writing at 0xA3000 (51.96%)
Erasing and writing at 0xA4000 (52.32%)
Erasing and writing at 0xA5000 (52.68%)
Erasing and writing at 0xA6000 (53.03%)
Erasing and writing at 0xA7000 (53.39%)
Erasing and writing at 0xA8000 (53.74%)
Erasing and writing at 0xA9000 (54.10%)
Erasing and writing at 0xAA000 (54.46%)
Erasing and writing at 0xAB000 (54.81%)
Erasing and writing at 0xAC000 (55.17%)
Erasing and writing at 0xAD000 (55.52%)
Erasing and writing at 0xAE000 (55.88%)
Erasing and writing at 0xAF000 (56.23%)
Erasing and writing at 0xB0000 (56.59%)
Erasing and writing at 0xB1000 (56.95%)
Erasing and writing at 0xB2000 (57.30%)
Erasing and writing at 0xB3000 (57.66%)
Erasing and writing at 0xB4000 (58.01%)
Erasing and writing at 0xB5000 (58.37%)
Erasing and writing at 0xB6000 (58.73%)
Erasing and writing at 0xB7000 (59.08%)
Erasing and writing at 0xB8000 (59.44%)
Erasing and writing at 0xB9000 (59.79%)
Erasing and writing at 0xBA000 (60.15%)
Erasing and writing at 0xBB000 (60.51%)
Erasing and writing at 0xBC000 (60.86%)
Erasing and writing at 0xBD000 (61.22%)
Erasing and writing at 0xBE000 (61.57%)
Erasing and writing at 0xBF000 (61.93%)
Erasing and writing at 0xC0000 (62.29%)
Erasing and writing at 0xC1000 (62.64%)
Erasing and writing at 0xC2000 (63.00%)
Erasing and writing at 0xC3000 (63.35%)
Erasing and writing at 0xC4000 (63.71%)
Erasing and writing at 0xC5000 (64.06%)
Erasing and writing at 0xC6000 (64.42%)
Erasing and writing at 0xC7000 (64.78%)
Erasing and writing at 0xC8000 (65.13%)
Erasing and writing at 0xC9000 (65.49%)
Erasing and writing at 0xCA000 (65.84%)
Erasing and writing at 0xCB000 (66.20%)
Erasing and writing at 0xCC000 (66.56%)
Erasing and writing at 0xCD000 (66.91%)
Erasing and writing at 0xCE000 (67.27%)
Erasing and writing at 0xCF000 (67.62%)
Erasing and writing at 0xD0000 (67.98%)
Erasing and writing at 0xD1000 (68.34%)
Erasing and writing at 0xD2000 (68.69%)
Erasing and writing at 0xD3000 (69.05%)
Erasing at 0xD4000 (69.40%)
Erasing at 0xD5000 (69.76%)
Erasing at 0xD6000 (70.12%)
Erasing at 0xD7000 (70.47%)
Erasing at 0xD8000 (70.83%)
Erasing at 0xD9000 (71.18%)
Erasing at 0xDA000 (71.54%)
Erasing at 0xDB000 (71.90%)
Erasing at 0xDC000 (72.25%)
Erasing at 0xDD000 (72.61%)
Erasing at 0xDE000 (72.96%)
Erasing at 0xDF000 (73.32%)
Erasing at 0xE0000 (73.67%)
Erasing at 0xE1000 (74.03%)
Erasing at 0xE2000 (74.39%)
Erasing at 0xE3000 (74.74%)
Erasing at 0xE4000 (75.10%)
Erasing at 0xE5000 (75.45%)
Erasing at 0xE6000 (75.81%)
Erasing at 0xE7000 (76.17%)
Erasing at 0xE8000 (76.52%)
Erasing at 0xE9000 (76.88%)
Erasing at 0xEA000 (77.23%)
Erasing at 0xEB000 (77.59%)
Erasing at 0xEC000 (77.95%)
Erasing at 0xED000 (78.30%)
Erasing at 0xEE000 (78.66%)
Erasing at 0xEF000 (79.01%)
Erasing at 0xF0000 (79.37%)
Erasing at 0xF1000 (79.73%)
Erasing at 0xF2000 (80.08%)
Erasing at 0xF3000 (80.44%)
Erasing at 0xF4000 (80.79%)
Erasing at 0xF5000 (81.15%)
Erasing at 0xF6000 (81.50%)
Erasing at 0xF7000 (81.86%)
Erasing at 0xF8000 (82.22%)
Erasing at 0xF9000 (82.57%)
Erasing at 0xFA000 (82.93%)
Erasing at 0xFB000 (83.28%)
Erasing at 0xFC000 (83.64%)
Erasing at 0xFD000 (84.00%)
Erasing at 0xFE000 (84.35%)
Erasing at 0xFF000 (84.71%)
Erasing at 0x100000 (85.06%)
Erasing at 0x101000 (85.42%)
Erasing at 0x102000 (85.78%)
Erasing at 0x103000 (86.13%)
Erasing at 0x104000 (86.49%)
Erasing at 0x105000 (86.84%)
Erasing at 0x106000 (87.20%)
Erasing at 0x107000 (87.56%)
Erasing at 0x108000 (87.91%)
Erasing at 0x109000 (88.27%)
Erasing at 0x10A000 (88.62%)
Erasing at 0x10B000 (88.98%)
Erasing at 0x10C000 (89.34%)
Erasing at 0x10D000 (89.69%)
Erasing at 0x10E000 (90.05%)
Erasing at 0x10F000 (90.40%)
Erasing at 0x110000 (90.76%)
Erasing at 0x111000 (91.11%)
Erasing at 0x112000 (91.47%)
Erasing at 0x113000 (91.83%)
Erasing at 0x114000 (92.18%)
Erasing at 0x115000 (92.54%)
Erasing at 0x116000 (92.89%)
Erasing at 0x117000 (93.25%)
Erasing at 0x118000 (93.61%)
Erasing at 0x119000 (93.96%)
Erasing at 0x11A000 (94.32%)
Erasing at 0x11B000 (94.67%)
Erasing at 0x11C000 (95.03%)
Erasing at 0x11D000 (95.39%)
Erasing at 0x11E000 (95.74%)
Erasing at 0x11F000 (96.10%)
Erasing at 0x120000 (96.45%)
Erasing at 0x121000 (96.81%)
Erasing at 0x122000 (97.17%)
Erasing at 0x123000 (97.52%)
Erasing at 0x124000 (97.88%)
Erasing at 0x125000 (98.23%)
Erasing at 0x126000 (98.59%)
Erasing at 0x127000 (98.94%)
Erasing at 0x128000 (99.30%)
Erasing and writing at 0x129000 (99.66%)
OK!
[grid]
![lsc1|324x500](upload://wqEa0Q7Xbk7fIeQBtKWK4B6f6hh.jpeg)
![lsc2|573x500](upload://lxvlDjej5yF8TBFYNPqhFRVyNQv.jpeg)
![lsc3|391x500](upload://eTr12rddkslHadulnrpY3xJ98yg.jpeg)
![lsc4|455x499](upload://h2FB1oFb4qUV12K9UaUPctehVmz.jpeg)
![lsc5|426x500](upload://wrNvSvUFS3wBkms5NtGsCN04VVx.jpeg)
![lsc6|442x500](upload://sjpycbEZdqK5mkOiDcXMSnwrHd3.jpeg)
[/grid]

Voilà en espérant que cela dépannera. Cette manip est vouée à évoluer dès que le support du bk7238 sera intégré dans ltchiptool et validé dans esphome.