Intégration SPA KL8300 dans Home Assistant via ESP32/ESPHome — Reverse Engineering complet

Bonjour à tous,

Je partage aujourd’hui un projet d’intégration complet d’un spa KL8300 (contrôleur très répandu en France) dans Home Assistant, réalisé entièrement en reverse engineering.

L’objectif était simple : pouvoir contrôler et superviser mon spa depuis Home Assistant, sans modifier le contrôleur d’origine, sans fil supplémentaire visible, et avec un retour d’état en temps réel.

Le résultat : 8 fonctions contrôlables :

  • Pompe 1,
  • Pompe 2,
  • Chauffage,
  • Blower, LED,
  • Filtration,
  • Panneau,
  • Température et lecture de la température de l’eau, le tout via une platine ESP32 maison connectée au bus interne du spa.

Bus KEY (injection active) :

Le spa utilise une matrice clavier pour détecter les appuis boutons. En insérant des switches en série sur les lignes de la matrice, l’ESP32 simule des appuis pour contrôler les équipements.

Mapping bus KEY :

Firmware et ESPHome :

Un fichier header C++ inclus dans ESPHome, tournant en tâche FreeRTOS sur le core 0 pour ne pas bloquer le WiFi. Il gère :

Côté Home Assistant :

  • switch avec retour d’état réel (vérifie l’état avant d’envoyer)

  • binary sensorpour chaque équipement

  • sensor température + signal WiFi + uptime

Outils utilisés :

  1. Saleae Logic - capture et décodage du protocole TM1668 (absolument indispensable)
  2. ESPHome - framework firmware ESP32

Les erreurs à ne PAS reproduire :

C’est la partie la plus utile du retour d’expérience. J’en ai fait quelques-unes bien mémorables :

1. Court-circuit 5V -3.3V-panne WiFi immédiate

Le circuit utilise deux tensions : +5V pour les switches et +3.3V pour les buffers. Un cavalier de soudure mal placé les a reliés ensemble. Résultat : le WiFi de l’ESP32 ne fonctionnait plus du tout. Pas de message d’erreur, juste… silence. Vérifier l’isolation entre les deux rails avant toute mise sous tension.

2. GPIO12 — la broche piégée de l’ESP32

GPIO12 contrôle la tension du flash au démarrage de l’ESP32. Si elle est HIGH au boot, l’ESP32 refuse de démarrer correctement.

Sur mon premier ESP32, j’ai dû brûler un eFuse pour fixer ça définitivement (opération irréversible via espefuse.py).

Quand cet ESP32 est tombé en panne et que je l’ai remplacé, le nouvel ESP32 est vierge, sans eFuse. La solution propre sur le nouveau : s’assurer que GPIO12 est maintenu LOW au démarrage (diviseur 10k/20k vers GND), ce qui satisfait le strapping sans toucher aux eFuses.

À retenir : ne jamais connecter GPIO12 avec un pull-up externe. Préférer un pull-down ou utiliser un autre GPIO si possible.

3. La résistance de trop sur le signal CLK

Une résistance 4.7kΩ traînait sur le signal CLK (GPIO5) vestige d’un câblage antérieur. Elle chargeait suffisamment le signal pour que le buffer 74HC125 ne le lise plus. Des heures de debug pour trouver ça. Vérifier qu’il n’y a pas de résistance parasite sur les lignes de signal.

4. La broche OE du buffer 74HC125 laissée flottante

Le 74HC125 a une broche « Output Enable » active LOW. Si elle est flottante, le buffer ne laisse rien passer, le signal CLK restait bloqué à HIGH, GPIO5 ne voyait rien. Toujours relier les broches /OE à GND ou à un GPIO de contrôle.

5. CS et STB confondus faux signal capturé

Sur le bus LCD, deux signaux ressemblent à un chip select. J’ai pris le mauvais pendant un moment. La clé : compter les transitions. Le vrai signal de framing fait 238 transitions là où l’autre n’en fait que 4. Analyser les compteurs de transitions dans Saleae avant de configurer le décodeur.

6. GPIO13 et GPIO14 déjà câblés sur le PCB

Quand j’ai voulu ajouter GPIO22 et GPIO23 pour le chauffage et le Temp+, j’ai réalisé que GPIO13 et GPIO14 étaient déjà câblés ailleurs sur ma platine. Impossible de les réutiliser. Solution : fils volants ajoutés à la main sur le PCB. Cartographier tous les GPIOs utilisés AVANT de concevoir le PCB.

7. Alimenter l’ESP32 par USB ET par le circuit en même temps

Pendant les tests, j’avais l’USB branché pour les logs ET la platine alimentée par le HLK-PM01. Les deux alimentations se battent via le régulateur interne de l’ESP32. Une seule source d’alimentation à la fois.

8. Tester l’injection sans valider le passthrough d’abord

La platine est intercalée dans le câble du spa. Si la platine plante, le spa ne répond plus du tout. J’ai toujours validé que les signaux passaient correctement en lecture seule AVANT d’activer l’injection. Tester le passthrough en premier, l’injection en dernier.

Photos des connecteurs ou viens s’incérer le montage (1 key - 2 lcd) :

Si d’autres ont un spa KL8300 ou un contrôleur similaire utilisant le TM1668, Le protocole LCD devrait être identique.

Bonjour je débute dans home assistant, je suis avec attention ton intégration car j'ai egalement un spa avec la meme carte que j'aimerais intégrer dans home assistant

Bonjour,

Ca y est ce projet est enfin terminé et opérationnel, pour rappel le SPA KL8300 est entièrement pilotable depuis Home Assistant :

  • contrôle pompes 1 et 2
  • chauffage
  • filtration
  • éclairages Led
  • blower
  • réglage de la température souhaitée
  • affichage de la température réelle de l'eau ainsi que de la température souhaitée

Le montage se branche entre le panneau et la carte avec les connecteurs d'origine : pas de soudure, pas de câble coupé, et c'est réversible

Automatisation pour la filtration, chauffage, notifications, etc.

Le rendu dans Home assistant :

J'en ai aussi profité pour créer une petite application qui permet de contrôler le spa en local sur une page web sur le réseau :

Bonjour,

j'ai un spa Ethink avec un clavier KL8-3, et a priori un boîtier KL8300, que je vérifie. Votre projet m'intéresse beaucoup pour piloter le chauffage du spa selon le surplus de mes panneaux solaires via Home Assistant. Serait-il possible d'obtenir le schéma de la platine, la liste des composants et le code ESPHome ? Merci pour ce partage très détaillé.

Bonjour, merci pour votre intérêt ! Le pilotage du chauffage selon le surplus solaire est justement une des automatisations que j'utilise.
En revanche, je ne diffuse plus le schéma ni le code pour le moment : le projet a énormément évolué depuis ce fil (nouvelle carte, firmware entièrement revu, alimentation directe par le spa, compatibilité étendue à d'autres claviers), et la version d'origine n'est plus représentative. Je donnerai des nouvelles ici quand la nouvelle version sera prête.
Pour savoir si votre spa serait compatible, pouvez-vous me transmettre en message privé :
la référence exacte du boîtier de commande (étiquette sur le boîtier) et celle du clavier
une photo du clavier allumé et une photo de la carte electronique a l'arrière.

Merci beaucoup pour votre retour ! Mon compte est trop récent pour envoyer des messages privés : pourriez-vous m'en envoyer un, afin que je vous transmette les références et les photos ? Je suis d'ailleurs prêt à vous acheter la solution complète si vous le préférez.

Bonjour je suis intéressé aussi pour l’achat de votre travail et votre développement.