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