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.