Suivi de filament et journal d'impressions pour imprimante 3D Creality K1SE â interface web PWA, synchronisation automatique avec Spoolman.
â ïž USAGE LOCAL UNIQUEMENT â Ce projet est conçu pour tourner sur un rĂ©seau local de confiance (votre rĂ©seau domestique). L'API n'a pas d'authentification : ne l'expose jamais sur Internet sans ajouter une protection (reverse-proxy avec mot de passe, VPN, etc.). Connexions en clair (HTTP/WebSocket) â rĂ©servĂ© Ă un usage maison.
đŹđ§ English version: README.en.md
Filament Tracker se connecte au WebSocket propriétaire (port 9999) de la K1SE (firmware CrealityOS), suit les impressions en temps réel, importe l'historique complet des impressions passées, télécharge les miniatures des modÚles, et se synchronise avec Spoolman pour gérer le décompte du filament sur chaque bobine.
Votre K1SE tourne sous CrealityOS (Klipper sans Moonraker) : il n'existe aucun moyen simple de savoir ce qui a été imprimé, combien de filament a été consommé, et quelles impressions ont échoué. Filament Tracker comble ce manque :
- Vous imprimez â le journal se remplit automatiquement (nom du fichier, statut, filament rĂ©ellement consommĂ©)
- Toutes vos impressions passĂ©es sont importĂ©es depuis l'historique de l'imprimante (terminĂ©es et arrĂȘtĂ©es)
- Vous voyez vos modÚles avec leur miniature dans l'onglet « Filaments »
- Vous associez une impression Ă une bobine â le poids restant se dĂ©compte automatiquement dans Spoolman
- Un dashboard temps réel montre l'état de l'imprimante (températures buse/plateau, fichier en cours, statistiques)
| đŻ | FonctionnalitĂ© | DĂ©tails |
|---|---|---|
| đ | Journal automatique | Chaque impression dĂ©marre une session : fichier, heure, statut (terminĂ©e / arrĂȘtĂ©e / erreur), durĂ©e, filament mesurĂ© (usedMaterialLength) |
| đ | Import rĂ©troactif | L'historique complet de l'imprimante (historyList) est importĂ© automatiquement â toutes les impressions passĂ©es apparaissent dans le journal |
| đ | Dashboard imprimante | Ătat temps rĂ©el : connexion WS, tempĂ©ratures buse/plateau, fichier en cours, statistiques globales â rafraĂźchi toutes les 6 s |
| đ | Stats mensuelles | Onglet dĂ©diĂ© : impressions / mois, filament consommĂ© (g), durĂ©e d'impression, taux de rĂ©ussite â avec graphique en barres |
| đŒïž | Miniatures des modĂšles | TĂ©lĂ©chargĂ©es depuis l'imprimante (/downloads/humbnail/*.png â oui, avec la faute de frappe du firmware !) et affichĂ©es dans l'onglet « Filaments » |
| âïž | QuantitĂ© par modĂšle | Le champ filamentWeight du slicer est lu pour chaque fichier : matiĂšre + grammes estimĂ©s + durĂ©e d'impression |
| đ§” | Association bobine â impression | Depuis le journal ou l'onglet Filaments, choisissez la bobine utilisĂ©e â dĂ©compte automatique dans Spoolman |
| đȘ | « Associer sans dĂ©compter » | Pour les bobines pesĂ©es Ă la main : les anciennes impressions ne doivent pas re-dĂ©compter leur filament (Ă©vite le double comptage). Case Ă cocher, dĂ©cochĂ©e par dĂ©faut pour les sessions historiques |
| đ± | PWA mobile | Installable sur le tĂ©lĂ©phone (Ă©cran d'accueil), interface optimisĂ©e mobile |
| đ„ïž | Mock K1 inclus | Un simulateur d'imprimante (mock_k1.py) permet de tester toute l'appli sans toucher Ă votre machine |
| đ | Reconnexion automatique | Watchdog de silence : si l'imprimante est Ă©teinte ou en veille, le collecteur se reconnecte toutes les 10 s |
| đ | Aucun doublon | L'import d'historique est idempotent et fusionne avec les sessions créées en direct |
| đ | Recherche et filtres du journal | Recherche instantanĂ©e par nom de fichier et filtre par statut, avec Ă©tats vides explicites |
| đŠ | Alertes de stock | Les bobines Ă 20 % ou moins sont signalĂ©es sur le dashboard et dans l'inventaire |
| đšïž | Vue desktop + impression | Mise en page responsive Ă©largie, contrĂŽles tactiles et feuille de style dĂ©diĂ©e Ă l'impression |
Les seuils d'alerte sont calculés cÎté interface à partir de
remaining_weight / initial_weight. Aucune donnée supplémentaire n'est écrite dans Spoolman.
âââââââââââââââââââââââââââââââ ââââââââââââââââââââââââ
â Creality K1SE (port 9999) â WS â filament-tracker â
â - Ă©tat temps rĂ©el â ââââââ¶ â collector.py â
â - liste fichiers â â - journal â
â - historique â â - API web :8123 â
â - miniatures (HTTP :80) â ââââââ¶ â - dĂ©duplication â
âââââââââââââââââââââââââââââââ ââââââââââââŹââââââââââââ
â REST
âŒ
ââââââââââââââââââââââââ
â Spoolman (port 7912)â
â bobines, poids rest.â
ââââââââââââââââââââââââ
| Service | RĂŽle | Port |
|---|---|---|
collector |
Connexion WS Ă l'imprimante, journal, API, interface PWA | 8123 |
spoolman |
Inventaire des bobines, QR codes, poids restant | 7912 |
- Docker + Docker Compose
- Une imprimante Creality K1SE accessible sur le réseau local
- (Optionnel) Spoolman dĂ©jĂ en place â le docker-compose le dĂ©ploie automatiquement
# 1. Récupérer le code
git clone <votre-url-repo>
cd filament-tracker
# 2. Configurer l'adresse de l'imprimante (optionnel : l'IP par défaut est 192.168.1.41)
echo -e "K1_HOST=192.168.1.100\nK1_PORT=9999" > .env
# 3. Lancer
docker compose up -d --buildPuis ouvrir :
- Interface web : http://:8123
- Spoolman : http://:7912
Variables d'environnement (fichier .env ou docker-compose.yml) :
| Variable | Défaut | Description |
|---|---|---|
K1_HOST |
192.168.1.41 |
Adresse IP de l'imprimante K1SE |
K1_PORT |
9999 |
Port WebSocket CrealityOS |
K1_SUBPROTOCOL |
(vide) | Sous-protocole WS (inutilisé sur K1SE, laissé pour compatibilité) |
DB_PATH |
/data/k1_sessions.db |
Base SQLite locale |
THUMB_DIR |
/data/thumbs |
Dossier des miniatures téléchargées |
SPOOLMAN_URL |
http://spoolman:8000 |
URL API Spoolman |
WEB_PORT |
8123 |
Port de l'interface web |
POLL_INTERVAL |
5 |
Intervalle des requĂȘtes WS (secondes) |
K1_SILENCE_PROBE_SECS |
8 |
Délai avant sonde de réveil (watchdog) |
K1_SILENCE_DEAD_SECS |
30 |
Délai avant reconnexion forcée |
- Ajoutez vos bobines dans Spoolman (http://:7912) avec leur poids mesuré
- Ouvrez l'interface (http://:8123)
- Onglet đ Dashboard : Ă©tat de l'imprimante en direct (connexion, tempĂ©ratures buse/plateau, statistiques)
- Onglet đ Journal : toutes les impressions (passĂ©es + futures) avec statut et filament
- Onglet 𧔠Filaments : les bobines Spoolman (poids restant, niveau) + les modÚles de l'imprimante avec miniature + quantité + durée
- Cliquez sur une session ou un modĂšle â choisissez la bobine â le poids se dĂ©compte
đĄ Astuce mobile : sur Android/iOS, « Ajouter Ă l'Ă©cran d'accueil » installe Filament Tracker comme une appli.
La K1SE n'a pas d'API REST complÚte pour les fichiers (contrairement aux printers Klipper avec Moonraker). Le protocole CrealityOS a été entiÚrement compris par tests sur une machine réelle :
- Push : l'imprimante envoie son état en continu (
state,printFileName,usedMaterialLength,nozzleTemp,bedTemp,err.errcode, ...) - RequĂȘtes :
ReqPrinterPara,reqPrintObjects - Liste des fichiers + historique : la combinaison complĂšte et obligatoire :
â rĂ©ponse
{"method":"get","params":{"reqGcodeFile":1,"reqGcodeList":1,"reqHistory":1, "reqElapseVideoList":1,"reqPrintObjects":1,"reqMaterialBoxsInfo":1}}retGcodeFileInfo2(fichiers avec miniatures +filamentWeight) +historyList(jobs passĂ©s).â ïž reqGcodeListseul ne renvoie rien ! La K1 ignore les demandes partielles.
- Miniature :
GET /downloads/humbnail/<fichier-sans-.gcode>.pngâ PNG 96Ă96â ïž Le firmware Ă©crithumbnail(faute de frappe officielle de Creality) â pas « thumbnail ». - Gcode complet :
GET /downloads/gcode/<fichier>.gcode(le collecteur ne télécharge QUE les miniatures, jamais les .gcode complets pour économiser la bande passante)
| Valeur | Signification |
|---|---|
| 0 | ArrĂȘtĂ©e / idle |
| 1 | Impression en cours |
| 2 | Terminée (completed) |
| 3 | Erreur (failed) |
| 4 | Abortée |
| 5 | En pause |
Chaque job contient : id unique, filename, starttime, usagetime (s), usagematerial (mm), printfinish (1 = terminĂ©, 0 = arrĂȘtĂ©), thumbnail.
- Idempotent : la session est hachée (
sha1(id|filename)) â pas de doublon au re-import - Fusion live : si une session en direct existe dĂ©jĂ pour le mĂȘme fichier/dĂ©but, l'import la complĂšte au lieu d'en crĂ©er une autre
L'imprimante Ă©teinte brutalement laisse le WebSocket bloquĂ© (aucune erreur levĂ©e). Le watchdog dĂ©tecte le silence (>8 s â sonde, >30 s â fermeture) et relance la connexion toutes les 10 s.
Les données persistantes sont conservées dans deux volumes Docker nommés : collector-data (SQLite k1_sessions.db et miniatures) et spoolman-data (base Spoolman). Une mise à jour standard est additive :
git pull
docker compose up -d --buildNe supprimez pas les volumes (docker compose down -v) : cela effacerait l'historique et les bobines. Les migrations SQLite intégrées utilisent CREATE TABLE IF NOT EXISTS et ajoutent uniquement les colonnes manquantes.
# Tester sans l'imprimante : lancer le mock sur 9999
python3 mock_k1.py 9999 demo_vase.gcode
# Lancer le collecteur en local (hors Docker)
K1_HOST=127.0.0.1 K1_PORT=9999 SPOOLMAN_URL=http://127.0.0.1:8000 python3 collector.pyLe protocole CrealityOS a Ă©tĂ© reverse-engineer et validĂ© sur une K1SE rĂ©elle (firmware DWIN CR4CU220812S11 1.3.5.22). Le collecteur ne fait aucune supposition sur le modĂšle (il lit le modĂšle depuis l'imprimante) : tout appareil Creality utilisant le mĂȘme WebSocket CrealityOS (port 9999) est compatible.
Familles connues pour utiliser ce protocole (confirmĂ© par la communautĂ© â intĂ©grations HA open source, etc.) :
| Famille | ModÚles | Fiabilité |
|---|---|---|
| K1 | K1, K1C, K1 SE, K1 Max | â Protocole identique (validĂ© sur K1SE) |
| K2 | K2, K2 Pro, K2 Plus | đą MĂȘme CrealityOS â WS 9999 + HTTP 80 |
| Ender-3 V3 | Ender-3 V3, V3 SE, V3 KE, V3 Plus | đą MĂȘme CrealityOS â WS 9999, camĂ©ra optionnelle |
| Creality Hi | Hi | đą MĂȘme CrealityOS (communautĂ©) |
| Autres CrealityOS | futurs modĂšles | đĄ VĂ©rifier que les ports 9999 (WS) + 80 (miniatures) rĂ©pondent |
Points pratiques :
- Le collecteur se connecte au WebSocket port 9999 â vĂ©rifiez que votre imprimante est sur le mĂȘme rĂ©seau local et que le port n'est pas bloquĂ© par le pare-feu.
- Une fois connecté, tout est automatique : historique importé, fichiers + miniatures synchronisés, journal mis à jour en direct.
- Check rapide de compatibilité : si
GET http://<imprimante>/downloads/humbnail/test.pngrĂ©pond (mĂȘme une 404), le firmware serveur est lĂ . L'appli dĂ©tecte le modĂšle via le champmodeldu WS. - Si votre firmware ne rĂ©pond pas Ă la combinaison de requĂȘtes, ouvrez une issue GitHub avec votre version de firmware â nous pourrons l'adapter.
- Décompte du filament : le collecteur lit
usagematerial(mm) envoyĂ© par l'imprimante, le convertit en grammes avec la densitĂ© du filament (dĂ©faut 1,24 g/cmÂł pour le PLA) et dĂ©compteremaining_weightdans Spoolman. - Bobines pesĂ©es : si vous avez pesĂ© vos bobines Ă la balance, utilise la case « đȘ DĂ©compter » dĂ©cochĂ©e pour les impressions antĂ©rieures Ă la pesĂ©e â sinon double comptage.
- Miniatures historiques : les thumbnails d'historique id-based ne sont pas servis par le firmware â le collecteur rattache la miniature du fichier correspondant.
đ Dashboard imprimante â Ă©tat temps rĂ©el (connexion, tempĂ©ratures buse/plateau, statistiques globales) :
đ Journal des impressions â chaque impression est enregistrĂ©e automatiquement (statut, durĂ©e, filament consommĂ©) :
đ§” Bobines & filaments â inventaire Spoolman (matĂ©riau, couleur, poids restant) et bibliothĂšque d'association :
đ± Vue mobile â interface responsive, installable comme PWA sur tĂ©lĂ©phone :
Les captures montrent l'interface réelle (adresse IP de démonstration floutée).
| ProblĂšme | Solution |
|---|---|
| L'interface indique « đĄ Hors ligne » | VĂ©rifiez K1_HOST dans .env, que l'imprimante est sur le mĂȘme rĂ©seau local, et que le port 9999 n'est pas bloquĂ© par un pare-feu. |
| « Spoolman injoignable » | Attendez quelques secondes aprÚs le démarrage (spoolman démarre en parallÚle du collecteur), puis vérifiez http://:7912. |
| Le journal est vide alors que j'imprime | Une impression en cours apparaßt immédiatement dans l'onglet Journal ; l'historique complet s'importe ~1 min aprÚs la connexion. |
| Les miniatures ne s'affichent pas | La liste des fichiers se rafraĂźchit automatiquement (~1 min) ; vous pouvez aussi cliquer « đ RafraĂźchir » dans l'onglet Filaments. |
| La consommation semble fausse | VĂ©rifiez la densitĂ© du filament dans Spoolman (ex. PLA = 1,24 g/cmÂł) et la case « đȘ DĂ©compter » pour les bobines pesĂ©es Ă la balance. |
| Mettre Ă jour | git pull puis docker compose up -d --build |
MIT â voir LICENSE.