Aller au contenu

Module edgecontrol

Le module edgecontrol publie de la télémétrie vers l'exchange AMQP EdgeControl de la plateforme Alemca. Il tamponne les points de mesure dans un fichier local (résistant aux coupures réseau), puis les envoie par lots compressés lors d'un flush.

Ce module fait partie des modules chargés par défaut : il est disponible sans bloc de configuration dédié et réutilise automatiquement les identifiants AMQP de l'agent (comme le module alemca).

Import

Pour importer le module en Lua :

local edgecontrol = require("edgecontrol")

Aucun suffixe d'instance n'est nécessaire : le module est toujours enregistré sous le nom edgecontrol.

Configuration YAML

Le module fonctionne sans configuration. Il récupère l'identifiant de la centrale (ident) et l'URL AMQP depuis le fichier de credentials de l'agent. Si aucun amqp_url ne peut etre construit, flush() devient une opération sans effet (no-op) et un avertissement est loggé.

Les paramètres suivants sont optionnels et permettent d'ajuster le buffer local :

iot:
  alemca:
    buffer_dir: /tmp/alemca/edgecontrol      # dossier du buffer (défaut)
    buffer_max_bytes: 10485760               # taille max du buffer (10 Mo par défaut)
    publish_timeout_ms: 5000                 # timeout de publication AMQP (5 s par défaut)

Détails de la configuration

  • buffer_dir : Dossier ou est stocké le fichier tampon telemetry_buffer.jsonl (défaut: /tmp/alemca/edgecontrol).
  • buffer_max_bytes : Taille maximale du buffer en octets (défaut: 10485760, soit 10 Mo). Quand la limite est atteinte, les points les plus anciens sont tronqués (par tranches de 25 %).
  • publish_timeout_ms : Délai maximal d'une publication AMQP, en millisecondes (défaut: 5000).

Fonctionnement

  1. append_point ajoute un point de mesure au buffer local (persistant sur disque).
  2. flush envoie tous les points bufferisés vers l'exchange telemetry (format NDJSON compressé gzip), puis vide le buffer en cas de succès.
  3. En l'absence de connectivité, les points restent dans le buffer et seront émis au prochain flush réussi.

API Lua

Liste des fonctions

Fonction Signature Lua Rôle
append_point ok, err = edgecontrol.append_point(controller, ts_ms, fields) Ajoute un point au buffer.
flush ok, n, err = edgecontrol.flush() Envoie les points bufferisés.
buffer_stats table = edgecontrol.buffer_stats() État du buffer local.
Champs edgecontrol.name, edgecontrol.type Métadonnées du module.

edgecontrol.append_point(controller, ts_ms, fields)

Ajoute un point de mesure au buffer local.

  • Paramètres :
  • controller (string) : identifiant du controleur / de la source de données.
  • ts_ms (number) : horodatage du point en millisecondes.
  • fields (table) : table clé → valeur. Les valeurs numériques sont conservées telles quelles ; les booléens sont convertis en 1/0 ; les chaines et autres types sont ignorés silencieusement.
  • Retour : true, nil en cas de succès ; false, "msg" en cas d'échec.
local edgecontrol = require("edgecontrol")

local ok, err = edgecontrol.append_point("inverter1", 1744711200000, {
    power = 1250.0,
    voltage = 402.5,
    online = true,
})
if not ok then
    printError("append_point échoué : " .. err)
end

edgecontrol.flush()

Envoie tous les points bufferisés vers l'exchange AMQP telemetry, puis vide le buffer en cas de succès.

  • Paramètres : Aucun.
  • Retour : ok, n, err
  • ok (boolean) : true si l'envoi a réussi.
  • n (number) : nombre de points envoyés.
  • err (string ou nil) : message d'erreur en cas d'échec.
local edgecontrol = require("edgecontrol")

local ok, n, err = edgecontrol.flush()
if ok then
    printInfo("EdgeControl : " .. n .. " points envoyés")
else
    printError("flush échoué : " .. tostring(err))
end

edgecontrol.buffer_stats()

Retourne l'état courant du buffer local.

{
  n_points = 42,             -- nombre de points en attente
  file_size_bytes = 8192,    -- taille du fichier tampon
  oldest_ts_ms = 1744711200000, -- horodatage du plus ancien point
  plant_ident = "PLANT-001"  -- identifiant de la centrale
}

Exemple complet

local edgecontrol = require("edgecontrol")
local modbus = require("modbus1")

modbus.connect()

-- Collecte de plusieurs mesures
local now_ms = os.time() * 1000
local power = tonumber(modbus.readHoldingRegisters(0, 1)) or 0
local voltage = tonumber(modbus.readHoldingRegisters(10, 1)) or 0

-- Mise en buffer
edgecontrol.append_point("inverter1", now_ms, {
    power = power,
    voltage = voltage,
})

modbus.disconnect()

-- Envoi vers EdgeControl
local ok, n, err = edgecontrol.flush()
if not ok then
    printError("Envoi EdgeControl échoué : " .. tostring(err))
end

Champs Lua associés

  • edgecontrol.name : Retourne le nom de l'instance du module ("edgecontrol").
  • edgecontrol.type : Retourne le type du module ("edgecontrol").