Skip to content

Latest commit

 

History

17 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

đŸ§” Filament Tracker

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.

Licence Version Docker Python PWA Compatibilité

🇬🇧 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.


✹ Pourquoi Filament Tracker ?

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Ă©s

🎯 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.


đŸ—ïž Architecture

┌─────────────────────────────┐        ┌──────────────────────┐
│  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

🚀 Installation

Prérequis

  • 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

Étapes

# 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 --build

Puis ouvrir :

  • Interface web : http://:8123
  • Spoolman : http://:7912

⚙ Configuration

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

📖 Utilisation

  1. Ajoutez vos bobines dans Spoolman (http://:7912) avec leur poids mesuré
  2. Ouvrez l'interface (http://:8123)
  3. Onglet 📊 Dashboard : Ă©tat de l'imprimante en direct (connexion, tempĂ©ratures buse/plateau, statistiques)
  4. Onglet 📋 Journal : toutes les impressions (passĂ©es + futures) avec statut et filament
  5. Onglet đŸ§” Filaments : les bobines Spoolman (poids restant, niveau) + les modĂšles de l'imprimante avec miniature + quantitĂ© + durĂ©e
  6. 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.


🔌 Protocole K1SE (reverse engineering)

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 :

WebSocket (port 9999)

  • 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 :
    {"method":"get","params":{"reqGcodeFile":1,"reqGcodeList":1,"reqHistory":1,
      "reqElapseVideoList":1,"reqPrintObjects":1,"reqMaterialBoxsInfo":1}}
    → rĂ©ponse retGcodeFileInfo2 (fichiers avec miniatures + filamentWeight) + historyList (jobs passĂ©s).

    ⚠ reqGcodeList seul ne renvoie rien ! La K1 ignore les demandes partielles.

HTTP (port 80)

  • Miniature : GET /downloads/humbnail/<fichier-sans-.gcode>.png → PNG 96×96

    ⚠ Le firmware Ă©crit humbnail (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)

États (state)

Valeur Signification
0 ArrĂȘtĂ©e / idle
1 Impression en cours
2 Terminée (completed)
3 Erreur (failed)
4 Abortée
5 En pause

Historique (historyList)

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

Watchdog

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.


🔒 DonnĂ©es et mises Ă  jour

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 --build

Ne 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.


đŸ› ïž DĂ©veloppement

# 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.py

🎯 CompatibilitĂ©

Le 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.png rĂ©pond (mĂȘme une 404), le firmware serveur est lĂ . L'appli dĂ©tecte le modĂšle via le champ model du 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.

⚠ Ce projet n'a aucun lien avec Creality. Le protocole a Ă©tĂ© dĂ©couvert par observation du trafic rĂ©seau ; il peut changer Ă  tout moment avec une mise Ă  jour du firmware.


🧠 Notes importantes

  • 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Ă©compte remaining_weight dans 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.

đŸ–Œïž Captures d'Ă©cran

📊 Dashboard imprimante — Ă©tat temps rĂ©el (connexion, tempĂ©ratures buse/plateau, statistiques globales) :

Dashboard imprimante

📋 Journal des impressions — chaque impression est enregistrĂ©e automatiquement (statut, durĂ©e, filament consommĂ©) :

Journal des impressions

đŸ§” Bobines & filaments — inventaire Spoolman (matĂ©riau, couleur, poids restant) et bibliothĂšque d'association :

Bobines et filaments

đŸ“± Vue mobile — interface responsive, installable comme PWA sur tĂ©lĂ©phone :

Vue mobile

Les captures montrent l'interface réelle (adresse IP de démonstration floutée).


🆘 DĂ©pannage / FAQ

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

📄 Licence

MIT — voir LICENSE.

About

đŸ§” Filament Tracker — Suivi de filament & journal d'impressions pour Creality K1/K2/Ender-3 V3 (CrealityOS) ‱ PWA + Spoolman + stats mensuelles ‱ Filament tracking & print log for Creality 3D printers

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages