docs: retrait du nom « optimiseur ETM » des fichiers publiés (brief 4 T0.5)

Ce dépôt est GPL et public : le nom commercial de l'optimiseur propriétaire n'y figure plus.
Remplacé par « l'optimiseur ETM » dans la prose et « etm-optimizer » là où l'on désigne le
composant (feuille de route, schéma). Sens inchangé. Aucun code touché.

`git grep -nIi 'h[ée]os'` : vide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Patrick Schurig 2026-10-16 14:18:09 +02:00
parent e5c649e69a
commit e0b83f55a7
5 changed files with 15 additions and 15 deletions

View File

@ -26,9 +26,9 @@ Chaque bloc affiche son état réel. On ne documente pas une promesse.
Deux couches, frontière nette. Le plugin de ce repo est **entièrement GPL-3.0**.
- **Couche A — ce repo (GPL-3.0).** Toute la mécanique HEMS : ingestion d'état, sécurité, arbitrage, stratégie par défaut basée sur règles, adaptateurs de charge. Tourne seul, sans aucun composant externe. C'est aussi le candidat à une contribution amont chez nymea.
- **Couche B — optimiseur externe (hors de ce repo).** Un processus séparé (propriétaire **optimiseur ETM**, ou tiers communautaire) qui se branche par un socket local documenté. Il *propose* des décisions ; il ne peut jamais contourner la sécurité.
- **Couche B — optimiseur externe (hors de ce repo).** Un processus séparé (l'optimiseur ETM, propriétaire, ou un optimiseur tiers communautaire) qui se branche par un socket local documenté. Il *propose* des décisions ; il ne peut jamais contourner la sécurité.
Principe directeur : **le plugin est agnostique à l'optimiseur.** optimiseur ETM et un optimiseur tiers sont des backends interchangeables derrière le même contrat. Aucun code propriétaire ne vit dans ce repo — la séparation se fait par processus + protocole publié, pas par linkage.
Principe directeur : **le plugin est agnostique à l'optimiseur.** L'optimiseur ETM et un optimiseur tiers sont des backends interchangeables derrière le même contrat. Aucun code propriétaire ne vit dans ce repo — la séparation se fait par processus + protocole publié, pas par linkage.
Conséquence pratique, et invariant testé : **socket absent ou muet → repli automatique sur la stratégie de règles intégrée.** En mode Community, le plugin fonctionne intégralement sans optimiseur.
@ -151,7 +151,7 @@ Cycle de vie d'un backend (optimiseur ETM ou tiers) :
2. **Boucle** — à chaque cycle le plugin pousse un `SurplusContext` (surplus disponible, charges avec type/puissance/min-max/priorité/état, batterie SoC, tarif, contrainte réseau) ; le backend renvoie un `LoadAction[]` (`{ loadId, action, targetPowerW, reason }`) ou `abstain`.
3. **Heartbeat** — la cadence des requêtes *est* le heartbeat. Pas de réponse dans le délai → `optimizerAlive=false` → repli règles, sans interruption du pilotage.
Le contrat est **générique-domaine**, pas spécifique à optimiseur ETM : n'importe qui peut écrire un serveur (Python+ML, Rust, etc.) qui répond au même protocole. La spécification est publiée sous licence libre — voir `docs/OPTIMIZER_PROTOCOL.md` (ROADMAP).
Le contrat est **générique-domaine**, pas spécifique à l'optimiseur ETM : n'importe qui peut écrire un serveur (Python+ML, Rust, etc.) qui répond au même protocole. La spécification est publiée sous licence libre — voir `docs/OPTIMIZER_PROTOCOL.md` (ROADMAP).
> Sécurité : quelle que soit la sortie du backend, la boucle de sécurité et les bornes min/max par charge **plafonnent** l'allocation. Un optimiseur défaillant ne peut, au pire, que proposer une mauvaise répartition — bornée et clampée.
@ -229,13 +229,13 @@ Simulations (plots de vérification de la logique métier dans `results/`) :
## Roadmap
- **Beta** : arbitrage central généralisé, adaptateur ECS/relais, frontière `requestOptimization` posée, stratégie règles par défaut. Mode `community` : tout fonctionne sans optimiseur.
- **Post-beta** : adaptateurs PAC/HVAC et batterie ; socket + protocole optimiseur documenté (GPL) ; backend propriétaire optimiseur ETM ; contrainte réseau §14a EnWG comme source de plafond ; tarification FR (Linky TIC, Tempo) ; namespace EMS générique.
- **Post-beta** : adaptateurs PAC/HVAC et batterie ; socket + protocole optimiseur documenté (GPL) ; backend propriétaire `etm-optimizer` ; contrainte réseau §14a EnWG comme source de plafond ; tarification FR (Linky TIC, Tempo) ; namespace EMS générique.
- **Amont** : une fois la beta opérationnelle, discussion avec l'équipe nymea sur une intégration possible dans l'arbre upstream.
---
## Licence
`etm-powersync-energy-etm` est sous **GNU General Public License v3.0 ou ultérieure**, comme l'amont dont il dérive. Tout le code de ce repo est GPL — il n'y a, et il n'y aura, aucun composant propriétaire ici. La valeur propriétaire (l'optimiseur **optimiseur ETM**) vit dans un processus séparé, derrière le socket documenté, et n'est pas distribuée dans ce dépôt.
`etm-powersync-energy-etm` est sous **GNU General Public License v3.0 ou ultérieure**, comme l'amont dont il dérive. Tout le code de ce repo est GPL — il n'y a, et il n'y aura, aucun composant propriétaire ici. La valeur propriétaire (l'optimiseur ETM, `etm-optimizer`) vit dans un processus séparé, derrière le socket documenté, et n'est pas distribuée dans ce dépôt.
Une copie de la licence est incluse dans ce repo ; si elle manque : <https://www.gnu.org/licenses/gpl-3.0.html>.

View File

@ -79,7 +79,7 @@ CREATE TABLE forecastPv (
**La clé est la paire, et c'est tout le lot.** Avec `targetAt` seul, chaque rafraîchissement
écrase le précédent : on perd les révisions, donc la comparaison prévu/réalisé — c'est-à-dire
exactement ce qu'on veut montrer, et ce dont optimiseur ETM aura besoin.
exactement ce qu'on veut montrer, et ce dont l'optimiseur ETM aura besoin.
> C'est la même distinction que `measuredSince` : **quand on a mesuré**, et **ce qu'on a mesuré**.
> Deux dates, deux questions, et les confondre en perd une.
@ -130,7 +130,7 @@ conversion est la plus grande.
> plus rassurant exactement quand il se trompe le plus. Il ne s'agit pas d'un indicateur
> imparfait qu'on affinerait : il pointe dans la mauvaise direction, et l'affiner l'empire.
Elle peut être **stockée** (elle décrit le ciel, et optimiseur ETM en fera peut-être quelque chose). Elle
Elle peut être **stockée** (elle décrit le ciel, et l'optimiseur ETM en fera peut-être quelque chose). Elle
ne doit **jamais être publiée comme une qualité de la prévision de production**.
*(Famille des modes d'érosion d'`AGENTS.md` : l'instrument dont le silence ressemble à un
@ -159,7 +159,7 @@ résultat. Ici, c'est l'instrument dont la confiance ressemble à une garantie.)
Mais la conséquence est constructive, et c'est elle qui justifie la table bitemporelle :
> **Le GPL n'apprend pas ; il rend l'apprentissage POSSIBLE.** La table `(targetAt, issuedAt)`
> est l'interface entre les deux. Sans elle, optimiseur ETM n'aurait pas la matière — et l'écraser à chaque
> est l'interface entre les deux. Sans elle, l'optimiseur ETM n'aurait pas la matière — et l'écraser à chaque
> révision détruirait cette matière pour toujours, sans que rien ne le signale.
Le GPL publie donc la série et le réalisé côte à côte, **sans les rapprocher**. Le rapprochement

View File

@ -1,6 +1,6 @@
<svg width="100%" viewBox="0 0 680 486" role="img" style="" xmlns="http://www.w3.org/2000/svg">
<title style="fill:rgb(0, 0, 0);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Structogramme du fork etm-powersync-energy-etm : couche A GPL et couche B optimiseur externe</title>
<desc style="fill:rgb(0, 0, 0);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Couche A, fork GPL, contient ingestion d'état, boucle de sécurité, arbitrage central, stratégie rule-based par défaut, frontière interface optimiseur et adaptateurs de charge. Couche B, process séparé post-beta, contient optimiseur ETM propriétaire, socket GPL avec heartbeat, et optimiseur communautaire.</desc>
<desc style="fill:rgb(0, 0, 0);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">Couche A, fork GPL, contient ingestion d'état, boucle de sécurité, arbitrage central, stratégie rule-based par défaut, frontière interface optimiseur et adaptateurs de charge. Couche B, process séparé post-beta, contient l'optimiseur ETM propriétaire, socket GPL avec heartbeat, et optimiseur communautaire.</desc>
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></marker>
</defs>
@ -45,10 +45,10 @@
<text x="58" y="324" style="fill:rgb(211, 209, 199);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:start;dominant-baseline:auto">Couche B — optimiseur externe</text>
<text x="58" y="342" style="fill:rgb(180, 178, 169);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:start;dominant-baseline:auto">process séparé · post-beta</text></g>
<g onclick="sendPrompt('Quel est le rôle de optimiseur ETM / Predict AI derrière le socket, et pourquoi propriétaire ?')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<g onclick="sendPrompt('Quel est le rôle de l’optimiseur ETM / Predict AI derrière le socket, et pourquoi propriétaire ?')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="60" y="352" width="180" height="56" rx="8" stroke-width="0.5" style="fill:rgb(60, 52, 137);stroke:rgb(175, 169, 236);color:rgb(251, 251, 254);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>
<text x="150" y="374" text-anchor="middle" dominant-baseline="central" style="fill:rgb(206, 203, 246);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">optimiseur ETM — Predict AI</text>
<text x="150" y="392" text-anchor="middle" dominant-baseline="central" style="fill:rgb(175, 169, 236);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">propriétaire · IA</text></g>
<text x="150" y="374" text-anchor="middle" dominant-baseline="central" style="fill:rgb(206, 203, 246);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central">etm-optimizer</text>
<text x="150" y="392" text-anchor="middle" dominant-baseline="central" style="fill:rgb(175, 169, 236);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:12px;font-weight:400;text-anchor:middle;dominant-baseline:central">Predict AI · propriétaire</text></g>
<g onclick="sendPrompt('Spécifie le protocole socket GPL et le heartbeat (pas de heartbeat = pas d optimiseur)')" style="fill:rgb(0, 0, 0);stroke:none;color:rgb(251, 251, 254);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto">
<rect x="260" y="352" width="160" height="56" rx="8" stroke-width="0.5" style="fill:rgb(8, 80, 65);stroke:rgb(93, 202, 165);color:rgb(251, 251, 254);stroke-width:0.5px;stroke-linecap:butt;stroke-linejoin:miter;opacity:1;font-family:&quot;Anthropic Sans&quot;, -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, sans-serif;font-size:16px;font-weight:400;text-anchor:start;dominant-baseline:auto"/>

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -108,8 +108,8 @@ propriété est **acquise et non négociable** ; toute évolution la préserve.
**ECS-007** — Aucune couche ECS NE DOIT décider quelle part du surplus lui
revient. Acquis (`rulebasedscheduler.cpp:97-121`).
**ECS-008** — L'ECS publie `available` et `energyRemaining` ; optimiseur ETM les consomme.
L'ems exécute, optimiseur ETM optimise.
**ECS-008** — L'ECS publie `available` et `energyRemaining` ; l'optimiseur ETM les consomme.
L'ems exécute, l'optimiseur ETM optimise.
---

View File

@ -34,7 +34,7 @@ ECS-001 constat résolu, négatif — reconfirmé contre le libnymea du build
ECS-002 négatif : ni integration-plugin, ni dépôt, ni ThingClass
ECS-003 découpage documentaire, pas une exigence de comportement
ECS-007 interdiction — aucune couche ECS ne décide de sa part du surplus
ECS-008 contrat d'un AUTRE produit (optimiseur ETM consomme, l'ECS publie)
ECS-008 contrat d'un AUTRE produit (l'optimiseur ETM consomme, l'ECS publie)
ECS-203 CLOS : aucune ThingClass exposée, donc aucune interface à implémenter
# — §1 : ce que le modèle EST, avant tout mécanisme