From e0b83f55a7087aea3af9a4ac1a2bb5401484484d Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Fri, 16 Oct 2026 14:18:09 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20retrait=20du=20nom=20=C2=AB=20optimiseu?= =?UTF-8?q?r=20ETM=20=C2=BB=20des=20fichiers=20publi=C3=A9s=20(brief=204?= =?UTF-8?q?=20T0.5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- README.md | 10 +++++----- docs/DESIGN_PREVISION_PV.md | 6 +++--- etm_powersync_energy.svg | 8 ++++---- specs/spec_ecs.md | 4 ++-- tools/rules-noncode.txt | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 8fae74e..5fc8d3b 100644 --- a/README.md +++ b/README.md @@ -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 : . diff --git a/docs/DESIGN_PREVISION_PV.md b/docs/DESIGN_PREVISION_PV.md index b43c8d2..a6fc727 100644 --- a/docs/DESIGN_PREVISION_PV.md +++ b/docs/DESIGN_PREVISION_PV.md @@ -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 diff --git a/etm_powersync_energy.svg b/etm_powersync_energy.svg index 2b7f894..42a3c27 100644 --- a/etm_powersync_energy.svg +++ b/etm_powersync_energy.svg @@ -1,6 +1,6 @@ Structogramme du fork etm-powersync-energy-etm : couche A GPL et couche B optimiseur externe -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. +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. @@ -45,10 +45,10 @@ Couche B — optimiseur externe process séparé · post-beta - + -optimiseur ETM — Predict AI -propriétaire · IA +etm-optimizer +Predict AI · propriétaire diff --git a/specs/spec_ecs.md b/specs/spec_ecs.md index 657f049..1795405 100644 --- a/specs/spec_ecs.md +++ b/specs/spec_ecs.md @@ -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. --- diff --git a/tools/rules-noncode.txt b/tools/rules-noncode.txt index a8b5205..5ddd901 100644 --- a/tools/rules-noncode.txt +++ b/tools/rules-noncode.txt @@ -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