# API SES-imagotag / Vusion (ImagoTag Level 1)

**Serveur :** `http://localhost:8001`  
**Base URL :** `http://{host}:{port}/service`  
**Auth :** Basic Auth (optionnel selon config serveur)  
**Content-Type POST :** `application/xml`  
**Accept GET :** `application/xml` ou `application/json`

---

## 1. Statut du serveur

### `GET /service/status`

Retourne l'état du serveur ImagoTag.

```
> GET /service/status
< HTTP 200
< <ServiceStatus>
<   <status>ONLINE</status>
<   <accessPoints>1</accessPoints>
<   <labels>13</labels>
< </ServiceStatus>
```

**Utilisation :** `VusionClient.testConnection()`

---

## 2. Inventaire / Liste des étiquettes

### `GET /service/labelinfo`

Liste **toutes les étiquettes** avec détails complets. Paginé.

**Paramètres :**

| Param | Type | Défaut | Description |
|-------|------|--------|-------------|
| `page` | int | `0` | Numéro de page (0-indexed) |
| `recordsPerPage` | int | `250` | Enregistrements par page |

**Réponse (JSON) :**

```json
{
  "LabelInfo": [
    {
      "LabelId": "DE158A85",
      "Type": "1.6 BWR",
      "FirmwareVersion": "3.1.8",
      "ConnectionStatus": "ONLINE",
      "PowerStatus": "UNKNOWN",
      "UpdatedAt": "2026-06-11T22:40:58.930+02:00",
      "Rssi": "-63",
      "AccessPointId": "663199",
      "Status": "SUCCESSFUL",
      "TaskType": "SWITCH_PAGE",
      "CurrentPage": "14",
      "WakeupTime": "2026-06-11T23:49:07.255+02:00",
      "SyncQuality": "251",
      "LabelErrors": "0",
      "Lqi": "2",
      "SecurityStatus": "NO_PIN",
      "Protocol": "UNKNOWN"
    }
  ],
  "@totalRecords": "13",
  "@totalPages": "5",
  "@page": "0",
  "@recordsPerPage": "250"
}
```

**Champs `LabelInfo` :**

| Champ | Type | Description |
|-------|------|-------------|
| `LabelId` | `string` | Identifiant hex 8 caractères |
| `Type` | `string` | Type d'écran (ex: `1.6 BWR`) |
| `FirmwareVersion` | `string` | Version firmware |
| `ConnectionStatus` | `enum` | `ONLINE` / `OFFLINE` |
| `PowerStatus` | `string` | `UNKNOWN` ou pourcentage batterie |
| `UpdatedAt` | `datetime` | Dernière mise à jour |
| `Rssi` | `string` | Force du signal radio |
| `AccessPointId` | `string` | ID du point d'accès associé |
| `Status` | `enum` | Dernier statut tâche : `SUCCESSFUL` / `FAILED` |
| `TaskType` | `string` | Dernier type de tâche (ex: `SWITCH_PAGE`) |
| `CurrentPage` | `string` | Page actuellement affichée |
| `WakeupTime` | `datetime` | Dernier réveil de l'ESL |
| `SyncQuality` | `string` | Qualité de la synchro (0-255) |
| `LabelErrors` | `string` | Nombre d'erreurs |
| `Lqi` | `string` | Link Quality Indicator |
| `SecurityStatus` | `enum` | `NO_PIN` / `PIN_SET` |
| `Protocol` | `string` | Protocole de communication |

**Utilisation :** `VusionClient.listEsls()`, page inventaire Vusion

---

### `GET /service/labelinfo/{labelId}`

Détail d'une étiquette spécifique.

```
> GET /service/labelinfo/DE158A7F
< HTTP 200
< { "LabelId": "DE158A7F", "Type": "1.6 BWR", ... }
```

**Paramètre chemin :**

| Param | Description |
|-------|-------------|
| `labelId` | Identifiant hex 8 caractères (ex: `DE158A7F`) |

**Réponse :** Objet `LabelInfo` unique (même format que ci-dessus).

**Erreur :** HTTP 404 si l'ID est inconnu.

**Utilisation :** `VusionClient.ping()`

---

### `GET /service/labelinfo/statistics`

Statistiques globales des étiquettes (total, connexions, batterie).

### `GET /service/labelinfo/error`

Étiquettes en erreur (paginé).

### `GET /service/labelinfo/problem`

Étiquettes avec problèmes.

### `GET /service/labelinfo/unseen`

Étiquettes jamais vues par le serveur.

### `GET /service/labelinfo/unmatched`

Étiquettes sans article associé (Level 2).

### `GET /service/labelinfo/unsuccessful`

Étiquettes dont la dernière mise à jour a échoué.

### `GET /service/labelinfo/notseenforminutes/{minutes}`

Étiquettes non vues depuis N minutes.

### `GET /service/labelinfo/seeninlastminutes/{minutes}`

Étiquettes vues dans les N dernières minutes.

### `GET /service/labelinfo/modifiedafter`

Étiquettes modifiées après un timestamp. Param : `?date=`.

### `GET /service/labelinfo/type/{labelId}`

Infos sur le type d'écran (dimensions, nombre de pages).

### `GET /service/labelinfo/tag/{tagName}`

Étiquettes correspondant à un tag.

---

## 3. Liste simplifiée (IDs uniquement)

### `GET /service/label`

Retourne uniquement les IDs des étiquettes (léger, pas de détails).

**Réponse (XML) :**

```xml
<LabelList>
  <Label id="DE158A7F"/>
  <Label id="DE158A85"/>
  <Label id="F759F383"/>
  ...
</LabelList>
```

### `POST /service/label`

Enregistrer de nouvelles étiquettes (body XML ou JSON).

### `DELETE /service/label/{labelId}`

Désinscrire une étiquette.

```
> DELETE /service/label/DE158A7F
< HTTP 200
```

---

## 4. Gestion des tâches (Reset, Template, Firmware…)

### `POST /service/task`

Soumettre une tâche à une ou plusieurs étiquettes.

**Types de tâches :**

| Tâche | Balise XML | Description |
|-------|-----------|-------------|
| Reset usine | `<ResetTask labelId="..."/>` | Réinitialise complètement l'ESL |
| Template | `<TemplateTask labelId="...">...</TemplateTask>` | Applique un template XSLT |
| Image | `<ImageTask labelId="...">...</ImageTask>` | Envoie une image à afficher |
| Firmware | `<FirmwareTask labelId="...">...</FirmwareTask>` | Met à jour le firmware |
| Refresh | `<RefreshTask labelId="..."/>` | Rafraîchit l'affichage |
| Switch page | `<SwitchPageTask labelId="..."/>` | Change la page affichée |

**Exemple ResetTask :**

```xml
<?xml version='1.0' encoding='utf-8'?>
<TaskOrder>
  <ResetTask labelId='DE158A7F'/>
</TaskOrder>
```

```
> POST /service/task
> Content-Type: application/xml
>
> <?xml version='1.0' encoding='utf-8'?>
> <TaskOrder>
>   <ResetTask labelId='DE158A7F'/>
> </TaskOrder>
<
< HTTP 200
< <TransactionId>42</TransactionId>
```

**Réponse succès :** HTTP 200 avec `<TransactionId>...</TransactionId>`  
**Réponse erreur :** HTTP 500 avec XML d'erreur

**⚠️ Important — Format JAXB :** Les attributs doivent être en **camelCase** (`labelId`, pas `LabelId`). JAXB lowercase automatiquement la première lettre du nom de champ Java. Un attribut `LabelId` (majuscule) sera ignoré → `null` → "Label ID is empty".

**Utilisation :** `VusionClient.sendReset()`

---

## 5. Statut des mises à jour

### `GET /service/updatestatus`

Liste de toutes les transactions de mise à jour (paginé).

### `GET /service/updatestatus/waiting`

Transactions en attente.

### `GET /service/updatestatus/unsuccessful`

Transactions échouées.

### `GET /service/updatestatus/label/{labelId}`

Transactions pour une étiquette spécifique.

```
> GET /service/updatestatus/label/DE158A7F
< HTTP 200
< { ... 11 enregistrements ... }
```

### `GET /service/updatestatus/transaction/{tid}`

Transactions pour un ID de transaction.

### `GET /service/updatestatus/correlationid/{cid}`

Transactions par ID de corrélation.

### `GET /service/updatestatus/externalid/{eid}`

Transactions par ID externe.

---

## 6. Templates XSLT

### `GET /service/template`

Liste des templates disponibles.

**Réponse (exemple) :** 11 templates trouvés : `duo.xsl`, `gondole.xsl`, `reset.xsl`, etc.

### `GET /service/template/invalid`

Templates invalides.

### `GET /service/template/{name}`

Contenu XSLT d'un template.

### `POST /service/template/{name}`

Uploader un nouveau template.

---

## 7. Firmware

### `GET /service/firmware`

Liste des firmwares disponibles.

### `POST /service/firmware`

Uploader un firmware.

---

## 8. Polices (Fonts)

### `GET /service/font`

Liste des polices installées. 661 polices trouvées sur le serveur local.

### `POST /service/font`

Uploader une police.

---

## 9. Points d'accès

### `GET /service/accesspoint`

Points d'accès enregistrés.

```
> GET /service/accesspoint
< HTTP 200
< { "AccessPoint": [ { "id": "663199", ... } ] }
```

### `POST /service/accesspoint`

Enregistrer un point d'accès.

### `DELETE /service/accesspoint/{id}`

Supprimer un point d'accès.

### `GET /service/accesspointinfo`

Infos détaillées des points d'accès.

### `GET /service/accesspointinfo/withoutchannel`

AP sans canal configuré.

### `GET /service/accesspointinfo/channelconflict`

AP avec conflit de canal.

---

## 10. Événements

### `GET /service/labelevent`

Événements des étiquettes.

### `GET /service/labelevent/{labelId}`

Événements pour une étiquette spécifique.

---

## 11. Historique des infos étiquettes

### `GET /service/labelinfohistory`

Historique complet.

### `GET /service/labelinfohistory/{labelId}`

Historique pour une étiquette.

### `GET /service/labelinfohistory/modifiedafter`

Historique modifié après timestamp.

---

## 12. Configuration serveur

### `GET /service/configuration`

Toutes les clés/valeurs de configuration (234 paramètres).

### `GET /service/configuration/modified`

Configurations modifiées (non défaut).

### `GET /service/configuration/{key}`

Valeur d'une clé spécifique.

### `PUT /service/configuration/{key}`

Modifier une valeur de configuration.

### `DELETE /service/configuration/{key}`

Réinitialiser une clé à sa valeur par défaut.

---

## 13. Tags

### `GET /service/tag`

Liste des tags définis.

### `POST /service/tag/add`

Ajouter des tags à des étiquettes.

### `POST /service/tag/remove`

Supprimer des tags.

---

## 14. Licences

### `GET /service/license`

Informations sur la licence du serveur.

---

## 15. Problèmes

### `GET /service/problem`

Problèmes système détectés.

---

## 16. Logging

### `POST /service/logging`

Configurer le niveau de logging.

---

## 17. Export / Import

### `GET /service/export/level1`

Export des données Level 1 (fichier ZIP).

### `POST /service/import/level1`

Import Level 1 (multipart).

---

## 18. Transactions

### `GET /service/transaction/{id}`

Statut d'une transaction.

---

## Résumé par usage

| Usage | Endpoint | Méthode |
|-------|----------|---------|
| Tester la connexion | `/service/status` | `GET` |
| Lister toutes les ESLs (complet) | `/service/labelinfo` | `GET` |
| Lister les ESLs (IDs seuls) | `/service/label` | `GET` |
| Détail d'une ESL | `/service/labelinfo/{id}` | `GET` |
| Réinitialiser une ESL | `/service/task` | `POST` |
| Statistiques ESL | `/service/labelinfo/statistics` | `GET` |
| Échecs de mise à jour | `/service/updatestatus/unsuccessful` | `GET` |
| Templates disponibles | `/service/template` | `GET` |
| Configuration serveur | `/service/configuration` | `GET` |

---

## Schéma d'architecture

```
┌───────────────┐     POST /service/task      ┌──────────────────┐
│   Agent PHP   │ ──────────────────────────>  │  Serveur Vusion  │
│  (local LAN)  │                              │   (port 8001)    │
│               │ <──────────────────────────  │  ImagoTag Java   │
│ VusionClient  │     HTTP 200 + TxId          │                  │
└───────────────┘                              └──────────────────┘
       │                                              │
       │ GET /api/agent/inventory/sync                │ GET /service/labelinfo
       ▼                                              ▼
┌───────────────┐                              ┌──────────────────┐
│  Site Laravel  │                              │   14 ESLs réelles │
│ AZ-TAG-ATELIER │                              │  (1.6 BWR, 3.1.x)│
└───────────────┘                              └──────────────────┘
```
