# REPRISE — Test atelier : borne ABB Terra AC + compteur ABB B2x (B21/B23/B24)

## Contexte
Je teste EN ATELIER une borne ABB Terra AC + un compteur ABB B2x (en stock) avant
une visite client. Objectif : faire reconnaître les deux par nymea, depuis MES
propres paquets Debian, et valider les mesures (surtout le scaling du compteur).

On a rôdé tout le pipeline modbus aujourd'hui (plugin Eastron SDM construit et
fonctionnel). Les deux plugins ABB suivent EXACTEMENT le même chemin.

## Infrastructure (rappel)
- VM build : etm-powersync-dev, conteneur LXC `build-1-15` (libnymea-dev 1.15.0)
  - déjà installés dans le conteneur : libnymea-modbus-dev, qt6-serialport-dev,
    qt6-serialbus-dev, nymea-dev-tools, qt6-base-dev(-tools)
- Edge de test : ssh etm@192.168.1.120 (etm-nymea-dev), nymead actif
- Dépôt APT : reprepro sur /mnt/builddisk/apt-repo ; publish-to-repo.sh ; clé GPG ETM
  - canal de travail : powersync-testing ; edge branché dessus
- Repo modbus : git.etm-powersync.fr/ETM-Schurig/etm-powersync-plugins-modbus
  - chemin local VM : ~/projects/etm-powersync/etm/etm-powersync-plugins-modbus
  - contient déjà : eastron/ (fonctionne), modbus.pri recâblé sur paquets système
    (PKGCONFIG += nymea-modbus + include(/usr/include/nymea-modbus/modbus-tool.pri))

## Règles de packaging (acquises aujourd'hui, à respecter)
- 1 seul paquet binaire par repo modbus actuel → PAS de fichier debian/*.install
  (qmake6 installe la .so, debhelper la ramasse). Le .install ne sert qu'en multi-binaire.
- debian/control Build-Depends modbus : debhelper, pkg-config, libnymea-dev,
  nymea-dev-tools:native, libnymea-modbus-dev, qt6-base-dev, qt6-base-dev-tools,
  qt6-serialport-dev, qt6-serialbus-dev
- debian/rules : nettoyer autogenerated/ + moc_* + *plugininfo.h au clean
- changelog : format strict (ligne vide avant le " --"), version +etm1 (plugins maison)
- .pro racine : PLUGIN_DIRS sans backslash après la dernière entrée
- nom paquet plugin maison = powersync-plugin-XXX (pas de Provides/Replaces si code original)
- Le conteneur CLONE depuis Gitea → toujours git push AVANT de builder dans le conteneur

## Le pipeline qui marche (référence eastron)
git push, puis dans le conteneur :
  cd /root && rm -rf <repo> && git clone <url> && cd <repo>
  qmake6 && make -j$(nproc)        # valider compil + génération modbus AVANT debian/
  dpkg-buildpackage -b -us -uc
Puis vérif (dpkg-deb -c → la .so présente), lxc file pull, reprepro includedeb
powersync-testing, publish-to-repo.sh, install sur .120, restart nymead.

## TÂCHE 1 — Borne ABB Terra AC (code upstream, faible risque)
Le plugin existe DÉJÀ : nymea-plugins-modbus, branche experimental-silo, dossier abbterra/
(deux ThingClass : terraAcTcp {address, port=502, slaveId=1} et terraAcRtu {rtuMaster, slaveId=1}).
À faire :
1. Copier abbterra/ depuis l'upstream experimental-silo dans MON repo modbus.
2. Ajouter "abbterra" à PLUGIN_DIRS (sans casser le backslash).
3. Builder via le pipeline ci-dessus → powersync-plugin-abbterra_1.15.0+etm1.
4. Import testing + install .120.
À CONFIRMER en atelier : la borne en stock est-elle en Modbus TCP ou RTU ?
(détermine quelle ThingClass utiliser à la config nymea:app)

## TÂCHE 2 — Compteur ABB B2x (plugin NEUF, à valider sur matériel)
J'ai déjà un abbb2x-registers.json prêt (registres extraits/vérifiés des manuels
B21 + B23/B24 — même mapping pour les 3 modèles ; puissances en int32 SIGNÉ pour
gérer l'injection PV ; énergie import/export en uint64 size 4 ; scaling via "unit").
Reste à créer le plugin autour :
1. Créer le dossier b2x/ (ou abbb2x/) dans MON repo modbus avec :
   - abbb2x-registers.json (je l'ai)
   - eastron.pro → adapter en abbb2x.pro (MODBUS_CONNECTIONS += abbb2x-registers.json ;
     include(../modbus.pri))
   - integrationpluginabbb2x.cpp/.h/.json → ADAPTER depuis integrationplugineastron.*
     (même type d'appareil = compteur ; mapper les registres générés vers l'interface
     nymea smartmeter : currentPower, voltage/current/power par phase, énergie conso/prod).
     Vendor = "ABB". Nouveau pluginId/thingClassId/vendorId (générer des UUID, NE PAS
     réutiliser ceux d'eastron).
2. Ajouter "abbb2x" à PLUGIN_DIRS.
3. Builder → powersync-plugin-abbb2x_1.15.0+etm1, import, install .120.

POINTS À VALIDER FACE AU COMPTEUR (typiques d'un plugin neuf) :
- SCALING PUISSANCE : manuel dit "Signed, 0.01 W". Si la puissance lue est ×100 trop
  grande, le scaling réel est 1W → corriger le "unit" dans le registers.json.
- Comment le pipeline applique le "unit" (générateur vs code .cpp) : vérifier dans
  integrationpluginabbterra.cpp comment ABB applique le scaling (grep unit/toDouble/setVoltage).
- checkReachableRegister = voltagePhaseA : confirmer qu'il répond à l'init.
- Sur un compteur monophasé (B21), L2/L3 doivent rester à 0/invalide — normal.

## Config Modbus RTU (si transport série)
- Vérifier l'adaptateur série sur .120 : ls -l /dev/ttyUSB* ; dmesg | grep -iE "ttyUSB|ftdi|ch341|cp210"
- nymead doit avoir accès au port : user nymea dans le groupe dialout (sudo usermod -aG dialout nymea + restart)
- Paramètres ligne ABB B2x par défaut : à confirmer sur l'écran du compteur (souvent 9600 8N1)
- Adresses esclaves : si borne RTU + compteur RTU sur le MÊME bus → slaveId DISTINCTS
- Dans nymea:app : si RTU, créer d'abord le "Modbus RTU master" (l'adaptateur), puis les things

## À ne pas oublier (notes de fond, PAS pour aujourd'hui)
- Modélisation interfaces compteur : prévoir au ThingClass un param "role"
  (producteur/consommateur/raccordement) + un param "phase" (L1/L2/L3 pour mono) —
  donnée d'installation, inerte aujourd'hui, prérequis du DÉLESTAGE futur.
- Délestage : stratégie 2 niveaux (N1 = phases du compteur principal ; N2 = sous-compteurs
  par circuit). nymea-energy-plugin-nymea (chargebyte, GPL) contient déjà de la logique de
  délestage → l'INVESTIGUER avant de coder. Le délestage ira dans powersync-energy-plugin-etm
  (Community, rule-based, GPL) ; l'optimizer reste propriétaire (œuvre séparée via socket).

## Mon environnement
Je travaille en français. Je préfère : affichage complet des fichiers (cat -n) plutôt que
diffs, logs complets avant tout commit, pas de fallback silencieux. Va étape par étape,
attends ma sortie de commande avant de passer à la suivante.
