05 Procédure création capteurs Asystom

Enrôlement OTAA d'une balise Sentinel sur le LNS embarqué de la CloudGate

Pré-requis

Étape 1 — Vérifier la stack LoRa

Sur le canvas LuvitRED workspace Sheet 1, vérifier les 3 nodes config :

TypeNomRôle
lora fwdCG Forwarder EUPacket forwarder Semtech UDP, EU868
lora srvCG ServerNetID, sessions OTAA, déduplication
lora appAsystom AppAppEUI principal du déploiement, OTA devices DB

Étape 2 — Ajouter la balise dans sensors_config.json

{
  "DevEUI":   "AAAAAAAAAAAAAAAA",
  "AppEUI":   "BBBBBBBBBBBBBBBB",
  "AppKey":   "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC",
  "name":     "Balise-XX",
  "freq_seconds": 60,
  "site":     "TODO_SITE_NAME",
  "modele":   "Sentinel"
}

Étape 3 — Enrôler dans le LNS

Option A — Inject manuel (1 balise)

-- Function "add Balise-XX"
msg.app = {
  add = {
    name      = 'Balise-XX',
    DevEUI    = 'AAAAAAAAAAAAAAAA',
    AppEUI    = 'BBBBBBBBBBBBBBBB',
    AppKey    = 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC',
    ota       = true,
    class     = 'A',
    ADR       = true,
    confirmed = false,
  },
}
return msg

Wire : inject (manual) → function "add Balise-XX" → lora-app input.

Option B — Bulk register (industriel)

local cfg = require('sensors_config')
local bulk = require('bulk_register')
return bulk.build_add_msgs(cfg)

Wire : inject "bulk add" → function bulk → lora-app input. Tous les capteurs du JSON enregistrés en une fois.

Étape 4 — Réveiller la balise

Séquence magnétique Asystom Sentinel :

  1. Approcher l'aimant 3-6 secondes
  2. Retirer 3-6 secondes
  3. Répéter 3 fois
  4. LED clignote → la balise tente le Join OTAA

Étape 5 — Vérifier le Join

LuvitRED admin → menu LoRa → OTA Devices :

Étape 6 — Vérifier la chaîne uplink

Dans la sidebar Debug LuvitRED, attendre la première trame (1 min après Join). On doit voir :

[on_lora_message] { DevEUI: AAAA..., fport: 4, FCntUp: 1, ... tag: LORA_IN } [lora out] "<bytes raw>" [build_iobase_msg] { tag: IOBASE_OUT, url: ... } [handle_iobase_resp]{ status: 200, tag: IOBASE_RESP } [build_audit_line] → audit jsonl /mnt/data/luvitred/uplinks-YYYY-MM-DD.jsonl [build_asystom_msg] { tag: ASYSTOM_OUT, url: ... } [build_health_msg] { tag: HEALTH_OUT, trigger: data-up }

Si LORA_IN apparaît mais pas IOBASE_OUT/ASYSTOM_OUT : check les wires sortantes de on_lora_message dans le canvas (5 wires attendues : lora out, build_iobase_msg, build_audit_line, build_asystom_msg, build_health_msg).

Étape 7 — Configurer la cadence (downlink FPort 70)

local mf = require('main_flow')
msg.app = {
  queue = {
    ['AAAAAAAAAAAAAAAA'] = mf.build_frequency_command(120), -- 2 min
  },
}
return msg

Wire : inject (manual) → function set freq → lora-app input. Le downlink est envoyé lors du prochain uplink (Class A wait window).

Mapping FPort Asystom Sentinel

FPortDirectionUsage
1uplinkDonnées capteur format compact
2uplinkSettings echo
4uplinkDonnées capteur format étendu / FFT (121 bytes)
6uplink"REPLAY" (réémission de données antérieures)
64downlinkReboot balise (payload 00)
70downlinkSet frequency (payload little-endian)

Erreurs fréquentes

SymptômeCauseFix
Joined: ❌ après 5 minAppKey wrongVérifier la valeur en hex 32 chars contre la doc Asystom
LORA_IN apparaît, IOBASE/ASYSTOM jamaisWires output casséesVérifier 5 wires sortantes de on_lora_message
IOBASE_RESP status: 0URL pas joignable / DNS failVérifier global.iobase_host + connectivité WAN
Balise joinée mais pas d'uplink dataCadence pas configuréeTirer downlink FPort 70
IOBASE_RESP status: 401Token DAP expiré ou invalideVérifier que inj_dap_refresh cron tourne (50min). Le retry auto sur 401 devrait corriger seul.