LiXee-Box est une passerelle multi-protocole pour appareils Zigbee, conçue pour être un hub central de gestion de l'énergie et de domotique. Cette application transforme votre LiXee-ZiWifi32 en une passerelle complète capable de gérer vos appareils Zigbee, votre Linky, compteur de production, gaz, eau, et d'intégrer le tout dans votre système domotique.
Cette application fonctionne avec :
- LiXee-ZiWifi32 Lite (WiFi uniquement)
- Basé sur ESP32-S3-WROOM-N16R8 (PSRAM : 8MB Flash : 16MB)
- Équipé d'un module JN5189 exécutant le firmware ZiGate v2
Note : Vous pouvez également utiliser ce code avec d'autres cartes ESP32S3, selon les connexions de broches de votre carte.
![]() |
|
- Relais longue distance : Linky (ZLinky) ↔ Zigbee ↔ LiXee-Box ↔ WiFi ↔ MQTT ↔ Home-Assistant/Jeedom/Domoticz
- Passerelle cloud : Relayer les données des appareils Zigbee vers des services web via API
- Gestion énergétique avancée : Surveillance, délestage de charge, routage énergétique
La fonctionnalité principale est de relayer les données des appareils Zigbee vers un site web ou un service MQTT
L'appareil peut être configuré via un site web local
- Création et gestion d'objets Zigbee
- Modèles personnalisables pour différents types d'appareils
- Gestion des états et actions
- Historique des données pour les appareils de puissance et d'énergie
- Mises à jour OTA (Over-The-Air) automatiques et manuelles
- Tableau de bord énergétique avec jauges et graphiques
- Surveillance de la consommation en temps réel
- Graphiques de tendance et historiques
- Données Linky intégrées
- MQTT : Serveur/port/utilisateur/mot de passe personnalisables
- MQTT Discovery compatible avec Home Assistant
- WebPush API : URL/utilisateur/mot de passe
- Règles automatisées pour le délestage de charge et le routage énergétique
- Seuils configurables avec actions automatiques
- Gestion de la production et distribution d'énergie
- Gestion tarifaire pour l'énergie, la production, le gaz et l'eau
- Sauvegarde/restauration de configuration
- Mode développeur pour le débogage
L'interface de mise à jour vous permet de maintenir votre LiXee-Box à jour avec les dernières fonctionnalités.
Le processus d'appairage est simplifié avec un assistant pas à pas pour connecter vos appareils Zigbee.
Interface complète pour configurer et surveiller tous vos appareils Zigbee connectés.
Tableau de bord complet avec visualisation en temps réel de votre consommation énergétique, graphiques historiques et interface mobile responsive.
La LiXee-Box permet de récupérer la production d'énergie.
Au travers du ZLinky, il est possible de récupérer les données d'injection et l'index de production dans les cas suivant :
- Le Linky est en mode standard
- vous avez un contrat avec EDF OA Ces conditions sont nécessaires pour que votre Linky soit en mode Producteur
Il suffit donc de paramétrer dans Config --> Energie puis sélectionner dans l'onglet Production le ZLinky qui est mode production.
PS : Dans certaines configurations, il y a 2x Linky dont 1x Linky dédié à la production. Il faudra alors brancher et jumeler un autre ZLinky que celui dédié à la consommation
Si vous possédez des panneaux photovoltaïques sans contrat, le Linky ne pourra pas être paramétrer en mode Producteur par votre fournisseur d'énergie.
Cependant, il sera possible de détecter une sur production lorsque votre production sera supérieure à votre consommation. Dans ce cas, la LiXee-Box pourra déterminer la puissance d'injection sur le réseau et agir en conséquence.
En effet, cette information vous permettra de lancer des machines, enclencher votre chauffe-eau ou encore recharger votre véhicule électrique.
Voici les conditions permettant de détecter une surproduction sur votre Linky
- une puissance apparente à 0 VA
- une intensité > 0 A
Si ce cas arrive, vous aurez sur le graphique de puissance les données d'injection.
Pour accéder à toutes les règles, il faut suivre Config --> Règles
La page permet de suivre la liste des règles avec leur état et la date de dernière exécution.
Vous pourrez créer, modifier ou supprimer une règle.
- Les règles sont stockées dans un fichier JSON.
- Une règle peut contenir une ou plusieurs conditions.
- Une règle peut contenir une ou plusieurs actions.
- Une règle peut intégrer une plage horaire (Optionnel)
Voici la structure :
├── Rule
│ ├── name
| ├── TimeRanges
│ │ ├── startTime
│ │ ├── endTime
│ │ ├── days[...] //1,2,3,4,5,6,7
│ ├── conditions
│ │ ├── type
│ │ ├── IEEE
│ │ ├── cluster
│ │ ├── attribut
│ │ ├── operator
│ │ ├── value
│ │ ├── logic
│ ├── actions
│ │ ├── type
│ │ ├── IEEE
│ │ ├── endpoint
│ │ ├── value
| Paramètre | Obligatoire | Type | Valeur | Commentaire |
|---|---|---|---|---|
type |
✓ | String | "device" | |
IEEE |
✓ | String | Adresse MAC sans ':' ou '-' | |
cluster |
✓ | Decimal | ID du cluster en décimal | |
attribut |
✓ | Decimal | Numéro d'attribut | |
operator |
✓ | String | "<", ">", "==", "!=", ">=", "<=" | |
value |
✓ | Decimal/String | Valeur de comparaison | Peut être un String sur les opérateurs == ou != uniquement |
logic |
String | "AND", "OR" | Uniquement pour conditions multiples |
| Paramètre | Obligatoire | Type | Valeur | Commentaire |
|---|---|---|---|---|
type |
✓ | String | "onoff" / "notification" | |
IEEE |
✓ | String | Adresse MAC sans ':' ou '-' | |
endpoint |
✓ | Decimal | ID du point de terminaison | |
value |
✓ | String | Valeur de l'action |
| Paramètre | Obligatoire | Type | Valeur | Commentaire |
|---|---|---|---|---|
startTime |
✓ | String | "HH:mm" | |
endTime |
✓ | String | "HH:mm" | |
days |
✓ | Array | [1,2,3,4,5,6,7] | Chaque chiffre correspond au numéro du jour |
Par exemple :
{
"rules":[
{
"name":"rule_1",
"conditions" : [
{
"type" : "device",
"IEEE" : "00158d0006204fcf",
"cluster" : 2820,
"attribute" : 1295,
"operator" : "<",
"value" : 1000,
"logic" : "AND"
}
],
"actions" : [
{
"type" : "onoff",
"IEEE" : "a4c138bb23185d2c",
"endpoint":1,
"value": "1"
}
]
}, {
"name":"rule_2",
"conditions" : [
{
"type" : "device",
"IEEE" : "00158d0006204fcf",
"cluster" : 2820,
"attribute" : 1295,
"operator" : ">",
"value" : 1000,
"logic" : "AND"
}
],
"actions" : [
{
"type":"notification",
"IEEE":"",
"endpoint":0,
"value":"",
"title":"🚨⚡puissance > 1000",
"message":"🚨⚡puissance > 1000"
}
]
}
]
}Les notifications permettent d'être informé ou alerté des évènements de votre habitat selon vos besoins
avec LiXee-Assist https://github.com/fairecasoimeme/LiXee-Assist
Veuillez télécharger l'application pour procéder
|
|
Scannez simplement l'appareil (avec BLE) et complétez l'appairage avec vos identifiants WiFi locaux
Avec un navigateur web
- Alimentation : Branchez l'appareil sur une alimentation USB
- WiFi : Scannez les réseaux WiFi disponibles avec votre mobile/ordinateur
- Connexion : Connectez-vous au SSID
LIXEEGW-XXXX(XXXX = partie de l'adresse MAC) - Authentification : Mot de passe par défaut
adminXXXX(XXXX = suffixe du SSID) - Configuration : Ouvrez
http://lixee-gwdans votre navigateur - WiFi Principal : Configurez votre réseau WiFi principal
- Redémarrage : L'appareil redémarre et se connecte à votre réseau
- Allez dans le menu Réseau → Zigbee
- Cliquez sur Ajouter un Appareil pour démarrer l'appairage (30 secondes)
- La LED bleue clignote lentement pendant l'appairage
- Exécutez la procédure d'appairage sur votre appareil Zigbee
Un fichier modèle est une structure JSON qui définit les états et actions d'un type d'appareil. Le nom du fichier modèle correspond à l'identification de l'appareil (en décimal). Lorsqu'un appareil Zigbee rejoint le réseau, LiXee-Box crée un objet suivant le modèle correspondant avec les états et actions, effectue les liaisons et configure les rapports si nécessaire.
Voici la structure :
├── Modèle d'appareil ou 'default'
│ ├── status
│ │ ├── name
│ │ ├── cluster
│ │ ├── attribut
│ │ ├── type
│ │ ├── unit
│ │ ├── coefficient
│ │ ├── visible
│ │ ├── jauge
│ │ ├── min
│ │ ├── max
│ │ ├── poll
│ │ ├── mqtt_device_class
│ │ ├── mqtt_state_class
│ │ ├── mqtt_icon
│ ├── action
│ │ ├── name
│ │ ├── command
│ │ ├── endpoint
│ │ ├── value
│ │ ├── visible
│ ├── bind
│ ├── report
│ │ ├── cluster
│ │ ├── attribut
│ │ ├── type
│ │ ├── min
│ │ ├── max
│ │ ├── timeout
│ │ ├── change
Vous pouvez trouver des exemples de modèles dans le répertoire data/tp
Exemple de fichier 24321.json pour l'appareil id (5F01 Hex) :
{
"lumi.sensor_switch.aq2" : [
{
"status" : [
{
"name" : "Clic",
"cluster" : "0006",
"attribut" : 0
},
{
"name" : "MultiClic",
"cluster" : "0000",
"attribut" : 32768
}
]
}
],
"default" : [
{
"status" : [
{
"name" : "Clic",
"cluster" : "0012",
"attribut" : 85
},
{
"name" : "MultiClic",
"cluster" : "0012",
"attribut" : 1293
}
]
}
]
}| Paramètre | Obligatoire | Type | Description |
|---|---|---|---|
name |
✓ | String | Nom d'affichage |
cluster |
✓ | String | ID du cluster (hex) |
attribut |
✓ | Decimal | Numéro d'attribut |
type |
String | "numeric", "float" | |
unit |
String | Unité de mesure | |
coefficient |
Float | Coefficient multiplicateur | |
jauge |
String | "Gauge", "Battery", "text" | |
visible |
Decimal | 1 (visible) ou 0 (masqué) | |
poll |
Decimal | Intervalle d'interrogation (sec) | |
mqtt_device_class |
String | Classe de périphérique MQTT pour HA | |
mqtt_state_class |
String | Classe d'état MQTT pour HA | |
mqtt_icon |
String | Icône MQTT pour HA |
| Paramètre | Obligatoire | Type | Description |
|---|---|---|---|
name |
✓ | String | Nom de l'action |
command |
✓ | Decimal | ID de commande |
endpoint |
✓ | Decimal | Numéro de point de terminaison |
value |
✓ | Decimal | Valeur à envoyer |
visible |
Decimal | 1 (visible) ou 0 (masqué) |
Liste des clusters (en numérique) qui seront liés
exemple : bind : "1026;1029;1794"
| Commande | Obligatoire | Type | Valeur | Commentaire |
|---|---|---|---|---|
cluster |
✓ | String | ID du cluster en hexadécimal | |
attribut |
✓ | Decimal | Numéro d'attribut en décimal | |
type |
✓ | Decimal | Correspond au type numérique de l'attribut | |
min |
✓ | Decimal | Temps minimum (en secondes) pour envoyer un rapport | |
max |
✓ | Decimal | Temps maximum (en secondes) pour envoyer un rapport | |
timeout |
Decimal | En millisecondes | ||
change |
Decimal | Valeur de changement pour envoyer un rapport |
Pour accéder aux commandes de l'API, allez sur http:///
curl -X GET 'https://<HOST>/getSystem'\
-u <username>:<password> \
-H 'Content-Type: application/json' \{
"network": {
"wifi": {
"enable": 1,
"connected": 1,
"mode": 0,
"ip": "192.168.0.144",
"netmask": "255.255.255.0",
"gateway": "192.168.0.254"
}
},
"system": {
"mqtt": {
"enable": 1,
"connected": 1,
"url": "192.168.0.21",
"port": 1883
},
"webpush": {
"enable": 0,
"auth": 0,
"url": ""
},
"marstek": {
"enable": 1,
"connected": 0,
"ip": ""
},
"infos": {
"t": 48.1
}
}
}curl -X GET 'https://<HOST>/getDevices'\
-u <username>:<password> \
-H 'Content-Type: application/json' \{
"00158d0006203a63": {
"1": {
"IN": "0,1,3,1026,1794",
"OUT": "4,3,1794"
},
"INFO": {
"shortAddr": "38694",
"LQI": "66",
"device_id": "263",
"lastSeen": "2025-03-14 14:40",
"Status": "00",
"manufacturer": "LiXee",
"model": "ZiPulses",
"software_version": "4000-0008"
},
"0702": {
"0": "000000000036"
},
"0402": {
"0": "09F8"
},
"0001": {
"32": "23",
"33": "C8"
}
}
}curl -X GET 'https://<HOST>/getDevice?id=04cf8cdf3c79ce2b'\
-u <username>:<password> \
-H 'Content-Type: application/json' \{
"04cf8cdf3c79ce2b": {
"1": {
"IN": "0,2,3,4,5,6,9,1794,2820",
"OUT": "10,25"
},
"242": {
"IN": "",
"OUT": "33"
},
"INFO": {
"shortAddr": "5561",
"LQI": "5C",
"device_id": "97",
"lastSeen": "2025-03-13 19:30",
"Status": "00",
"manufacturer": "LUMI",
"model": "lumi.plug.maeu01",
"software_version": "22"
}
}
}curl -X GET 'https://<HOST>/getLinky'\
-u <username>:<password> \
-H 'Content-Type: application/json' \{
"65382_768": 0,
"1794_0": 28870881,
"1794_256": 28870881,
"1794_258": 0,
"1794_260": 0,
"1794_262": 0,
"1794_264": 0,
"1794_266": 0,
"2820_1295": 1560,
"2820_1293": 0,
"1794_32": "TH..",
"1794_776": "022161823588",
"2817_13": 45,
"2817_14": 0,
"2820_1288": 6,
"2820_1290": 90,
"65382_0": "BASE",
"65382_1": "",
"65382_2": "00",
"65382_3": 0,
"65382_4": 0,
"65382_5": 0
}curl -X GET 'https://<HOST>/getTemplates'\
-u <username>:<password> \
-H 'Content-Type: application/json' \{
"24321.json": {
"lumi.sensor_switch.aq2": [
{
"status": [
{
"name": "Clic",
"cluster": "0006",
"attribut": 0
},
{
"name": "MultiClic",
"cluster": "0000",
"attribut": 32768
}
]
}
],
"default": [
{
"status": [
{
"name": "Clic",
"cluster": "0012",
"attribut": 85
},
{
"name": "MultiClic",
"cluster": "0012",
"attribut": 1293
}
]
}
]
},.........
}Installez simplement esptools et exécutez cette commande
esptool.py.exe --chip esp32s3 --port "COMXX" \
--baud 460800 \
--before default_reset --after hard_reset write_flash -z \
--flash_mode dio --flash_freq 40m --flash_size 16MB \
0x0 bootloader.bin \
0x8000 partitions.bin \
0xe000 boot_app0.bin \
0x10000 firmware.bin \
0x910000 littlefs.binesptool.py --chip esp32s3 \
--port /dev/ttyUSB0 \
--baud 460800 \
--before default-reset \
--after hard-reset \
write-flash -z \
--flash-mode dio \
--flash-freq 40m \
--flash-size 16MB \
0x0 bootloader.bin \
0x8000 partitions.bin \
0xe000 boot_app0.bin \
0x10000 firmware.bin \
0x910000 littlefs.binLiXee-Gateway est compatible avec la découverte MQTT de Home Assistant.
Allez simplement dans le menu Passerelle --> MQTT et activez la fonctionnalité
Remplissez le formulaire :
- Serveur MQTT
- Port MQTT
- Nom d'utilisateur MQTT
- Mot de passe MQTT
Puis cliquez sur Home-Assistant et Sauvegarder
Attendez un moment et si tout est correct, l'icône de connexion deviendra verte.
Ensuite, allez dans le menu Réseau --> Zigbee
Pour chaque appareil Zigbee, un nouveau bouton MQTT Discover apparaît. Veuillez cliquer dessus pour créer un nouveau périphérique sur HA. Et voilà.
Attendez un moment et allez dans vos périphériques MQTT HA :

Merci à tous les auteurs des bibliothèques tierces utilisées dans ce projet :
- espressif / arduino-esp32
- rlogiacco/CircularBuffer
- bblanchon/ArduinoJson
- paulstoffregen/Time
- marvinroger/AsyncMqttClient
- arkhipenko/TaskScheduler
- me-no-dev/AsyncTCP
- me-no-dev/ESPAsyncWebServer
Merci à ZigStar pour la mise à jour OTA
- Intégration graphique des règles
- Liste et statut des règles
- Ajout / modification / suppression
- Correction sur la RAZ des données de puissances temps réels
- Ajout de la gestion de tous les tarifs (abonnement + taxes) dans les graphes
- Optimisation des fichiers de fonctions javascript
- Correction de la progressBar pour une meilleure compatibilité mobile
- Correction du menu. Informations systèmes dans le menu A propos
- Correction divers bugs
- Ajout de la gestion de l'injection avec panneaux photovoltaïques en mode autoconsommation
- Si la production > Consommation, l'injection apparaitra dans le graphe de puissance et la jauge
- Notification paramétrage pour être averti
- Mise à jour de la librairie graphique pour plus de fonction et stabilité
- Ajout de notifications manquantes
- Correction sur la reconnexion WiFi
- Correction bug sur le budget
- Correction RAZ de l'injection
- Correction bugs mineurs
- Ajout étiquette énergétique dans le tableau d'énergie
- Ajout des aides dans le tableau d'énergie
- Restructuration du tableau d'énergie
- Ajout de la gestion des notifications
- Ajout des notifications :
- Production à Zéro
- Production > consommation
- Couleur du lendemain
- Jour rouge
- Préavis EJP
- Surtension et sous-tension d'une phase
- Dépassement de budget
- Optimisation des process (PSRAM et restructurations)
- Optimisation et correction client MQTT
- Fix Bugs
- Ajout de la valeur SHON
- Ajout d'une nouvelle fonction pour obtenir l'énergie totale
- Correction du statut de connexion WiFi
- Correction du bug de message d'alerte
- Changement vers la langue française
- Correction de bugs
- Modification de l'approvisionnement (uniquement BLE avec LiXee-Assist)
- Ajout de l'OTA pour les appareils Zigbee
- Meilleure gestion du réseau
- Correction de bugs
- Correction des valeurs signées pour MQTT HA
- Correction de la déconnexion MQTT
- Correction des problèmes de redémarrage
- Correction du graphique de puissance en temps réel
- Correction de bugs
- Ajout du service mDNS pour lixee-assist
- Ajout d'API pour configurer le WiFi
- Ajout d'une page web de sondage
- Correction du bug d'activation WiFi
- Correction du scan des réseaux WiFi
- Correction du chargement de fichier JSON vers PSRAM
- Redémarrage lors de la configuration WiFi
- Correction de fuite mémoire
- Amélioration de l'utilisation de la mémoire
- Ajout de commandes API
- Ajout de la compatibilité Marstek
- Ajout de la capacité de règles
- Ajout de la fonctionnalité Tableau de bord
- Correction de la découverte MQTT HA
- Correction de la gestion des fichiers
- Optimisation de certains traitements
- Correction de bugs
- État du réseau
- État des appareils
- Configuration WiFi
- Configuration Zigbee
- Passerelle MQTT
- Passerelle API WebPush
- Client NTP
- Sécurité HTTP
- Sauvegarde / Restauration
- Mise à jour
- ZLinky
- ZiPulses
- Prise électrique
- Tous les autres (nécessitent une mise à jour du modèle)
- Source init

















