Développer un plugin pour Octoprint en langage Python !


🐙 Installer l’environnement de développement : Octoprint 🐙

Nous allons commencer par préparer notre environnement de développement, autrement dit installer OctoPrint en local afin de pouvoir par la suite implémenter notre plugin.

Tout d’abord créer votre projet dans un dossier nommé « Plugins-Octoprint-Projects » et aller à l’interieur de celui-ci.

$ mkdir Plugins-Octoprint-Projects
$ cd Plugins-Octoprint-Projects

Nous allons cloner via github le projet nommé « Octoprint » qui va nous permettre d’avoir en local notre environnement. Allez à l’interieur du dossier :

$ git clone https://github.com/OctoPrint/OctoPrint
$ cd OctoPrint

Parfait.

Créons maintenant notre environnement virtuel : VirtualEnv

❓Qu’est ce que VirtualEnv ? ❓

Vous l’aurez deviné, c’est un environnement virtuel. Autrement dit, c’est un outil qui permet de garder les dépendances requis pour un projet. VirtualEnv est donc un outil qui permet de nous créer des environnements virtuels Python totalement isolé, et qui créé tous les executables pour utiliser les paquets d’un projet python. Ici > Octoprint.

Si vous ne l’avez jamais installé -> pip install virtualenv

Une fois fait, faites :

$ virtualenv venv

Un dossier nommé « venv » s’est créé au sein du projet « Octoprint » précédemment cloné.

Allons activer notre environnement virtuel.

$ cd venv/bin/
$ source activate

⚠ Si vous avez un accès refusé, faites chmod +x activate et refaite source activate ⚠

Un (venv) apparait dans votre terminal. Parfait. Cela signifie que nous sommes désormais au sein de notre environnement local Octoprint et que nous allons pouvoir interéagir avec lui en ayant accès à la commande octoprint

⚠

Attention !! Si vous fermez votre terminal, le (venv) disparaitra et l’environnement local sera terminé. Il vous faudra alors recommencer les étapes

de création : virtualenv venv

– d’activation de virtualenv : cd venv/bin et source activate

⚠

Ensuite faites :

(venv) $ cd ../..
(venv) $ pip install -e .\[develop,plugins\] 

Félicitations ! Votre environnement octoprint est prêt ! 🔥

Vérifions maintenant que tout est ok et que nous avons désormais accès aux commandes octoprint pour lancer notre environnement :

(venv) $ octoprint serve

⚠ En cas d’erreur lors du lancement du serveur type : « Error: [Errno 48] Address already in use », changez le port dans ../src/octoprint/settings.py : ⚠

server": {
        "host": None,
        "port": 5008, // CHANGE PORT 
        "firstRun": True,

🐙 Création du Plugin : Structure et installation dans l’environnement 🐙

Maintenant nous allons créer notre plugin.

Installons cookiecutter.

❓ CookieCutter ❓

C’est un outil qui crée des projets à partir de modèles de projet, par exemple des projets de package Python.

La documentation ici pour en savoir plus > https://cookiecutter.readthedocs.io/en/1.7.2/

Faites :

(venv) $ pip install "cookiecutter>=1.4,<1.7"

Cela va nous permettre de générer automatiquement un plugin skeleton pour Octoprint sans le moindre effort !

Nous allons créer notre plugin nommé « helloworld » : Faites :

(venv) $ octoprint dev plugin:new helloworld

On va ensuite vous demander des informations sur votre plugin, mais vous pouvez, à ce stade, tout laisser par défaut en appuyant sur « Entrer » à chaque fois.

Votre template de plugin octoprint est créé ! Vous pouvez en vérifier la structure qui doit être comme suit :

extras/
    README.txt
    helloworld.md
octoprint_helloworld/
    static/
        css/
            README.txt
        js/
            README.txt
        less/
            README.txt
    templates/
        README.txt
    __init__.py
translations/
    README.txt
.editorconfig
.gitignore
babel.cfg
MANIFEST.in
README.md
requirements.txt
setup.py

Nous en ferons le détail au fur et à mesure, ne vous inquiétez pas.

Maintenant, faisons quelque chose de sympa ! Installons notre plugin dans l’environnement de développement en une simple commande :

(venv) $ octoprint dev plugin:install

Et c’est tout pour la mise en place de notre environnement de travail ! Nous allons pouvoir passer aux choses serieuses !

🐙 Développement du Plugin : Le fameux « Hello World » made in Octoprint 🐙

Nous allons pouvoir commencer à développer notre plugin. Enfin !!

Intéressons nous tout d’abord au point d’entrée de notre plugin : le fichier __init__.py qui se trouve dans octoprint_helloworld/__init__.py

Je vous propose de supprimer les lignes de codes existantes et de le remplacer par ceci :

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

import octoprint.plugin

class HelloWorldPlugin(octoprint.plugin.StartupPlugin):
    def on_after_startup(self):
        self._logger.info("Hello World!")

# INFO
__plugin_name__ = "Hello World"
__plugin_pythoncompat__ = ">=2.7,<4"
__plugin_implementation__ = HelloWorldPlugin()

Que fait ce code :

  • Import des packages nécessaires
  • Creation de la classe du même nom que notre plugin « HelloWord » et suffixé par « Plugin »

La classe a en paramètre StartUpPlugin. Nous allons pouvoir l’utiliser pour initialiser la fonction « on_after_startup »

  • La fonction « on_after_startup » appartient au package octoprint. Elle va être appelé juste après le démarrage de notre application, d’écrire un log « Hello World », tout cela grâce à notre paramètre de classe qui est le StartUpPlugin.
  • Après le commentaire « INFO » nous avons : Le nom du plugin, la compatibilité en version python ET le plugin_implementation qui permet au démarrage d’aller appeler notre classe HelloWorldPlugin().

Redémarrer Octoprint avec octoprint serve vous devrier obtenir quelque chose comme ça :

2022-01-09 12:40:10,748 - octoprint.plugins.helloworld - INFO - Hello World!

Wow ! Bien joué 🔥 ! Bon. C’est un bon début, mais pas très attrayant. Améliorions tout cela avec une petite implémentation de l’interface graphique.

Vous aimerez aussi...