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 :
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
append_pointajoute un point de mesure au buffer local (persistant sur disque).flushenvoie tous les points bufferisés vers l'exchangetelemetry(format NDJSON compressé gzip), puis vide le buffer en cas de succès.- En l'absence de connectivité, les points restent dans le buffer et seront émis au prochain
flushré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 en1/0; les chaines et autres types sont ignorés silencieusement.- Retour :
true, nilen 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) :truesi l'envoi a réussi.n(number) : nombre de points envoyés.err(string ounil) : 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").