[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.

11 « J'aime »

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…