Aller au contenu

Module Lua addon

Le module addon permet de se connecter dynamiquement à un service gRPC, d'appeler des méthodes via réflexion et d'établir des flux de messages. Il prend en charge des services l'addon-can.

Importation

Pour l’importer dans Lua :

local addon = require("addon1") -- remplacer par le `name` dans la config YAML

Configuration

Exemple de configuration dans le fichier YAML de l’agent :

iot:
  modules:
    addon:
      - name: addon1
        address: "localhost:50051"
        timeout: 5
        useTLS: false
        addonType: "canbus"

Détails des options

  • name : Nom du module, utilisé dans le require. Doit être unique.
  • address : Adresse du serveur gRPC.
  • timeout : Délai en secondes pour les connexions ou appels.
  • useTLS : Si true, tente une connexion sécurisée TLS.
  • addonType : Type de service gRPC. Exemple : canbus.

Fonctions Lua

addon.connect()

Établit une connexion gRPC au service distant.

  • Retour :

  • true, nil si la connexion est établie.

  • nil, "message" si une erreur survient.
local ok, err = addon.connect()
if not ok then
  print("Erreur connexion : " .. err)
end

addon.disconnect()

Ferme la connexion gRPC précédemment ouverte.

  • Retour :

  • true, nil en cas de succès.

  • nil, "message" en cas d’erreur.
local ok, err = addon.disconnect()
if not ok then
  print("Erreur déconnexion : " .. err)
end

addon.call(method, request_table)

Effectue un appel RPC sur le service configuré (ex: canbus.CANService).

  • Paramètres :

  • method (string) : Nom de la méthode RPC (ex: "GetCurrentSignalValues").

  • request_table (table) : Données du message d'entrée (optionnel).

  • Retour :

  • Une table Lua représentant la réponse.

  • nil, "message" en cas d’erreur.
local resp, err = addon.call("GetCurrentSignalValues", {})
if resp then
  print(resp)
else
  print("Erreur appel RPC : " .. err)
end

addon.stream(method, request_table)

Crée un flux gRPC bidirectionnel (ou serveur) et retourne un itérateur Lua.

  • Paramètres :

  • method (string) : Nom de la méthode de streaming (ex: "SubscribeFrames").

  • request_table (table) : Données d’entrée (souvent {}).

  • Retour :

  • Un itérateur Lua. Chaque appel retourne message, nil, ou nil, err.

local stream = addon.stream("SubscribeFrames", {})
if not stream then
  print("Erreur ouverture flux")
  return
end

for msg, err in stream do
  if msg then
    print("Reçu :", msg)
  elseif err then
    print("Erreur flux :", err)
  end
end

Champs Lua associés

  • addon.name : Retourne le nom du module.
  • addon.type : Retourne le type "addon".
print("Nom module :", addon.name)
print("Type module :", addon.type)

Cas d’usage avec l'addon CAN

Lire les valeurs courantes

local addon = require("addon1")
addon.connect()
local resp = addon.call("GetCurrentSignalValues", {})
for _, frame in ipairs(resp.frames) do
  print("Frame ID:", frame.id)
  for _, sig in ipairs(frame.signals) do
    print(" ", sig.name, "=", sig.value)
  end
end

Écouter les trames en temps réel

local addon = require("addon1")
addon.connect()
local stream = addon.stream("SubscribeFrames", {})

for msg, err in stream do
  if msg then
    print("Frame:", msg.name, "ID:", msg.id)
  elseif err then
    print("Erreur stream :", err)
  end
end

Exemple : Envoi d’une trame CAN via Reset

Le service gRPC Reset de reinitialise les valeurs des signaux CAN.

Voici comment l’utiliser en Lua via le module addon.

Exemple Lua

local addon = require("addon1")

-- Connexion au service gRPC
local ok, err = addon.connect()
if not ok then
  print("Connexion échouée :", err)
  return
end

-- Reinitialisation des valeurs des signaux CAN
local resp, err = addon.call("Reset")
if resp then
  print(resp.message)
else
  print("Erreur d'envoi :", err)
end

Exemple : Envoi d’une trame CAN via SendFrame

Le service gRPC SendFrame permet d’envoyer une trame CAN construite à partir des définitions DBC chargées côté serveur.

Voici comment l’utiliser en Lua via le module addon.

Exemple Lua

local addon = require("addon1")

-- Connexion au service gRPC
local ok, err = addon.connect()
if not ok then
  print("Connexion échouée :", err)
  return
end

-- Envoi d'une trame CAN avec deux signaux définis dans le DBC
local frame = {
  name = "ExampleMessage",  -- Nom du message DBC (optionnel si id est fourni)
  id = 0x123,               -- Identifiant CAN (optionnel si name est fourni)
  dlc = 8,                  -- Data Length Code
  signals = {
    { name = "Speed", value = 42.0 },
    { name = "RPM", value = 1500.0 },
  }
}

local resp, err = addon.call("SendFrame", frame)
if resp then
  print("Trame envoyée avec succès :", resp.message)
else
  print("Erreur d'envoi :", err)
end

Détails

  • Le champ name ou id est requis (au moins l’un des deux).
  • dlc doit correspondre à la définition DBC, typiquement 8.
  • signals contient une liste de { name, value } pour chaque champ à encoder.
  • Le serveur encode automatiquement les valeurs dans le format binaire CAN en utilisant les métadonnées du fichier .dbc.