Bonjour,
Juste pour vous dire que j’ai pu relier jeedom à mon imprimante 3D sous klipper. Normalement, ça marche pour toutes les imprimantes sous klipper.
Si ça vous intéresse je vous donnerai tous les détails, mais le genre de truc que l’on peut faire :
récupérer
-l’état de l’imprimante
-les différentes températures
…
agir :
-lancer des gcodes et donc par exemple, chauffer la buses, chauffer le bed, positionner la tête,
-faire avancer le filament ou l’extruder. Voir ici : https://www.lesimprimantes3d.fr/forum/topic/9491-tutoriel-liste-des-gcode-principaux-et-couramment-utilis%C3%A9s/
…
Principe :
Dans un script (via plugin script), on place des requêtes GET qui permettent de récupérer de l’information ou des requêtes POST qui permettant d’agir sur l’imprimante. Ca se fait directement avec l’imprimante, sans passer par un intermédiaire comme Octopi par exemple.
Je vais éditer ce premier message au fur et à mesure pour commencer le tuto.
Principes généraux :
Si notre imprimante est sous klipper / moonraker, vous pourrez dialoguer avec elle en utilisant les API moonraker.voir ici https://moonraker.readthedocs.io/en/latest/web_api/
Dans ce qui suit, nous utiliserons le plugin script pour dialoguer avec l’imprimante via des requêtes GET pour obtenir de l’information telle que l’état de l’imprimante ou POST pour déclencher des actions telles que chauffer la buse ou démarrer une impression. Ces requête peuvent également être déclenchées par exemple via un php ou un python. L’idéal serait d’en faire un plugin.
Faites l’expérience suivante : allumez votre imprimante, qui doit être connecté au réseau interne de chez vous (wifi ou rj45), attendez la fin de son démarrage et tapez dans votre navigateur préféré, sous un micro connecté au même réseau que l’imprimante, cette url :
http://192.168.1.29:7125/printer/info en remplaçant 192.168.1.29 par l’IP de votre imprimante. Bien laisser le :7125 à la fin. Vous devriez avoir une réponse au format JSON de ce style :
{
"result": {
"state_message": "Printer is ready",
"klipper_path": "/home/mks/klipper",
"config_file": "/home/mks/klipper_config/printer.cfg",
"software_version": "v0.10.0-530-g3387a9c2-dirty",
"hostname": "mkspi",
"cpu_info": "4 core ?",
"state": "ready",
"python_path": "/home/mks/klippy-env/bin/python",
"log_file": "/home/mks/klipper_logs/klippy.log"
}
}
Si le résultat de ce test a été positif, vous pouvez continuer.
Laissez un message dans cette discussion en donnant le nom/marque de votre imprimante et si ce test a été positif.
Première étape : installation du plugin script
Je suppose que vous savez installer un plugin. Je ne détaille pas. Si besoin, demandez.
Créez un nouveau script
L’activer et le rendre visible, rien de spécial pour sa configuration
et remplir l’auto-actualisation par exemple en y plaçant * * * * * pour une actualisation toutes les minutes.
Création d’une première commande : température du bed
facultatif : dans votre navigateur, tapez cette commande :
http://q1pro:7125/printer/objects/query?heater_bed
en remplaçant « q1pro » par l’ip de votre imprimante (192.168.1…) ou son nom réseau.
vous obtenez quelque une réponse au format JSON
{
"result": {
"status": {
"heater_bed": {
"temperature": 15.14,
"power": 0,
"target": 0
}
},
"eventtime": 1323.701121963
}
}
Ce que l’on cherche à récupérer est la température; ici 15.14°c (oui, il fait froid dans mon bureau )
Dans l’onglet commandes, ajoutez une nouvelle commande :
Donnez lui un nom
et remplissez les paramètres comme ceci :
Dans l’url plaçez
http://q1pro:7125/printer/objects/query?heater_bed
en remplaçant « q1pro » par l’ip de votre imprimante (192.168.1…)ou son nom réseau.
Il faut pouvoir récupérer seulement la température.
Dans le type de script choisissez JSON puisque c’est une réponse au format JSON que l’on va récupérer.
Pour le type, dans un premier temps, choisissez « Autre » pour les essais. Vous le passerez en numérique ultérieurement.
Désactivez « Historiser » car si ce que l’on extrait pendant les essais est une chaine trop grande, vous aurez une erreur. Après les essais, vous pourrez cocher cette case dans problème.
puis
Premier essai :
dans la colonne requête, placez
result>status
puis
vous obtenez sous-partie une partie de ce que vous aviez obtenu en tapant l’url dans votre navigateur.
et si on continue à filtrer encore plus en plaçant result>status>heater_bed>temperature et ce coup ci en se mettant en numérique
Lorsque vous sauvegardez, vous obtenez dans la colonne état la température.
Voilà, je pense que vous avez compris le principe général de l’utilisation du plugin script pour notre besoin en requête GET avec un résultat au format JSON avec extraction d’une donnée bien précise.
température de la buse
Là, c’est exactement comme pour le bed, mais l’url est
http://q1pro:7125/printer/objects/query?extruder
En replaçant q1pro par l’ip de votre imprimante
et en plaçant dans la colonne requête
result>status>extruder>temperature
Maintenat que vous avez compris le principe, je continue mais en allant droit au but
Cible de température pour le bed
Url : http://q1pro:7125/printer/objects/query?heater_bed
requête : result>status>heater_bed>target
Cible de température pour la buse
Url : http://q1pro:7125/printer/objects/query?extruder
reqûete : result>status>extruder>target
*Etat de l’imprimante première solution
Url : http://q1pro:7125/api/printer
Requête : state>text (attention pas de result au départ)
les valeurs renvoyé peuvent être
« Operational »
« paused »
« Printing »
« Cancelling »
« Pausing »
« Error »
« Ready »
« ClosedOrError »
**Etat de l’imprimante ** Fonctionne chez moi
Url : http://q1pro:7125/printer/objects/query?print_stats
requête ; result>status>print_stats>state
Réponses possible :
printing
paused
standby
…
Dernier fichier imprimé :
Url : http://q1pro:7125/server/history/list?limit=1&start=0&since=1&order=desc
Requête : result>jobs>0>filename
Comment créer des actions pour agir sur l’imprimante
Tout ce que l’on a vu correspond à de la demande d’information. des GET. Maintenant, on va voir comment agir sir l’imprimante et donc via des POST.
Les POST ne peuvent se faire juste en rentrant une url comme précédemment. On va donc passer par des CURL.
Un CURL permet de lancer des requêtes GET mais aussi, et c’est ce qui nous intéresse, des POST.
Pour le fun, si vous lancez dans une invite de commande ou via putty cette commande (en y mettant votre ip comme on l’a vue précédemment) :
curl -X GET "http://q1pro:7125/printer/info"
Vous obtiendrez le même résultat que lorsque vous l’aviez fait via votre navigateur.
Mettre l’imprimante sur pause
Je commence par une action qui n’a pas besoin de paramètre.
Créez une nouvelle commande script et remplissez les paramètres comme ceci
-Donnez un nom à votre commande (Pause)
-choisissez « script »
-précisez « action » et comme script (avec votre IP) : curl -X POST "http://q1pro:7125/printer/print/pause"
Si vous avez une impression en cours et que vous cliquez sur
votre impression se mettra en pause.
Relancer l’imprimante après une pause
Créez une nouvelle commande, nommez là par exemple ResumePause. remplissez les paramètres comme précédemment, mais comme script, vous mettez :
curl -X POST "http://q1pro:7125/printer/print/resume"
Arréter une impression
pareil mais comme script :
curl -X POST "http://q1pro:7125/printer/print/cancel"
Lancer une impression
Là, c’est un peu plus compliqué car il faut donner au POST un paramètre : le nom du fichier à imprimer. Fichier qui se trouve dans l’imprimante.
On va devoir faire un curl de ce genre :
curl -X POST « http://q1pro:7125/printer/print/start » -H « Content-Type: application/json » -d « {"filename": "cube.gcode"} »
Remplacez cube.gcode par le nom de votre fichier. A noter que je n’ai pas donné de chemin. Mais le fichier doit être dans le bon répertoire (répertoire où l’imprimante place les fichiers gcode) dans votre imprimante. Chez moi : /home/mks/gcode_files
Relancer la dernière impression
Là, on va combiner ce que l’on vient de voir mais en passant en paramètre le nom du dernier fichier imprimé. Nom que l’on obtiendra via la commande que l’on avait créé ayant pour but justement de récupérer le nom du dernier fichier imprimé (voir plus haut).
Supposons que la commande en question se nomme DernierImprime
et que votre équipement se nomme q1pro et qu’il ait comme objet parent imp 3d
Alors, pour jeedom, dans tout script jeedom, #[imp 3d][q1pro][DernierImprime]#
contiendra le résultat de la commande DernierImprime
Le plus simple pour récupérer l’équivalent de #[imp 3d][q1pro][DernierImprime]#
chez vous est d’aller dans Outils / testeur d’expression
puis
et d’aller chercher l’équivalent de
cliquez sur

et dans l’historique, vous faites un copier de l’équivalent de `
#[imp 3d][q1pro][DernierImprime]#
Il n’a plus qu’à remplacer dans
curl -X POST "http://q1pro:7125/printer/print/start" -H "Content-Type: application/json" -d "{\"filename\": \"cube.gcode\"}"
bien sûr q1pro par votre ip,
mais aussi cube.gcode par
#[imp 3d][q1pro][DernierImprime]#
Cela donne pour moi :
curl -X POST "http://q1pro:7125/printer/print/start" -H "Content-Type: application/json" -d "{\"filename\": \"#[imp 3d][q1pro][DernierImprime]#\"}"
Envoyer un gcode
Pouvoir envoyer un gcode permet de faire énormément de choses. changer les températures extruder, bouger le plateau, ma tête (attention prudence…) etc. On trouve facilement sur internet la liste des gcodes possibles. Par exemple ici https://reprap.org/wiki/G-code
Il y a des nuances à prendre en compte. Par exemple, M140 S20 lance la chauffe du plateau à 20° et lance le Gcode suivant sans attendre, alors que M190 S20 lance la chauffe du plateau à 20° mais attend d’avoir fini pour lancer le gcode suivant.
Pour la buse, c’est M104 S20 (sans attente) et M109 S20 (avec attente)
Par exemple, pour monter la température du bed à 20°, Le curl est
curl -X POST « http://q1pro:7125/printer/gcode/script » -H « Content-Type: application/json » -d « {"script": "M140 S20"} »
M140 S20 est le gcode que vous pouvez remplacer par n’importe quel autre.
Arréter la chauffe du bed :
curl -X POST « http://q1pro:7125/printer/gcode/script » -H « Content-Type: application/json » -d « {"script": "M140 S0"} »
Chauffer la buse à 20°
curl -X POST « http://q1pro:7125/printer/gcode/script » -H « Content-Type: application/json » -d « {"script": "M104 S20"} »
Arrêter la chauffe de la buse
curl -X POST « http://q1pro:7125/printer/gcode/script » -H « Content-Type: application/json » -d « {"script": "M104 S0"} »
Lancer plusieurs gcode à la fois par exemple arrêter la chauffe du bed ainsi que la chauffe de la buse…
Il suffit de séparer les gcodes par un ;
curl -X POST « http://q1pro:7125/printer/gcode/script » -H « Content-Type: application/json » -d « {"script": "M104 S0; M140 S0"} »