LogiTrain/ API

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"}
  ]
}
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