Aller au contenu

2cv001

Membres
  • Compteur de contenus

    447
  • Inscrit(e) le

  • Dernière visite

Information

  • Genre
    Masculin
  • Lieu
    Clamart
  • Imprimantes
    CR10
    QIDI tech Q1-Pro

Visiteurs récents du profil

Le bloc de visiteurs récents est désactivé et il n’est pas visible pour les autres utilisateurs.

Récompenses de 2cv001

Proficient

Proficient (10/14)

  • Very Popular Rare
  • Dedicated
  • Reacting Well Rare
  • First Post
  • Collaborator

Badges récents

108

Réputation sur la communauté

1

Sujets solutionnés !

Favoris

  1. Tutos
    [TUTO] MQTT avec Klipper / Moonraker ou comment dialoguer avec son imprimante en temps réel.

    Introduction

    Il y a au moins deux façon de communiquer avec une imprimante en klipper. En effet, klipper/moonraker met à disposition des API qui peuvent être utilisées soit via des requêtes "http" POST ou GET ou soit via MQTT.

    La première solution via des GET et POST est évoquée ici : 

    Dans l'idéal, il faudrait que lorsqu'un évènement se produise, on puisse obtenir en "temps réel", enfin en quelques millisecondes, la nouvelle valeur. Ainsi, on serait averti en temps réel du fait qu'une impression s'arrête, ou on pourrait connaitre en temps réel la température de l'extrudeur ou du bed.

    C'est  ce que va nous permettre MQTT.

    On verra plus loin que comme déjà évoqué, MQTT peut non seulement récupérer des évènements, mais aussi, à l'image des GET, interroger l'imprimante pour qu'en retour elle nous renvoie un certain nombre d'infos. Enfin, à l'image des POST, MQTT permet également le déclenchement d'actions (lancement d'impression, exécution d'un Gcode etc...)

     

    Exemple de ce que peut on récupérer via MQTT (ou via des GET) comme renseignements "en temps réel" ?

    Voici ce que j'ai réussi ,jusqu'à présent comme renseignement en temps réel :

    -L'état (printing standby...)
    -La durée d'impression
    -La durée total d'impression (je ne sais pas encore complètement la différence avec la durée d'impression)
    -Le nom du fichier en cours d'impression
    -La température du Bed
    -La température de l'extrudeur
    -Le temps d'impression de l'extrudeur. J'ai l'impression que c'est le temps cumulé depuis quand vous avez reçu l'imprimante. Ca reste à confirmer.

    Ce sont les principaux, mais il y en a d'autres que vous allez retrouvé plus bas dans un tableau.

    Installation et configuration de MQTT

    -Si vous n’êtes pas familiarisés avec MQTT, en particulier coté serveur, suivez un tuto sur internet ou demandez des précisions sur ce fil de discussion.

    -vous devez pouvoir vous connecter avec putty ou équivalent à votre imprimante. Avec certaines imprimantes, ce n'est pas possible. le firmware est trop bridé.

    -Vous devez avoir un serveur MQTT accessible. Chez moi, un pi qui contient ce serveur (mosquitto)

      sur internet, il y a plein de tutos qui montrent comment ça s'installe.

    -Vous devez avoir installé la partie client de mosquitto dans votre imprimante (via putty par exemple). Attention en théorie, cela peut vous faire perdre la garantie ! (voir le message qui s'affiche lorsque vous vous connectez avec putty).

    Pour savoir si il a déjà été installé :

    dpkg -l | grep mosquitto-clients

    doit vous répondre quelque chose comme cela :
     

    ii  mosquitto-clients                      1.5.7-1+deb10u1                      arm64        Mosquitto command line MQTT clients

     

    Pour l'installer (si apt n'est pas adapté à votre distribution, il faut chercher ce qui peut le remplacer) :

    sudo apt install mosquitto-clients

     

     

    Puis, on va compléter le fichier moonraker.conf en lui ajoutant une section [mqtt]

     Chez moi, le fichier moonraker.conf se trouve dans /homme/mks/klipper_config si ce n'est pas le cas pour vous, vous pouvez  lancer une recherche :

    find / -name moonraker.conf

    Chez moi, j'ai cette réponse :
     

    
    Message from syslogd@mkspi at Jan 27 11:37:04 ...
     kernel:[   53.228014] Disabling IRQ #58
    /home/mks/kiauh-backups/klipper_config/220725-0302/klipper_config/moonraker.conf
    /home/mks/kiauh-backups/klipper_config/220725-0259/klipper_config/moonraker.conf
    /home/mks/kiauh-backups/klipper_config/220725-0304/klipper_config/moonraker.conf
    /home/mks/moonraker/docs/moonraker.conf
    /home/mks/klipper_config/moonraker.conf
    /home/mks/kiauh/resources/moonraker.conf

    Les backups sont des sauvegardes, on ne s'en occupe pas
    Les dossier doc non plus
    Pour moi, c'est celui qui est dans klipper_config qui est est le bon et donc

    /home/mks/klipper_config/moonraker.conf

    Commencez par faire une copie de sauvegarde de ce fichier (si votre fichier /home/mks/klipper_config/moonraker.conf se trouve dans un autre répertoire, à vous de remplacer le répertoire dans lla commande suivante et dans les autres commandes)

    sudo cp /home/mks/klipper_config/moonraker.conf /home/mks/klipper_config/moonraker.conf.old

    -Puis vous allez le compléter via nano (ou autre). Si besoin en modifiant le répertoire.
     

    sudo nano /home/mks/klipper_config/moonraker.conf

    Vous pouvez aussi y accéder par fluidd, enfin, chez moi..

    image.png.d3db558b307f1723bc1a67dedd093ae2.png

    A la fin du fichier, ajouter

    [mqtt]
    address: 192.168.1.... # l'IP de votre serveur MQTT. Pas son nom réseau, seulement une IP
    port: 1883
    username: votreNomUtilisateurQuiAEteDeclareDansVotreServeurMQTT
    password: SonMotDePasse;
    status_objects:
      webhooks
      toolhead=position,print_time,homed_axes,speeds,acceleration
      extruder=temperature,target,pressure_advance,smooth_time
      printer=state,extruder,target,position,virtual_sdcard
      heater_bed=temperature,target,power
      print_stats=filename,total_duration,print_duration,filament_used
      job_last=filename,print_duration

    Pour address, comme de base, sur mon imprimante q1pro il n'y a pas de DNS déclaré correctement dans l'imprimante, seul une adresse IP (192.168.1....) fonctionne. C'est l'IP de votre serveur MQTT. Dans un premier temps rentrez l'IP, et dans un second temps, si vous le souhaitez, essayez de remplacer l'IP par son nom réseau.

    Le username et le password sont des identifiants de connexion qui doivent être déclarés dans le serveur MQTT

    -Sortez de "nano" (Ctrl X et validez)

    -relancez moonraker (attention attendez si besoin la fin d'une impression en cours pour le faire)

    sudo systemctl restart moonraker

    Configuration du fichier moonraker.conf pour indiquer les évènements que l'on veut recevoir lors d'un changement (notion d'évènement)

    Dans la section MQTTque vous venez d'ajouter dans le fichier de configuration moonraker.conf , il y a une partie status_objects dot le rôle est d'indiquer à moonraker les évènements que vous souhaitez avoir via MQTT

    La ligne
     

      print_stats=state,filename,total_duration,print_duration

    va par exemple nous permettre de récupérer en temps réel l'état de l'imprimante (standby, printing...)  le nom du fichier en train de s'imprimer, les durées d'impression prévu ...

    à chaque fois qu'ils changent, un message MQTT est envoyé

    Vous pouvez voir ces messages défiler par exemple à l'aide du logiciel MQTT Explorer

    Ces messages sont envoyés par l'imprimante avec comme topic quelque chose sous la forme (chez vous il est possible que "mkspi" soit remplacé par autre chose) :

    mkspi/klipper/status

    et des payload (messages) au format JSON. Par exemple :
     

    {
      "eventtime": 10149.499403589,
      "status": {
        "toolhead": {
          "print_time": 10164.745453851414,
          "position": [
            123.4,
            121.858,
            28.906922455714884,
            1829.6180900007298
          ]
        },
        "extruder": {
          "temperature": 209.75,
          "power": 0.9052395424853155
        },
        "heater_bed": {
          "power": 0.4082908609993894
        },
        "print_stats": {
          "total_duration": 1802.585450651999,
          "print_duration": 1603.111610140999,
          "filament_used": 1210.5352800007333
        }
      }
    }

    A noter que si par exemple pour print_stats vous ne spécifiez que
    print_stats=state
    au lieu de
    print_stats=state,filename,total_duration,print_duration

    L'imprimante ne retournera en MQTT que state lorsque ce dernier changera. Il ne vous enverra pas par exemple, de message lorsque "filename" change

    De même si cous mettez print_stats sans le "=" et ce qui est derrière, il renverra tout ce qui concerne print_stats. C'est un moyen d'explorer, de tester ce que peut renvoyer l'imprimante, mais cela va la faire envoyer des messages inutiles.

     

     

    Concrètement :

           
    ligne dans moonraker.conf Topic Filtre JSON  
     print_stats mkspi/klipper/status [status][print_stats][state] Etat : printing, standby…
     print_stats mkspi/klipper/status [status][print_stats][print_duration] temps d'impression
     print_stats mkspi/klipper/status [status][print_stats][total_duration] Temps total d'impression
     print_stats mkspi/klipper/status [status][print_stats][filename] Nom du fichier en cours d'impression
    heater_bed mkspi/klipper/status [status][heater_bed][temperature] Température du bed
    heater_bed mkspi/klipper/status [status][heater_bed][target] Cible température bed
    heater_bed mkspi/klipper/status [status][heater_bed][power] Puissance en % pour le Bed
    extruder mkspi/klipper/status [status][extruder][temperature] Température de l'extruder
    extruder mkspi/klipper/status [status][extruder][target] Cible température extrudeur
    extruder mkspi/klipper/status [status][extruder][power] Puissance en % pour l'extrudeur
    toolhead mkspi/klipper/status [status][toolhead][position] position de la tête. Je pense [x,y,z]
    toolhead mkspi/klipper/status [status][toolhead][position][0] Position de la tête (x?)
    toolhead mkspi/klipper/status [status][toolhead][position][0] Position de la tête (y?)
    toolhead mkspi/klipper/status [status][toolhead][position][0] Position de la tête (z?)
    toolhead mkspi/klipper/status [status][toolhead][print_time] Temps de travail depuis alumage imp?
         
           
           
           
           
           
           
           
           
           

    Utilisation de MQTT pour déclencher des API : demande d'infos

     

    Trouver le nom d'hote (hostname) de votre imprimante.

     

    Vous devez connaitre votre hostname pour connaitre le premier élément des topics.

    Sous fluidd vous l'avez ici

    image.png.9127ba5bc0550df7272763d68ad9c7fe.png

    Sinon, la commande

    hostname

    Vous le donnera. Chez moi la réponse est :
     

    mkspi

    Vous pouvez aussi l'imposer dans le fichier de configuration  "moonraker.conf" en y ajoutant dans la section [server] la ligne
     

    hostname: mkspi

    Vous pouvez bien sûr remplacer mkspi par ce que vous voulez.

    Dans tous les exemples ci-dessous, si votre hostname n'est pas mkpsi ou si vous avez ajouté une ligne ligne hostname: mkspi dans la section [server] du fichier  moonraker.conf, remplacé le premier terme des topic (mkspi" par ce que vous avez obtenu par la commande hostname ou par ce que vous avez imposé dans moonraker.conf

    Vous trouverez la liste des API ici : https://moonraker.readthedocs.io/en/latest/web_api/

    Principe d'utilisation de ces API :

    On envoie un message MQTT ayant comme topic (toujours le même)   (en remplaçant éventuellement "mkspi" par ce que vous avez chez vous)

     

    mkspi/moonraker/api/request 

     

    et comme contenu  (payload) une chaine JSON indiquant ce que vous vous obtenir et que vous pouvez trouver dans ce lien https://moonraker.readthedocs.io/en/latest/web_api/

    Moonraker vous renvoie alors une réponse via un message MQTT avec comme topic

    mkspi/moonraker/api/response

    Prenons par exemple cette API (extrait du document en question) :
     

      Citation

    JSON-RPC over HTTP

    Exposes the JSON-RPC interface over HTTP. All JSON-RPC methods with corresponding HTTP APIs are available. Methods exclusive to other transports, such as Identify Connection, are not available.

    HTTP request:

     
    POST /server/jsonrpc
    Content-Type: application/json
    {
        "jsonrpc": "2.0",
        "method": "printer.info",
        "id": 5153
    }
    Dérouler  

    On va pouvoir interroger l'imprimante via un message MQTT

    avec comme topic

    mkspi/moonraker/api/request

    et comme payload au format JSON

    { "jsonrpc": "2.0", "method": "printer.info", "id": 5153 }

    Vous pouvez utiliser MQTT explorer ( https://mqtt-explorer.com/) pour lancer ce message MQTT :

    image.png.efe1ab71cf2298728b0bb19e1c4810a1.png

         

    Vous allez y récupérer ce message en réponse :

    image.png.43fb548eb15f8db41574a3c29d7b5faa.png

    la réponse complète dans mon cas :

    {
      "jsonrpc": "2.0",
      "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"
      },
      "id": 1
    }

     

    Utilisation de MQTT pour déclencher des API : demandes d'actions

    Avec le même principe, vous pouvez déclencher des actions. Toujours pareil, vous trouvez l'API qui convient dans https://moonraker.readthedocs.io/en/latest/web_api/

    Par exemple pour mettre en pause une impression en cours

    image.png.b82763bc88c21fc343ced70578976da2.png

    Le topic est toujours le même :

    mkspi/moonraker/api/request

    le JSON est

    {"jsonrpc":"2.0","method":"printer.print.pause","id":4564}

    Moonraker vous renvoie une réponse (ok) avec un message MQTT ayant pour topic

    mkspi/moonraker/api/response

     

    Un autre exemple : demande d'exécution d'un GCODE

    Le topic, donc toujours
     

    mkspi/moonraker/api/request

    la payload (en remplaçant M104 S20 qui est un GCODE demandant de chauffer la buse à 20°, par le GCODE que vous souhaitez voir exécuté :

    {"jsonrpc":"2.0","method":"printer.gcode.script","params":{"script":"M104 S20"},"id":1}

     

     

     

    Utilisation avec Home assistant :

    Je ne pratique pas HA mais je sais qu'il y a pas mal de tuto sur le sujet sur internet. @fran6p l'utilise et nous a communiqué ce lien : https://github.com/marcolivierarsenault/moonraker-home-assistant

    Utilisation avec Jeedom

    Sous jeedom, j'utilise le plugin JMQTT qui permet d'une part d'avoir un serveur MQTT, mais aussi de facilement récupérer les messages MQTT pour des topic bien préçis.

    Dans JMQTT, vous créez autant d'infos que vous voulez, en vous servant du tableau plus haut pour le remplir.
    Exemple :

    Pour  l'équipement (à noter que pour l'instant, j'ai choisi 1 pour le Qos pour être sûr de ne pas rater une info :

    image.png.a97abf48cd051890c16618ac29d60de2.png

    Et comme commandes de type info (exemples) :

    Voir le tableau plus haut pour d'autres infos.

    image.thumb.png.ee0253c4ae9de57052bbe9a2b9a67685.png


    Pour les actions  :

    Exemple pour mettre en pause et relancer après pause :
     

    mkspi/moonraker/api/request
    
    {"jsonrpc":"2.0","method":"printer.print.pause","id":4564}

    et
     

    mkspi/moonraker/api/request
    
    {"jsonrpc":"2.0","method":"printer.print.resume","id":1465}

    image.thumb.png.e65d27dda89c79ed2879f4e195a2c4dc.png

    Et pour demander l'exécution d'un GCODE :

    image.thumb.png.1616dc778fe1d523aa4535b9afc78dca.png

     

    N'hésitez pas à me faire un retour sur votre utilisation en spécifiant le type d'imprimante...

     

    image.png

    En afficher plus  
×
×
  • Créer...