Aller au contenu

Module Lua addon

Le module addon permet de se connecter dynamiquement à un service gRPC I²C (I2CService), d’appeler ses méthodes via réflexion et de récupérer les réponses sous forme de tables Lua.

Importation

Pour l’importer dans Lua :

local addon = require("addon_i2c")  -- remplacez par le `name` défini dans la config YAML

Configuration

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

iot:
  modules:
    addon:
      - name: addon_i2c
        address: "localhost:50052"   # adresse et port du serveur gRPC I²C
        timeout: 5                   # délai en secondes
        useTLS: false                # désactive TLS pour cet exemple
        addonType: "i2c"             # type de l’addon, ici I2C

Détails des options

  • name (string, requis) : Nom du module, utilisé dans require().
  • address (string, requis) : Adresse du serveur gRPC (ex. "host:port").
  • timeout (number, optionnel) : Timeout global pour connexion et appels (secondes).
  • useTLS (boolean, optionnel) : Active une connexion TLS si true.
  • addonType (string, requis) : Doit être "i2c" pour ce module.

Fonctions Lua

Toutes les méthodes gRPC s’appellent via :

local resp, err = addon.call(methodName, requestTable)

methodName est le nom exact de la RPC définie dans le .proto, et requestTable une table Lua mappant les champs du message.

addon.connect()

Établit la connexion gRPC.

  • Retour :

  • true, nil si succès

  • nil, "<message d’erreur>" sinon
local ok, err = addon.connect()
assert(ok, "Erreur connexion : " .. err)

addon.disconnect()

Ferme la connexion gRPC.

  • Retour :

  • true, nil si succès

  • nil, "<message d’erreur>" sinon
local ok, err = addon.disconnect()
assert(ok, "Erreur déconnexion : " .. err)

addon.call("Scan", {})ScanResponse

Scanne le bus I²C et renvoie la liste des adresses détectées.

  • Requête : {}
  • Réponse :
{
  addresses = { 32, 33, 64,  }  -- adresses 7 bits
}
local resp, err = addon.call("Scan", {})
if resp then
  for _, addr in ipairs(resp.addresses) do
    print(string.format("Device at 0x%02X", addr))
  end
else
  print("Scan failed:", err)
end

addon.call("ReadRegister", { address=…, register=…, length=… })ReadResponse

Lit une séquence d’octets depuis un registre d’un esclave I²C.

  • Requête :

  • address (uint32) : adresse 7 bits de l’esclave

  • register (uint32) : pointeur du registre de lecture
  • length (uint32) : nombre d’octets à lire
  • Réponse :
{
  data = "<octets bruts>"   -- chaîne Lua contenant les bytes
}
local req = { address=0x20, register=0x01, length=4 }
local resp, err = addon.call("ReadRegister", req)
if resp then
  local bytes = { string.byte(resp.data, 1, #resp.data) }
  print("Register read:", table.concat(bytes, ", "))
else
  print("ReadRegister failed:", err)
end

addon.call("WriteRegister", { address=…, register=…, data=… })WriteResponse

Écrit une séquence d’octets dans un registre d’un esclave I²C.

  • Requête :

  • address (uint32) : adresse 7 bits de l’esclave

  • register (uint32) : pointeur du registre d’écriture
  • data (bytes) : chaîne Lua contenant les octets à envoyer
  • Réponse :
{
  success = true|false,     -- statut de l’écriture
  message = "<info ou erreur>"
}
-- Prépare deux octets à écrire
local payload = string.char(0x12, 0x34)
local req = { address=0x20, register=0x02, data=payload }
local resp, err = addon.call("WriteRegister", req)
if resp and resp.success then
  print("WriteRegister succeeded:", resp.message)
else
  print("WriteRegister failed:", err or resp.message)
end

Champs Lua associés

  • addon.name : Nom de l’instance (champ name de la config YAML).
  • addon.type : Type du module ("addon").