Thème
Marque blanche
Le superviseur est distribué par Desautel et par ses revendeurs. Un revendeur livre le même logiciel sous sa propre identité : son logo, ses couleurs, le nom de son compte d'administration, ses noms de profils de centrale.
Ce document décrit comment cette identité est portée, où elle se pose, et comment en ajouter une.
Contrainte de départ
Un seul installateur est compilé. Il porte l'identité Desautel — c'est l'éditeur du logiciel, et c'est lui qui signe le binaire. La marque appliquée au poste se choisit pendant l'installation, dans une page dédiée de l'assistant. Compiler un installateur par revendeur multiplierait les binaires à signer, à tester et à archiver pour la conformité CRA, sans rien apporter.
Il s'ensuit que toutes les marques sont embarquées dans l'installateur, et qu'une seule est déposée sur le poste.
Ce qu'une marque contient
Une marque est un ensemble de valeurs et de fichiers. Rien d'exécutable : ni code, ni script.
Les noms de fichier sont imposés : la construction cherche logo.png, logo-white.png et app.ico sous ce nom exact, quel que soit le distributeur.
| Élément | Clé ou fichier | Nature | Valeur Desautel |
|---|---|---|---|
| Identifiant | id | texte court, sans accent ni espace | desautel |
| Nom de l'éditeur | name | texte | Desautel |
| Adresse de l'éditeur | url | URL | https://www.desautel.fr/contact |
| Logo principal | logo.png | PNG, fond transparent | — |
| Logo sur fond sombre | logo-white.png | PNG, fond transparent | — |
| Marque réduite (optionnelle) | logo-mark.png | PNG carré ; à défaut, l'icône sert | (absente) |
| Icône de l'application | app.ico | ICO multi-tailles | — |
| Couleur de marque | colorBase, colorDark, colorDeep | 3 nuances (base, foncée, profonde) | #b81b34, #9e1329, #8a1226 |
| Dégradé du panneau de marque | gradientFrom, gradientMid, gradientTo | 3 nuances (départ, médiane, arrivée) | #ae1a33, #8a1226, #730f1f |
| Teintes des lignes de profil | tintSoft, tintStrong, tintAvatar | 3 nuances (survol, retenue, avatar) | #fcf3f4, #f6e3e6, #fbedef |
| Noms des profils livrés | profileNames | table indexée par identifiant de profil | (aucun) |
| Téléphone de l'assistance | supportPhone | texte, optionnel | 04 72 25 33 00 |
| Courriel de l'assistance | supportEmail | texte, optionnel | contact@desautel.fr |
| Adresse postale | supportAddress | texte, optionnel | 945 avenue des Pré Seigneurs - 01120 MONTLUEL |
Le compte d'administration ne figure pas dans cette liste : ni son nom ni son mot de passe n'appartiennent à la marque. Voir plus bas.
Les trois coordonnées — supportPhone, supportEmail, supportAddress — sont celles que la modale d'assistance affiche à l'exploitant. Elles se résolvent une par une : un revendeur qui ne déclare que son téléphone garde le courriel et l'adresse de l'éditeur. Un poste de supervision étant le plus souvent coupé d'Internet, ce sont les seuls moyens de joindre quelqu'un depuis l'écran — mieux vaut la permanence de l'éditeur qu'un champ vide.
Le mot de passe du compte d'administration ne fait pas partie de la marque : il reste le secret applicatif Security:SuperAdminPassword, propre à l'installation et jamais versionné. Voir la politique de sécurité.
Le nom du compte, lui, se saisit à l'installation. L'assistant présente d'abord le choix de la marque, puis la page du compte d'administration, dont le nom est prérempli avec l'identifiant de la marque retenue — et reste modifiable. Il n'accepte que lettres, chiffres, point, tiret et soulignement : c'est un identifiant de connexion, et l'exploitant doit pouvoir le taper. Le mot de passe y est demandé deux fois, les deux saisies devant coïncider.
Une installation antérieure à cette saisie garde son compte desautel : la clé Security:SuperAdminUsername est absente, et la résolution retombe sur ce nom.
Où la marque se pose
deployment/brands/<identifiant>/ ← une marque = un dossier, embarqué dans l'installateur
├── brand.json ← noms, couleurs, identifiant du compte d'administration
├── logo.png ← bandeau déplié, en-tête (fond clair)
├── logo-white.png ← connexion et démarrage (fond sombre)
├── logo-mark.png ← bandeau replié, avatar du compte (optionnel)
└── app.ico ← raccourcis, fenêtres, barre des tâches ; sert de marque
réduite quand `logo-mark.png` est absent
│ l'assistant d'installation copie le dossier choisi
▼
%ProgramData%\<AppName>\brand\ ← la marque retenue pour ce posteLe backend lit ce dossier une fois au démarrage et sert son contenu à l'interface avec la configuration publique — donc avant toute authentification. Le client de bureau et le gestionnaire de service le lisent chacun au lancement pour teinter leurs fenêtres natives : ils démarrent indépendamment du service, et ne peuvent pas le lui demander. Le code de lecture vit dans le projet partagé, seul endroit que ces trois applications atteignent.
Ce dossier est lu, jamais écrit par l'application. Changer de marque sur un poste installé se fait en réinstallant, pas depuis l'interface : la marque identifie le distributeur, elle n'est pas un réglage d'exploitation.
Le premier écran
Le client de bureau s'ouvre sur un écran de démarrage plein écran, posé au-dessus de la fenêtre principale pendant le chargement de l'interface web. C'est le premier moment où le poste est visible, et le plus long — au démarrage de la machine, il précède tout le reste. Trois surfaces se superposent alors, et les trois portent la teinte de la marque :
| Surface | Ce qu'elle prend |
|---|---|
| Écran de démarrage | dégradé complet et logo-white.png |
| Fond de la fenêtre principale | teinte médiane du dégradé |
| Fond du WebView2 | teinte médiane, sous la page tant qu'elle n'a pas peint |
Elles suivent la même valeur pour que la fermeture de l'écran de démarrage ne se voie pas : un fond différent dessous ferait clignoter une couleur étrangère au moment du fondu.
Cet écran s'affiche avant que le service ait répondu — il ne peut donc pas lui demander la marque, et la lit lui-même dans le dossier déposé sur le poste. C'est la raison pour laquelle la marque expose ses images sous deux formes : un chemin de fichier pour les fenêtres natives, une URI de données pour l'interface web.
Le logo est chargé d'un bloc plutôt que laissé ouvert : un fichier verrouillé par la fenêtre empêcherait l'installateur de reposer une marque sur un poste déjà installé.
Ce que la marque ne change pas
- Le nom du produit — « Superviseur » est le nom du logiciel, pas celui du distributeur.
- Les noms techniques — service Windows, rôle PostgreSQL, chemins d'installation, ports. Les changer casserait les procédures d'exploitation et les scripts de dépannage sans bénéfice visible.
- L'adressage Modbus — un profil de centrale décrit un firmware, pas une marque commerciale. Seul le nom d'un profil livré peut porter le vocabulaire du revendeur ; sa cartographie de registres est identique. Le nom se déclare par identifiant de profil dans
profileNames, et s'applique au démarrage aux profils livrés que l'exploitant n'a pas modifiés — ceux qu'il a repris en main gardent le sien. « Rétablir » un profil lui rend le nom de la marque, non celui du catalogue de l'éditeur : le poste reste livré sous cette marque. - L'installateur — il reste aux couleurs Desautel, éditeur du logiciel.
- L'icône gravée dans les exécutables — celle que l'explorateur Windows affiche sur le fichier
.exelui-même est une ressource du binaire, figée à la compilation ; la changer par marque imposerait un exécutable par marque. Tout ce que l'exploitant voit et manipule porte en revanche l'icône de la marque : raccourcis du menu Démarrer, du bureau et du démarrage automatique — pointés par l'installateur surapp.ico—, fenêtres du client de bureau, barre des tâches et icône de la zone de notification. - Les licences — une licence est liée au matériel et au logiciel, jamais au distributeur. Le fichier vit sous
%ProgramData%\<AppName>\license.key, chemin qui ne porte pas la marque ; l'empreinte matérielle est faite de l'UUID système, du numéro de série de la carte mère et de l'identifiant du processeur ; le contenu signé nomme le logiciel et la machine, et rien d'autre. Changer de marque sur un poste, ou en installer une nouvelle, laisse donc la licence en place et valide. Cet invariant est verrouillé pardotnet/tests/client/Licensing/LicenseIsBrandIndependentTests.cs: y toucher fait échouer la suite. Voir l'émission de licences.
Où l'identité est appliquée
| Surface | Ce qui la porte |
|---|---|
| Nom et logo du site | GlobalConfiguration — propre à l'installation, réglable en Réglages |
| Nom du produit, du service, de l'installateur | app.config.json, figé à la compilation |
| Bandeau latéral, en-tête | logo de la marque ; marque réduite une fois replié |
| Connexion et démarrage | logo sur fond sombre, dégradé et teintes de la marque |
| Écran de démarrage du client de bureau | logo-white.png et dégradé, lus au lancement |
| Coordonnées de l'assistance | supportPhone, supportEmail, supportAddress |
| Avatar du compte d'administration | marque réduite |
| Chrome de l'interface | --color-brand*, écrites au chargement |
| Fenêtres du client, menu du gestionnaire | couleur de marque et icône, lues au lancement |
| Raccourcis, barre des tâches, zone de notification | app.ico de la marque |
| Nom du compte d'administration | saisi à l'installation, prérempli avec la marque |
| Noms des profils livrés | profileNames du descripteur |
Les couleurs étant déjà des variables CSS, une marque les écrit au chargement de la configuration : aucun composant n'a à la connaître.
Les neuf teintes sont déclarées, jamais calculées. Dériver un dégradé et des fonds de ligne de trois nuances de base donne un résultat plat sur une marque sombre et criard sur une marque vive ; et les couleurs livrées auraient bougé au passage. Une marque qui n'en déclare aucune reprend celles de l'éditeur, à l'identique.
Le panneau de marque de l'écran de connexion partage ses teintes avec l'écran de démarrage : les deux suivent la même déclaration. Le reste de la palette de connexion — neutres sable, encres, filets — n'appartient pas à la marque : c'est l'habillage de l'écran, commun à toutes.
Ajouter une marque
- Créer
deployment/brands/<identifiant>/sur le modèle dedesautel/, seul pack livré. - Y déposer les trois images —
logo.png,logo-white.png,app.ico— et renseignerbrand.json. - Déclarer la marque dans
app.config.json, sectionBrands: elle apparaît alors dans la page de choix de l'assistant d'installation. - Reconstruire l'installateur — voir la construction de l'installateur.
Aucun code n'est à modifier. La construction refuse une marque déclarée sans dossier, dont le brand.json est illisible, dont l'identifiant déclaré ne correspond pas, ou à laquelle il manque une image : mieux vaut une erreur lisible au moment de la construction qu'un poste à moitié habillé.
Trois emplacements, trois formes. Le logo principal occupe le bandeau déplié et l'en-tête, sur fond clair. Le logo sur fond sombre se pose sur le dégradé de la marque, à la connexion et au démarrage. La marque réduite tient dans un carré — bandeau replié, avatar du compte d'administration — là où un mot-symbole horizontal deviendrait illisible ; sans elle, l'icône de l'application sert, étant déjà pensée pour cette taille.
L'identité retenue est mémorisée d'un démarrage à l'autre : sans cela, l'écran de démarrage porterait les couleurs de l'éditeur le temps d'un aller-retour avec le serveur, puis basculerait sous les yeux de l'opérateur. Seul le tout premier lancement d'un poste neuf montre encore l'identité livrée.
Le dépôt ne livre que la marque de l'éditeur. Une marque revendeur s'y ajoute par la procédure ci-dessus : elle donne ses couleurs, ses images, et peut renommer un profil livré — la centrale est la même, son nom commercial change.
Éprouver une marque en développement
Les packs sont déposés par l'installateur : hors d'un poste installé il n'y a aucun dossier à lire, et tout se présente sous la marque livrée. Le lancement peut donc en désigner une :
powershell
dotnet run --project dotnet/backend -- --brand <identifiant>Le front reçoit son habillage du service : le lancer ainsi suffit à voir l'interface entière — écran de connexion, en-tête, couleurs, nom des profils — sous la marque demandée, sans rien recopier dans le dossier de données. Le client de bureau et le gestionnaire de service lisent le même réglage, par la variable d'environnement SUPERVISEUR_BRAND, qui vaut aussi pour le service :
powershell
$env:SUPERVISEUR_BRAND = "<identifiant>"La valeur est un identifiant de deployment/brands/, ou le chemin d'un dossier quelconque — de quoi essayer un pack qu'un revendeur envoie sans l'installer dans le dépôt. Un identifiant introuvable ramène à la marque du poste, avec un signalement au journal : une faute de frappe n'interrompt pas la séance.
Ce raccourci n'est compilé qu'en DEBUG. Sur un poste livré, la marque ne vient que du dossier déposé par l'installateur, et aucun argument de lancement ne peut en présenter une autre.
Repli
Une installation dont le dossier brand est absent ou illisible démarre sur la marque Desautel, compilée dans l'application. Le superviseur ne refuse pas de démarrer pour une image manquante : un poste de supervision incendie doit s'ouvrir même mal habillé.