# Console : l'écran Appareils

> Lire les appareils MQTT et les nœuds Sparkplug B dans la console, régler ses cinq règles intégrées et ce que voit un lecteur.

Guide - Depuis la version 1.7.0 - Flexway v1.7.1 - https://flexway.io/docs/operations-console-devices/

> Guide d'exploitation : configurer, déployer et observer la passerelle. Ce que fait la fonctionnalité côté produit : [guide produit](https://flexway.io/docs/product-iot-devices/) ; l'appeler : [guide développeur](https://flexway.io/docs/developer-mqtt-devices/).

L'écran **Appareils** (`/devices`, après Agents) montre l'[écouteur MQTT des appareils](https://flexway.io/docs/operations-mqtt-devices/) et
les [nœuds Sparkplug B](https://flexway.io/docs/operations-sparkplug/) : connexions, refus, quotas, nœuds en ligne et hors ligne de **toutes**
les répliques. Il apparaît dès que la passerelle déclare `listeners.mqtt` ; rien à activer dans la console.

## Étapes

### Lire l'écran

| Partie | Ce qu'elle montre | Qui |
| --- | --- | --- |
| Synthèse (fenêtre choisie) | Appareils connectés (hors anonymes), part MQTT 5, `PUBLISH` admis par seconde, latence ajoutée p95, refus par cause, connexions par mode d'identité, quotas et contre-pression par tenant (lien vers Consommation pour le quota du jour), écarts de séquence cumulés | Tous ; un lecteur, son tenant |
| Nœuds Sparkplug (sans fenêtre, filtre « En ligne », « Hors ligne ») | Les tables de toutes les répliques fusionnées : un nœud repris par une autre réplique est **rattaché**, jamais hors ligne ; les nœuds d'une réplique qui ne répond plus restent listés une heure, marqués « Réplique muette » ; applications hôtes et leur `STATE` | Tous ; un lecteur, son tenant |
| Panneau d'un nœud (`/devices/<groupe>/<nœud>`) | État, appareils, entrée de chaque réplique (la bascule), écarts, commandes admises et refusées - jamais une valeur | Tous ; réglages de bascule et courtier aux admins |
| Limites de l'écouteur MQTT | Bornes en vigueur, refus par borne (8 bornes), fermetures normales par cause (8 causes), redirections et reprises, occupation de `max_connections` de la réplique la plus chargée, capacité de la table des nœuds et nœuds non gardés | Admins, sans filtre de tenant |
| Bornes du tenant et des appareils | `max_connections_per_tenant`, `max_connection_rate_per_tenant`, `listeners.mqtt.tenant`, `listeners.mqtt.device` | Admins ; un lecteur, sauf si l'exploitant les masque |
| Bandeaux | Tempête de reconnexions (refus par débit >= 10/min), quotas atteints, courtier injoignable, nœuds rattachés | Selon la donnée |

Les comptes de nœuds et les rattachements viennent des tables des répliques : ils restent lus quand les métriques ne
répondent pas.

### Régler les cinq règles intégrées

Dans les valeurs du chart de la console, `alerts.builtins` ([Alerter depuis la console](https://flexway.io/docs/operations-console-alerts/)) :

| Règle | Défaut | Réglables |
| --- | --- | --- |
| `device-connections-refused` | Plus de 5 % des `CONNECT` refusés sur 5 min, dès 20, `for` 5 min ; le dénominateur compte les refus par borne ; sujet : `mqtt` | `threshold`, `minRequests`, `for`, `excludeCauses` (les 8 causes `authentication`, `not_authorized`, `binding`, `wildcard`, `payload_invalid`, `quota`, `packet_too_large`, `upstream_unavailable` et les 8 bornes `max_connections`, `max_unauthenticated_connections`, `max_connections_per_ip`, `max_connection_rate_per_ip`, `max_connections_per_tenant`, `max_connection_rate_per_tenant`, `connect_rate_per_identity`, `max_sessions_per_identity`), `enabled` |
| `sparkplug-node-offline` | Au moins 1 nœud hors ligne dans la table fusionnée, `for` 2 min ; un nœud rattaché n'est pas hors ligne ; valeur : le nombre de nœuds et de tenants, jamais un nom | `threshold` (un nombre), `for`, `enabled` |
| `mqtt-listener-saturation` | La réplique la plus chargée au-delà de 90 % de `max_connections`, `for` 5 min ; sujets : les répliques | `threshold`, `for`, `enabled` |
| `device-throttled` | **Désactivée** ; activée : plus de 1 % des appareils retenus par la contre-pression, `for` 10 min | `enabled`, `threshold`, `for` |
| `sparkplug-sequence-gaps` | **Désactivée** ; activée : au moins 10 écarts `seq` ou `bdSeq` sur 5 min ; valeur : le nombre de tenants | `enabled`, `threshold` (un nombre), `for` |

```yaml title="values.yaml"
# valeurs du chart de la console
alerts:
  builtins:
    - { name: device-connections-refused, excludeCauses: [authentication, upstream_unavailable] }
    - { name: sparkplug-node-offline, threshold: 3, for: 5m }    # un nombre de nœuds, pas une part
    - { name: sparkplug-sequence-gaps, enabled: true, threshold: 50 }
```

### Masquer les bornes aux lecteurs

```yaml title="values.yaml"
# valeurs du chart de la console
devices:
  readerBounds: hide   # show par défaut ; FLEXWAY_CONSOLE_DEVICES_READER_BOUNDS
```

Les bornes de l'écouteur et les refus d'avant toute identité restent aux admins quel que soit ce réglage.

## Vérifier

- L'écran Appareils liste les nœuds de chaque réplique ; arrêter une réplique qui draine : ses nœuds passent
  « rattachés » sur une autre, jamais hors ligne.
- Diagnostic -> Alertes : les cinq règles, `device-throttled` et `sparkplug-sequence-gaps` « Désactivées » sauf réglage ;
  le seuil réglé à la place du défaut.
- `GET /api/alerts` : `tuning.threshold_kind` vaut `count` pour les deux règles Sparkplug, `ratio` pour les autres.

## À savoir

| Sujet | Ce qu'il faut savoir |
| --- | --- |
| Fusion | Par tenant et nœud : l'entrée à la naissance la plus récente l'emporte, `bdSeq` en départage ; un nœud vu seulement par ses commandes n'est pas listé |
| Réplique muette | La console garde la dernière table de chaque réplique une heure : ses nœuds restent listés, marqués, sauf en ligne ailleurs |
| Réplique perdue | Aucune trace de bascule : le nœud réapparaît en ligne sur une autre réplique ; `sparkplug-node-offline` attend 2 min |
| Lecture | La console interroge `GET /sparkplug/nodes` de chaque réplique toutes les 15 s (32 Mio au plus par réplique) |
| Noms | Les noms de nœuds et d'appareils ne sont jamais dans une métrique : aucune courbe par nœud, des compteurs cumulés |
| Pas montré | Octets MQTT par seconde (aucune métrique), traces par nœud |
| Seuils des bandeaux | Tempête : refus par débit >= 10/min ; quotas : un refus de quota ou de `max_connections_per_tenant` ; courtier : un `upstream_unavailable` ; rattachement : un nœud rattaché |
| Admin filtré sur un tenant | Voit l'écouteur et les refus aux bornes du tenant, pas les limites de l'écouteur |

*Disponible depuis `1.7.0`.*
