Python-Snap7 / MQTT / netFIELD / Docker

Bonjour,

Introduction

Je présentais ce tantôt un script Python permettant de remonter des données d’automates SIEMENS S7 vers un broker MQTT et proposais de fournir un Dockerfile pour une utilisation avec Docker.

Dans un second article, je donnais un exemple d’utilisation avec la plateforme Hilscher netFIELD qui intègre deux instances Docker.

L’exemple fourni mettait en œuvre un conteneur basé sur Debian dans lequel on installait tout à la main en interactif.

C’est didactique mais pas industriel.
Aussi, j’ai donc écrit un Dockerfile qui automatise la chose.

Il m’a fallu également rendre le script Snap7-MQTT configurable et il est donc possible désormais de régler les paramètres de la connexion avec l’automate et ceux du broker MQTT via des variables d’environnement.

Tout cela est disponible dans le dépôt :
https://gitlab.com/ada-for-automation/python/snap7/snap7-mqtt

J’ai mis le Dockerfile dans le projet.
Vous pouvez le récupérer par exemple ainsi :

wget "https://gitlab.com/ada-for-automation/python/snap7/snap7-mqtt/-/raw/main/Dockerfile?ref_type=heads&inline=false" --output-document=Dockerfile

Faites attention avec cette dernière commande : WordPress ou le navigateur peuvent faire des blagues avec les caractères guillemets et esperluette.

Création de l’image Docker

Cette image se crée de façon triviale :

docker build --tag=python-snap7-mqtt:3.12-slim .

Docker va exécuter toutes les instructions du Dockerfile :

  1. récupérer une image Python de base,
  2. installer les paquetages logiciels nécessaires,
  3. récupérer la liste des commits,
  4. cloner le dépôt,
  5. créer un environnement virtuel et l’activer,
  6. installer les dépendances Python,
  7. déclarer le point d’entrée.

Docker utilisera les couches mises en cache pour les différentes étapes, ce qui permet de réduire le temps de création de l’image.

La récupération de la liste des commits permet de s’assurer que le cache ne sera pas utilisé s’il y a eu des commits depuis la dernière génération d’image.

Les étapes 4 à 7 seront alors rejouées sans le cache.

Instanciation du conteneur Docker

L’incantation suivante permet de créer le conteneur et de le lancer :

docker run --detach --name python-snap7-mqtt --env MQTT_BROKER_HOST=10.252.253.1 python-snap7-mqtt:3.12-slim

On y voit l’utilisation de la variable d’environnement MQTT_BROKER_HOST qui permet donc de définir l’adresse IP ou le nom d’hôte du broker MQTT.

Dans l’article précédent, cette adresse avait été réglée en éditant le script avec nano… Pas pratique n’est-ce pas ?

De même, il est possible de régler les paramètres de la connexion avec l’automate avec les variables SNAP7_PLC_IP_ADDR, SNAP7_PLC_RACK et SNAP7_PLC_SLOT. Sinon, les paramètres par défaut sont utilisés.

Comme on n’a pas spécifié à la création l’option –restart, celle-ci est à « no » par défaut. On peut bien sûr spécifier –restart=always ou modifier ainsi celle-ci après coup :

docker container update python-snap7-mqtt --restart=always

Et voilà !
A bientôt pour de nouvelles aventures !

Cordialement,
Stéphane