Bonjour,
Aujourd’hui, nous allons parler « Hack » des spots blancs (culot GU10) de LSC Smart Connect.
J’ai eu entre les mains deux versions d’un modèle identique : Le « ZM C21e » et le « ZM G20b ».
-
Le ZM GB20b embarque un ESP8285 via un module « TYLC5 » du Tuya, cette version ne nous intéresse pas ici (mais comme je suis sympa, j’en parle en fin d’article en bonus).
-
Le ZM C21e embarque, lui, un BK7231T via le module Tuya « WBLC5 ». C’est cette version qui nous intéresse !
À gauche, un modèle ZM GB20b avec ESP8285 et à droite, un modèle ZM C21e avec un BK7231T :
Notez quelques différences sur les PCBs, la version ZM C21e est de conception nettement plus robuste que sa version ZM GB20b, ou il est très aisé de casser le PCB en le manipulant (base du connecteur, antennes, certaines pistes, etc …).
Avertissements :
Intervenir sur un appareil qui fonctionne sur secteur présente des risques d’électrocution et d’incendie. Vous devez être formés ou, à minima, savoir ce que vous faites. En cas de doute, d’absence de formation ou d’expérience, n’intervenez pas sur un appareil qui fonctionne avec le secteur. Vous êtes seul responsables de vos actes.
Il est également 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. Une mauvaise manipulation peut « bricker » (rendre définitivement inutilisable) l’appareil, vous êtes prévenus !
Tout d’abord, il va falloir démonter l’ampoule ! Enlevez le joint de colle à l’aide d’un tournevis, en faisant attention de ne pas casser une led ou couper une piste. Vous devrez faire levier entre l’extérieur du PCB et le support en plastique. Vous devrez être précis pour ne pas casser le plastique extérieur et ni risquer de faire glisser la tête du tournevis et d’arracher une led ou une piste au passage.
Pour éviter de vous blesser (et de vous planter un tournevis dans la main), utiliser les EPIs adaptés (des gros gants en cuire par exemple) et faites attention à ce que vous faites !
Je me suis amusé à relever le schéma, nous pouvons identifier 3 cartes électroniques :
- MK-EKWIFI(2L)-GU10-DLV03
- MK-GU10(38)-2LU-16SMD-D LV01
- WBLC5
La carte « MK-EKWIFI(2L)-GU10-DLV03 » est l’alimentation, elle transforme l’alimentation secteur en 2 tensions continue : l’une à +3.3V pour l’alimentation du microcontrôleur et l’autre à environ +310V pour l’alimentation des LEDs.
Nous avons une résistance fusible, un filtre LR (L1 + RL1), un pont de diodes « MB10F », une capa de filtrage pour le +310V, un convertisseur abaisseur « BP2901 »(référence inconnue au bataillon ? je prends les infos de qui en a ) et sa ribambelle de composants. Enfin, un filtre (R3 + EC2) pour le +3.3V.
Pour « MK-GU10(38)-2LU-16SMD-D LV01 », nous avons simplement 16 diodes électroluminescentes (8 en Warm White et 8 en Cold White) et un driver de LEDs en MLI (PWM) double canaux (KP18055).
Enfin, la carte « WBLC5 » est produite par Tuya et embarque un microcontrôleur BK7231T de BEKEN, son quartz de 26MHz, quelques composants (capa et résistances) et une antenne wifi en 1/4 d’onde de longueur 28mm (30mm idéal).
Une fois que l’on a bien compris que pour prendre le contrôle des leds, il faut envoyer un signal PWM sur P26 (pour les leds en blanc froid - WW) et un signal PWM sur P24 (pour les leds en blanc chaud - CW), nous allons téléverser un nouveau programme sur la puce de BEKEN.
Vous aurez compris que nous n’allons pas téléverser un programme dans un µC aussi connu qu’un Atmel ou Espressif. Nous avons donc, en conséquence, beaucoup moins de ressources à disposition pour travailler avec. Heureusement, certaines personnes ont développées tout un tas d’outils Open Source pour travailler avec ces puces ! Et ça, c’est cool
Nous allons donc utiliser ltchiptool. Ici, je vais expliquer comment l’utiliser avec l’environnement Windows (pour les autres, il existe de très bonnes explications sur le GitHub de l’outil).
Nous allons donc préparer l’appareil à recevoir un programme. Il est très important de noter que les séries de puces BK7231 se poursuivant par un « T » (ce qui est notre cas) ne contiennent pas de ROM séparée où est chargé le bootloader (contrairement aux modèles BK7231N, etc …). Le bootloader est inscrit dans la flash et si par mégarde, il y a un incident au cours du télé-versement (programme corrompu, panne d’alimentation, appareil déconnecté en cours de téléversement, etc …), il ne sera plus possible de télé-verser un programme par cette méthode. Vous vous retrouverez avec un microcontrôleur complètement brické, bon pour la poubelle … (bon, si, il existe encore une solution (il existe toujours des solutions), il y a la possibilité de flasher l’appareil par SPI, mais vous ne voulez pas rencontrer ce cas-la …).
Pendant qu’on y est, le BK7231 est très gourmand en alimentation lors du télé-versement d’un programme ! il lui faut au moins 800mA pour l’alimentation 3.3V ! C’est à dire que si vous utilisez un FTDI, et que vous ne vous contentez que de l’alimentation en 3.3V de ce dernier (seulement 300mA), vous allez foutre en l’aire votre microcontrôleur ! On se rappelle, il n’aura pas assez de courant au cours du processus, le télé-versement va s’interrompre au milieu de la réécriture de la FLASH et comme il ne possède pas de de ROM avec son bootloader → puce brické. On utilisera donc une autre source d’alimentation en 3.3V pour le télé-versement
Pour connecter un convertisseur série à cette puce, c’est comme avec un ESP, sauf que la broche GPIO0 sera ‹ CEN › et qu’elle sera capricieuse (j’explique plus bas pourquoi).
[ RX ] -------------------------> [ TX ]
[ TX ] -------------------------> [ RX ]
[3.3V] -----> [bouton] -----> [VCC] /!\ Doit fournir 800mA MINIMUM !
[GND] ------------------------> [GND]
[GND] -----> [bouton] -----> [CEN]
Vous devrez braser les bonnes broches entre elles, à l’aide des informations données plus haut, comme ceci (Attention, les pads sont très fragiles !!! Si vous brasez un câble et que vous tirez dessus, vous arracherez la pastille et c’est poubelle ! ) :
Maintenant, vous allez vous rendre dans Home Assistant et ouvrir le module « ESPHome » (comme dans l’article : « [TUTO] Hack de prises wifi Chacon-DiO et intégration dans HA à l'aide d'ESPHome »).
Voici les instructions YAML que j’ai utilisé :
esphome:
name: light-01
friendly_name: light-01
compile_process_limit: 2
bk72xx:
board: wblc5
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "YOURAPIKEYENCRYPTION"
ota:
- platform: esphome
password: "YOUROTAPSW"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Light-01 Fallback Hotspot"
password: "12345678"
captive_portal:
output:
- platform: libretiny_pwm
id: output_c
pin: P24
- platform: libretiny_pwm
id: output_w
pin: P26
light:
- platform: monochromatic
id: led_c
output: output_c
- platform: monochromatic
id: led_w
output: output_w
# Global pour contrôler l'animation
globals:
- id: animation_active
type: bool
restore_value: no
initial_value: 'false'
# Script d'animation qui boucle tant que animation_active est vrai
script:
- id: led_animation
mode: restart
then:
- lambda: |-
// Si l'animation a été désactivée, on arrête le script
if (!id(animation_active)) return;
- light.turn_on:
id: led_c
brightness: 99%
transition_length: 4s
- delay: 4s
- lambda: |-
if (!id(animation_active)) return;
- light.turn_on:
id: led_w
brightness: 99%
transition_length: 4s
- delay: 4s
- lambda: |-
if (!id(animation_active)) return;
- light.turn_off:
id: led_c
transition_length: 4s
- delay: 4s
- lambda: |-
if (!id(animation_active)) return;
- light.turn_off:
id: led_w
transition_length: 4s
- delay: 1s
- lambda: |-
if (!id(animation_active)) return;
- script.execute: led_animation
# Switch exposé à Home Assistant pour contrôler l'animation
switch:
- platform: template
name: "Animation LEDs"
id: animation_switch
lambda: |-
return id(animation_active);
turn_on_action:
- lambda: |-
id(animation_active) = true;
- script.execute: led_animation
turn_off_action:
- lambda: |-
id(animation_active) = false;
- script.stop: led_animation
- light.turn_off:
id: led_c
transition_length: 1s
- light.turn_off:
id: led_w
transition_length: 1s
Créé un nouveau device et au moment de sélectionner le type de device, sélectionnez « BK72XX ».
Puis, sélectionnez la référence de la carte sur laquelle se trouve le microcontrôleur (ici, ça sera la WBLC5) !
En cas de doute, avec la référence du µC (pour nous la BK7231T), vous pouvez aussi choisir « Generic - BK7231T (Tuya QFN32) ».
Sélectionnez « UF2 package » :
À la fin de la procédure, vous devrez récupérer un fichier en « .uf2 » !
Maintenant, vous allez devoir installer ltchiptool.
Avec Windows, si vous choisissez d’utiliser le fichier en .exe, il est courant et connu que l’antivirus y détecte un faux positif … vous ne pourrez donc ni télécharger ou installer l’outil de cette manière.
Une méthode consiste à l’installer via python 3 et d’utiliser la version CLI ou GUI (Je détaillerais cette méthode de manière grossière, sans aller dans les détails).
Pour plus de simplicité, nous allons partir sur la version GUI.
-
Installez donc Python 3.
-
Une fois fait, ouvrez un terminal (PowerShell par exemple avec la touche « Windows » + R et taper « cmd »).
-
Maintenant que le terminal ouvert, en tapant la commande « py », vous vous assurez que python est bien installé en obtenant « Python 3.13.2 (tags/v3.13.2:4f8bb39, Feb 4 2025, 15:23:48) [MSC v.1942 64 bit (AMD64)] on win32 Type « help », « copyright », « credits » or « license » for more information. »
-
Entrez la commande « exit »
-
Installez et mettez à jour PIP avec la commande « python.exe -m pip install --upgrade pip »
-
Installez ltchiptool avec la commande « pip install ltchiptool[gui] »
-
Lancez l’interface graphique (GUI) de ltchiptool avec la commande « python -m ltchiptool gui ».
À partir d’ici, vous devrez être les plus vigilants possible ! C’est ici que vous pouvez casser votre matériel.
Vous allez donc connecter votre convertisseur série et votre système à votre ordinateur. Une fois fait, sélectionnez le baud rate sur « Auto ».
Il sera aussi une bonne idée de garder le binaire du constructeur, qui se trouve dans votre puce (au cas ou vous souhaiteriez le réinstaller, épris de remords).
Vous allez sélectionner « Read Flash » pour exporter une copie du binaire du microcontrôleur sur votre ordinateur.
Choisissez le Chip Family sur « Beken 72XX » puis cliquez sur START ! (Comme l’outil est très bien fait, vous avez un excellent guide, au cas ou mes explications ne seraient pas claires ).
À partir d’ici, c’est là que la broche CEN est capricieuse.
Tant que cette broche ne sera pas mise à l’état bas sur un timing précis, impossible de mettre le µC en mode télé-versement. Le logiciel affichera en boucle : « Connecting to the Ship », « Software reset », « Hardware reset ».
C’est ici qu’il faudra appuyer (/marteler) sur le bouton (que nous avons installé entre la broche CEN et GND) de manière aléatoire jusqu’à avoir un démarrage du mode téléversement, comme ceci :
Vous allez récupérer le fichier binaire : « ltchiptool_bk72xx_2025-03-11_20-54-51.bin ». Ce fichier permettra de revenir en arrière avec le programme d’origine du constructeur.
Maintenant, vous allez pouvoir charger le fichier en « .uf2 » que vous avez compilé avec ESPHome.
Sélectionner « Write Flash ». Dans input file, ajoutez le fichier « .uf2 ». Cliquez sur Start et remettez l’µC en mode télé-versement. Une fois le manip lancée, ne touchez plus a rien pendant le télé-versement :
Félicitations, à partir d’ici, vous allez pouvoir enlever le convertisseur série, alimenter votre système et mettre à jour vos instructions YAML via le module ESPHome par Wifi !
BONUS
En bonus, voici le schéma de la version « ZM GB20b ». Nous y retrouvons les cartes « MK-T2-2LU-WM-V02 », « MK-GU10-2LU-16SMD-WM-V01 » et « TYLC5 ».
Cette version semble beaucoup moins bien réussis d’un point de vue technique, vous devrez faire très attention en manipulant les PCB et les connecteurs, qui sont relativement très fragiles.
Vous trouverez, ci-dessous, les instructions YAML pour paramétrer cette carte à l’aide d’ESPHome. Si vous ne savez pas comment téléverser un programme dans une carte utilisant un ESP, n’hésitez pas à regarder mes précédents tuto
esphome:
name: light-01
friendly_name: light-01
compile_process_limit: 2 # Limite la charge du CPU pour ne pas faire planter HA lors de la generation et compilation de code de l'add-on ESPHome / Permets aux RPI avec peux de ressources de compiler / Param = Nb de Coeurs a mettre à dispo (Exemple : 2 = 2 coeurs à mobiliser sur 4).
esp8266:
board: esp01_1m
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "yZNtGQXGpTTDyz4voizqveMNAX28WfiT/qwl9q8dQR0="
ota:
- platform: esphome
password: "c3b4673333a563fe2262f95046fd4eb1"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Light-01 Fallback Hotspot"
password: "svMz2wxqNWR9"
output:
- platform: esp8266_pwm
id: output_c
pin: GPIO12
- platform: esp8266_pwm
id: output_w
pin: GPIO14
light:
- platform: monochromatic
id: led_c
output: output_c
- platform: monochromatic
id: led_w
output: output_w
# Global pour contrôler l'animation
globals:
- id: animation_active
type: bool
restore_value: no
initial_value: 'false'
# Script d'animation qui boucle tant que animation_active est vrai
script:
- id: led_animation
mode: restart
then:
- lambda: |-
// Si l'animation a été désactivée, on arrête le script
if (!id(animation_active)) return;
- light.turn_on:
id: led_c
brightness: 99%
transition_length: 4s
- delay: 4s
- lambda: |-
if (!id(animation_active)) return;
- light.turn_on:
id: led_w
brightness: 99%
transition_length: 4s
- delay: 4s
- lambda: |-
if (!id(animation_active)) return;
- light.turn_off:
id: led_c
transition_length: 4s
- delay: 4s
- lambda: |-
if (!id(animation_active)) return;
- light.turn_off:
id: led_w
transition_length: 4s
- delay: 1s
- lambda: |-
if (!id(animation_active)) return;
- script.execute: led_animation
# Switch exposé à Home Assistant pour contrôler l'animation
switch:
- platform: template
name: "Animation LEDs"
id: animation_switch
lambda: |-
return id(animation_active);
turn_on_action:
- lambda: |-
id(animation_active) = true;
- script.execute: led_animation
turn_off_action:
- lambda: |-
id(animation_active) = false;
- script.stop: led_animation
- light.turn_off:
id: led_c
transition_length: 1s
- light.turn_off:
id: led_w
transition_length: 1s