# REPRISE — TÂCHE 1 : intégrer & builder ABB Terra AC (vendoring upstream)

## Contexte
Je prépare une visite client (borne ABB Terra AC + compteur ABB B23). Test EN ATELIER
d'abord. Le plugin **abbterra** se trouve DÉJÀ dans MON repo
`etm-powersync-plugins-modbus` (dossier `abbterra/`) — il a été copié depuis l'upstream
nymea-plugins-modbus, branche `experimental-silo`. Le compteur B2x (TÂCHE 2) est déjà
intégré et prêt (abbb2x ajouté à PLUGIN_DIRS, debian/control + changelog faits).

But de cette tâche : packager et déployer la borne, proprement, en décidant comment on
gère le fait que ce code est upstream-mais-pas-encore-release.

## Décision de fond (déjà tranchée — à appliquer, pas à rediscuter)
abbterra N'EST PAS un fork divergent : je ne modifie pas le code, je le **builde en avance**
parce que nymea ne l'a pas encore publié dans son dépôt apt (il n'est que dans la branche
experimental-silo). C'est du **vendoring temporaire**. Tout nymea est GPLv3 → redistribution
et build anticipé explicitement permis, aucune contrainte juridique.

Approche retenue (cohérente avec l'archi existante du mirror) :
1. **Nom du paquet = `nymea-plugin-abbterra`** (nom UPSTREAM, PAS de préfixe powersync-).
2. **PAS de Provides/Replaces/Conflicts** (rien ne le concurrence : le mirror l'exclura).
3. **Ajouter `abbterra` à `FORKED_PLUGINS`** dans `/mnt/builddisk/sync-nymea-mirror.sh`.
   → empêche le mirror de réimporter une version upstream concurrente sous le même nom.
   `FORKED_PLUGINS` couvre désormais DEUX cas : forks divergents (keba) ET builds
   anticipés de code upstream non encore release (abbterra). Mettre à jour son commentaire.
4. **Tracer le vendoring** : créer `abbterra/VENDORED.md` (voir contenu plus bas).

Pourquoi ce choix : transition douce. Le jour où nymea release abbterra dans master/stable,
il suffira de (a) supprimer le dossier abbterra/ de mon repo, (b) retirer `abbterra` de
FORKED_PLUGINS, (c) relancer le sync — le mirror tirera alors la version OFFICIELLE sous
le MÊME nom, donc l'edge bascule dessus sans réinstall ni reconfig des things. Un seul nom
de paquet existe à tout instant, jamais de doublon.

## Infrastructure (rappel)
- VM build : etm-powersync-dev ; conteneur LXC `build-1-15` (libnymea-dev 1.15.0,
  libnymea-modbus-dev, qt6-serialport-dev, qt6-serialbus-dev, nymea-dev-tools, python3).
- Edge test : ssh etm@192.168.1.120, nymead actif, canal powersync-testing.
- Dépôt APT : reprepro /mnt/builddisk/apt-repo ; publish-to-repo.sh ; clé GPG ETM.
- Mirror : /mnt/builddisk/sync-nymea-mirror.sh (sélection auto depuis index upstream
  moins FORKED_PLUGINS ; keba déjà dedans).
- Repo modbus : git.etm-powersync.fr/ETM-Schurig/etm-powersync-plugins-modbus
  local : ~/projects/etm-powersync/etm/etm-powersync-plugins-modbus
  - contient déjà : eastron/ (OK, en prod), abbb2x/ (prêt), abbterra/ (à packager).
  - modbus.pri recâblé sur paquets système (PKGCONFIG nymea-modbus + modbus-tool.pri).
  - Le conteneur CLONE depuis Gitea → TOUJOURS git push avant de builder.

## Règles de packaging (acquises, à respecter)
- .pro racine : PLUGIN_DIRS une entrée par ligne, PAS de backslash après la dernière ;
  pas de SUBDIRS local ni de .depends vers libnymea-modbus (lib système).
- Multi-binaire : le repo aura maintenant 3 paquets (eastron + abbb2x + abbterra) dans
  le MÊME debian/ → IL FAUT un `debian/<paquet>.install` par paquet (nom EXACT du Package:),
  sinon dh_install ne route pas les .so → paquet vide. Vérifier que les .install existent
  pour les 3 : powersync-plugin-eastron.install, powersync-plugin-abbb2x.install,
  nymea-plugin-abbterra.install. Chacun contient la ligne :
    usr/lib/*/nymea/plugins/libnymea_integrationplugin<nom>.so
- 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.
- changelog : format strict (ligne vide avant le " --"). Bumper la source en +etm3
  (etm2 = ajout abbb2x déjà fait).
- rules : nettoyer autogenerated/ + moc_* + *plugininfo.h au dh_auto_clean.

## ÉTAPES

### 1. Vérifier l'état d'abbterra dans le repo
   ls -la ~/projects/.../etm-powersync-plugins-modbus/abbterra/
   grep -n 'PLUGIN_DIRS\|abbterra\|abbb2x\|eastron' etm-powersync-plugins-modbus.pro
   - abbterra présent ? abbterra dans PLUGIN_DIRS ? (l'ajouter si absent, sans casser le backslash)

### 2. debian/ — ajouter le paquet nymea-plugin-abbterra
   - debian/control : nouveau stanza `Package: nymea-plugin-abbterra`
       Architecture: any
       Section: libs
       Depends: ${shlibs:Depends}, ${misc:Depends}
       (PAS de Provides/Replaces/Conflicts)
       Description: ABB Terra AC charging station (Modbus TCP/RTU) — vendored from
        nymea-plugins-modbus experimental-silo, pending upstream release.
   - debian/nymea-plugin-abbterra.install :
       usr/lib/*/nymea/plugins/libnymea_integrationpluginabbterra.so
   - debian/changelog : nouvelle entrée en tête, version 1.15.0+etm3 (ligne vide avant " --").
   - Vérifier que les .install des 3 paquets existent (cf. règles multi-binaire).

### 3. Tracer le vendoring — créer abbterra/VENDORED.md
   Contenu :
   ----------------------------------------------------------------
   # Vendoring — abbterra
   Copié depuis : nymea/nymea-plugins-modbus @ branche experimental-silo
   Commit source : a652793 ("Add new plugin for ABB Terra AC Charger")
   Date copie : 2026-06-01
   Raison : plugin présent upstream mais PAS encore publié dans le dépôt apt nymea.
            Build anticipé ETM en attendant la release master/stable.
   Nom paquet : nymea-plugin-abbterra (nom upstream conservé)
   Exclu du mirror via FORKED_PLUGINS dans sync-nymea-mirror.sh.
   SORTIE (quand nymea release abbterra dans master/stable) :
     1) supprimer le dossier abbterra/ de ce repo
     2) retirer "abbterra" de FORKED_PLUGINS
     3) relancer sync-nymea-mirror.sh → le mirror tire la version officielle (même nom)
   ----------------------------------------------------------------

### 4. Mirror — exclure abbterra
   Dans /mnt/builddisk/sync-nymea-mirror.sh, dans FORKED_PLUGINS :
       FORKED_PLUGINS=(
         "keba"
         "abbterra"
       )
   Mettre à jour le commentaire au-dessus pour préciser les 2 cas (fork divergent + vendoring).

### 5. Build (pipeline validé)
   git add -A && git commit -m "..." && git push
   sudo lxc exec build-1-15 -- bash -c '
     set -e
     cd /root && rm -rf etm-powersync-plugins-modbus
     git clone https://git.etm-powersync.fr/ETM-Schurig/etm-powersync-plugins-modbus.git
     cd etm-powersync-plugins-modbus
     echo "=== plugins ===" && grep -A6 PLUGIN_DIRS etm-powersync-plugins-modbus.pro
     echo "=== installs ===" && ls debian/*.install
     echo "=== packages ===" && grep -c "^Package:" debian/control
     chmod +x debian/rules
     # build local d abord pour valider compil + generation, PUIS le .deb :
     qmake6 && make -j$(nproc) 2>&1 | tail -30
   '
   - Vérifier dans la sortie : abbterra ET abbb2x ET eastron compilent, .so produites.
   - Si abbterra casse sur des getters/connexion : c est du code upstream testé, donc
     plutot un souci d intégration (PLUGIN_DIRS, modbus.pri) qu un bug — lire l erreur.
   - Puis : dpkg-buildpackage -b -us -uc 2>&1 | tail -30

### 6. Vérifier les .deb (anti-paquet-vide)
   Pour chacun des 3 : dpkg-deb -c <deb> | grep '\.so'  → une .so au bon chemin.
   Pour abbterra : dpkg-deb -f nymea-plugin-abbterra_*.deb Package Depends
     (Depends doit inclure libqt6serialbus/serialport via shlibs).

### 7. Import + déploiement
   lxc file pull des .deb vers /mnt/builddisk
   reprepro -b /mnt/builddisk/apt-repo includedeb powersync-testing <deb>  (les 3 + dbgsym)
   /mnt/builddisk/publish-to-repo.sh
   reprepro -b /mnt/builddisk/apt-repo list powersync-testing | grep -iE 'abbterra|abbb2x'
   ssh etm@192.168.1.120 'sudo apt update && sudo apt install -y nymea-plugin-abbterra powersync-plugin-abbb2x && sudo systemctl restart nymead'

## Config en atelier (après install)
- Borne ABB Terra : ThingClass terraAcTcp (address, port 502, slaveId 1) OU terraAcRtu
  (rtuMaster, slaveId 1). CONFIRMER sur le matériel : TCP (réseau) ou RTU (RS-485) ?
- Compteur ABB B2x : RTU (rtuMaster + slaveAddress). Si borne RTU + compteur RTU sur le
  MÊME bus → slaveId DISTINCTS.
- RTU : créer d'abord le "Modbus RTU master" (adaptateur /dev/ttyUSB*) dans nymea:app,
  vérifier droits (user nymead dans groupe dialout), puis ajouter les things.
- B2x = code NEUF : valider scaling (puissance signée +import/-export ; si ×100 trop grand
  passer /100 à /1 dans le .cpp ; vérifier noms getters générés dans
  abbb2x/autogenerated/abbb2xmodbusrtuconnection.h).

## Préférences de travail
Français. Affichage complet des fichiers (cat -n) plutôt que diffs ; logs complets avant
commit ; pas de fallback silencieux. Étape par étape : attendre ma sortie de commande avant
de continuer. Toujours vérifier le contenu d'un .deb (dpkg-deb -c) avant import.
