LogiTrain — API ouverte (documentation technique)
LogiTrain repose sur Odoo 18 Community : tous les modèles LogiTrain sont accessibles par l'API externe standard d'Odoo (XML-RPC et JSON-RPC), avec les mêmes droits que dans l'interface (groupes Apprenant / Formateur / Administrateur et règles d'enregistrement). S'y ajoutent deux points d'accès HTTP propres à LogiTrain pour le RFID et la cartographie.
1. Authentification
| Usage | Méthode |
|---|---|
| Scripts, simulateurs, outils pédagogiques | Identifiant + mot de passe ou clé API d'un utilisateur Odoo (Préférences → Sécurité du compte → Nouvelle clé API). Utiliser un compte dédié, avec le groupe LogiTrain adapté. |
Lecteurs RFID (passerelle rfid-bridge) |
Jeton propre à chaque lecteur (logitrain.rfid.reader.api_token, visible par les administrateurs LogiTrain, régénérable). |
2. API externe Odoo (XML-RPC / JSON-RPC)
Points d'accès : https://<serveur>/xmlrpc/2/common (authentification) et https://<serveur>/xmlrpc/2/object (appels), ou https://<serveur>/jsonrpc.
import xmlrpc.client
URL, DB, LOGIN, KEY = "https://logitrain.local", "logitrain", "formateur1", "<clé API>"
uid = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/common").authenticate(DB, LOGIN, KEY, {})
odoo = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/object")
# Lire les tournées validées du jour avec leurs indicateurs
tours = odoo.execute_kw(DB, uid, KEY, "logitrain.tour", "search_read",
[[("state", "=", "validated")]],
{"fields": ["name", "date", "vehicle_id", "distance_km", "cost", "kpis_json"]})
# Créer un plan de chargement et le calculer
plan_id = odoo.execute_kw(DB, uid, KEY, "logitrain.loadplan", "create", [{
"container_type_id": 1,
"item_ids": [(0, 0, {"name": "Carton", "qty": 40, "length": 600, "width": 400, "height": 400, "weight": 18})],
}])
odoo.execute_kw(DB, uid, KEY, "logitrain.loadplan", "action_compute", [[plan_id]])
Les méthodes action_* visibles sur les boutons des formulaires (calculer un itinéraire, optimiser, répartir, calculer un plan de chargement, clôturer une session RFID, etc.) sont appelables de la même manière.
Principaux modèles
| Domaine | Modèles |
|---|---|
| Formation | logitrain.cohort, logitrain.exercise, logitrain.exercise.submission |
| Catalogue | logitrain.container.type, logitrain.vehicle.profile, logitrain.skill |
| Tournées | logitrain.tour.plan, logitrain.tour, logitrain.tour.stop, logitrain.tour.rules, logitrain.tour.violation, logitrain.tour.snapshot |
| Chargement | logitrain.loadplan, logitrain.loadplan.item, logitrain.loadplan.placement |
| Parc | fleet.vehicle (étendu), logitrain.fleet.document, logitrain.fleet.maintenance.plan, logitrain.fleet.mission, logitrain.fleet.incident, fleet.vehicle.log.services (étendu), logitrain.fleet.tco.report (lecture seule) |
| Entrepôt / RFID | logitrain.rfid.reader, logitrain.rfid.tag, logitrain.rfid.session, logitrain.rfid.read, et les modèles standard stock.picking, stock.quant, stock.lot, stock.location |
La liste complète des tables et champs est dans docs/DATABASE.md (générée depuis la base).
3. Points d'accès HTTP LogiTrain
POST /logitrain/rfid/reads — envoi de lectures RFID
Utilisé par la passerelle rfid-bridge (ou tout lecteur capable d'émettre du HTTP). Idempotent : une même lecture (EPC + lecteur + horodatage) n'est enregistrée qu'une fois.
En-tête X-Logitrain-Token: <jeton du lecteur> (ou champ token dans le corps). Corps JSON :
{
"session": 12,
"reads": [
{"epc": "3034257BF7194E4000001A85", "antenna": 1, "rssi": -52.5, "ts": "2026-10-12T09:15:03.120Z"},
{"epc": "3034257BF7194E4000001A86", "antenna": 2, "rssi": -61.0, "ts": "2026-10-12T09:15:03.180Z"}
]
}
sessionest facultatif : sans session, les lectures vont à la dernière session ouverte du lecteur.- Réponse
200:{"reader": 3, "session": 12, "stored": 2, "matched": 2, "unknown": 0}. - Erreurs :
400JSON invalide oureadsn'est pas une liste ;401jeton absent ou inconnu / lecteur archivé.
curl -X POST https://logitrain.local/logitrain/rfid/reads \
-H "Content-Type: application/json" -H "X-Logitrain-Token: 5f0c…" \
-d '{"reads":[{"epc":"3034257BF7194E4000001A85","antenna":1,"rssi":-50}]}'
GET /logitrain/rfid/ping
Test de connectivité sans authentification. Réponse : {"ok": true}.
POST /logitrain/client_config (JSON-RPC, utilisateur connecté)
Paramètres cartographiques utilisés par les widgets de carte : URL des tuiles, attribution, mode hors ligne, centre et zoom par défaut.
4. Services de calcul (auto-hébergés)
| Service | Rôle | Paramètre Odoo |
|---|---|---|
| OSRM | Itinéraires et matrices de distances/temps (extrait OpenStreetMap Tunisie) | Paramètres → LogiTrain → URL OSRM |
| VROOM | Optimisation des tournées multi-véhicules | Paramètres → LogiTrain → URL VROOM |
| Serveur de tuiles (optionnel) | Fond de carte hors ligne | URL des tuiles |
Ces services exposent leurs propres API documentées (OSRM : /route/v1, /table/v1 ; VROOM : POST / avec un problème JSON) et peuvent être utilisés directement pour des travaux pratiques avancés. En mode hors ligne, LogiTrain n'appelle aucun service externe et utilise une estimation à vol d'oiseau × coefficient routier.
5. Bonnes pratiques
- Un compte et une clé API par outil ou simulateur ; ne jamais utiliser le compte administrateur.
- Les apprenants ne voient via l'API que leurs propres enregistrements et les enregistrements partagés (mêmes règles que l'interface).
- Pour des données d'exercice en masse, préférer l'import CSV/Excel standard d'Odoo.