Archives par mot-clé : Python

Modbus / MQTT / InfluxDB / Grafana

Bonjour,

Introduction

Les articles précédents ont montré la mise en œuvre d’une infrastructure composée de conteneurs Docker Broker MQTT, Telegraf, InfluxDB et Grafana.

Le Broker MQTT était alimenté en données provenant d’un automate SIEMENS S7 par un script Python.

Script Python Modbus

On peut bien sûr alimenter ce broker avec un script communiquant en Modbus avec un automate SCHNEIDER ELECTRIC.

Pour exemple, j’en ai écrit un qui discute avec un automate M340 mais ça fonctionne bien sûr avec n’importe quel serveur Modbus TCP dans ce cas.

Le script Python est disponible ici dans son dépôt GitLab.

Configuration Telegraf

Comme cette infrastructure a été déjà présentée, je vais faire court pour cette fois.

La seule difficulté résidait dans la gestion de différents formats de données (entiers, flottants, permutation des octets…) que le script gère côté Python avec la librairie struct.

Côté Telegraf, j’ai modifié la configuration de sorte de traiter les entiers et les flottants. Ça donne ça :

[[outputs.influxdb_v2]]
  ## The URLs of the InfluxDB cluster nodes.
  urls = ["http://influxdb2:8086"]
  ## Destination bucket to write into.
  bucket = "MQTT"
# Read metrics from MQTT topic(s)
[[inputs.mqtt_consumer]]
  ## Broker URLs for the MQTT server or cluster.
  servers = ["tcp://10.252.253.1:1883"]

  name_override = "my_integer"

  ## Topics that will be subscribed to.
  topics = [
    "ps7/s7-315-2dp/db1.dbw0",
    "ps7/s7-315-2dp/ew0",
    "ps7/s7-315-2dp/aw0",
    "ps7/s7-315-2dp/mw0",
    "OMB/server0/My_Uint",
    "OMB/server0/My_Int",
  ]
  ## Data format to consume.
  data_format = "value"
  data_type = "integer"

[[inputs.mqtt_consumer]]
  ## Broker URLs for the MQTT server or cluster.
  servers = ["tcp://10.252.253.1:1883"]

  name_override = "my_float"

  ## Topics that will be subscribed to.
  topics = [
    "OMB/server0/My_Real",
  ]

  ## Data format to consume.
  data_format = "value"
  data_type = "float"

Comme on peut le voir, il y a maintenant deux sections [[inputs.mqtt_consumer]] qui permettent de traiter chacune un type de données.

Le « name_override » permet de distinguer les deux sections dans la clause FROM de Grafana (« my_integer » ou « my_float »).

Tableau de bord Grafana

Voilà, voilà… N’est-ce pas merveilleux ? 😉

Suite

Je me propose pour la suite de concocter un conteneur Docker gérant une carte Hilscher cifX avec le pilote récemment libéré (délivré !) et le binding cifX déjà évoqué.

Un exemple de script collectant des données de la carte cifX pour les échanger avec le broker MQTT est déjà disponible dans le dépôt.

Aussi, un tableau de bord avec Grafana s’impose !

Stay tuned !

Cordialement,
Stéphane