feat(manager): add gated short-lease V4 control trial and local fallback

This commit is contained in:
ENELIX Agent
2026-10-02 14:01:41 +00:00
parent b5c1fa6be2
commit 9394fe3eb1
10 changed files with 918 additions and 4 deletions
+96
View File
@@ -0,0 +1,96 @@
# V4: begrenzter Regeltest (Entwicklungskandidat, NICHT in Betrieb)
Stand 2026-10-02. Diese Erweiterung ist weder Produktionsfreigabe noch ein
Installations-/Startauftrag. Bestehende Schattenplaene und ihre `shadow_seen`
Bestaetigungen bleiben unveraendert. Ein Vorschauwert allein darf niemals
als Stellfreigabe interpretiert werden.
## Freigabekette
1. Serverseitige separate Allowlist `NETPLAN_V4_CONTROL_TRIAL_PLANTS` (standardmaessig
leer). Interner authentifizierter `planner/trial/arm`-Aufruf mit expliziter
Bestaetigung, neuer Sitzung, gepruefter Plan-ID/Revision, Batteriezuordnung,
Zeitfenster, Leistungsgrenzen und dokumentierter Geraete-Watchdog-Abnahme.
Die bestehenden oeffentlichen Portal-/Geraeterouten proxien diesen Aufruf NICHT.
2. `NetzfahrplanV4RegeltestErlaubt` lokal im Manager UND im Batteriemodul (jeweils
Standard false). Alte `NetzfahrplanAktiv`-Freigabe muss false bleiben.
3. Zusaetzlicher bewusster lokaler Start einer bestimmten Sitzung. Ein Reload,
Netzwiederkehr oder gespeicherter Haken startet keine Sitzung automatisch.
4. Der Manager prueft den empfangenen Schattenplan und die getrennte
`controlled_trial_authority` gemeinsam. Sie sind gebunden an Anlage, Batterie,
beide Instanz-IDs, Revision, manuelle Modellfamilie und stabilen Planungskontext.
5. Die Batterie nimmt nur einen separaten `controlled_trial_command` mit eigener
Sequenz und kurzer Gueltigkeit an. Normale Managerbefehle erneuern diese
Gueltigkeit nicht. `shadow_seen` bleibt eine Empfangs-, keine Ausfuehrungsmeldung.
Die Serverantwort bleibt eine Schattenplan-Antwort (`liveEnabled:false`). Eine
getrennte Testfreigabe ist unter `controlledTrial` und
`controlledTrialAuthorized` sichtbar. Der Schattenmodus allein ist bei kuenftig
bewusst gestartetem Test deshalb kein Nachweis fuer 'keine Batteriebewegung'.
Die Controller-Diagnosen benennen eine angenommene Sollvorgabe, nicht bereits
physisch gemessene Umsetzung oder Ersparnis.
## Bewusst begrenzter Pilotumfang
- Genau eine eindeutig zugeordnete Batterie je Test; Familie manuell festgelegt.
- 30 bis 1800 Sekunden Sitzung, maximal 5000 W Laden und 5000 W Entladen.
- Server-, Manager- und Batteriegrenze koennen strenger sein; nie grosszuegig
ersetzen oder still auf 39 kW hochsetzen.
- Gesamtsollleistung, NICHT Zusatzleistung zur bereits fliessenden Batterieleistung.
- Andere Verbraucher bleiben im alten Verteiler. Ihre erwartete Leistungsaenderung
wird einmal bei der Batteriekorrektur beruecksichtigt.
- Batterie wird nur einem Stellwertpfad zugeteilt, nicht gleichzeitig dem alten
und neuen Verteiler. Ist der Test ungueltig, stoppt er und es wird eine NEUE
normale Verteilung angefordert; kein alter gespeicherter Sollwert wird restauriert.
- Physische Grenzverletzung, die innerhalb der Pilotleistung nicht behebbar ist,
beendet den Test zugunsten der bestehenden lokalen Regelung.
## Ausfall- und Zeitverhalten
- Serverfreigabe maximal 90 Sekunden, lokal regelmaessig frisch abgerufen.
Serverseitiger Widerruf wirkt nicht magisch sofort: Cachefrist beachten.
- Einzelner Batteriebefehl maximal 10 Sekunden; Batterie kontrolliert im laufenden
Kernel mit 1-Sekunden-Timer zusaetzlich zu Messwert-Callbacks.
- Manager liefert kurze Befehle im Test mit zusaetzlichem 2-Sekunden-Takt.
- Monotone Laufzeit und Kalenderzeit werden getrennt geprueft. Eine rueckwaerts
springende Systemuhr darf eine Sitzung nicht verlaengern.
- Abbruch widerruft die Sitzung VOR dem Nullstellversuch. Schreibfehler werden als
`stop_failed`/nicht bestaetigter Stopp sichtbar, nicht als sicherer Zustand.
- Reserve, Hysterese, aktuelle Lade-/Entladeleistung, SOC und Verfuegbarkeit werden
auch im Batteriemodul erneut geprueft. Sicherheitsreduktionen werden nicht durch
die Umschaltsperre verzoegert; Richtungswechsel laufen ueber null.
- Laufzeitsitzungen liegen nur im Buffer, nicht als automatische Wiederanlauf-Freigabe.
Ein persistenter Marker sorgt bei Wiederinitialisierung fuer einen erneuten
Nullstellversuch, falls ein Testwert zuvor ausgegeben worden sein koennte.
WICHTIGE GRENZE: PHP-Timer und Software-Nullstellversuche funktionieren nur bei
laufendem Kernel und erreichbarem Wechselrichter. Sie sind KEIN physischer
Not-Aus und kein Beweis fuer Abschaltung bei Serverabsturz, Stromausfall oder
unterbrochener Stellwertverbindung. Dafuer ist ein separat nachgewiesener
Befehlsausfall-/Watchdogmechanismus am Geraet bzw. Gateway erforderlich.
Das Feld `NetzfahrplanV4GeraeteWatchdogNachweis` ist eine Referenz auf die gepruefte
Dokumentation/Abnahme, keine automatische Hardwarepruefung und kein Defaultwert.
## Noch offene Freigabepunkte (nicht mit Platzhaltern umgehen)
- Der laufende Lihrenmoos-Prognosestrom ist noch `house_total`. Fuer Testfreigabe
muss `base_load` mit nachgewiesener Quelle/SDL-Abgrenzung und
`accountingEvidenceId` aus dem geprueften Adapter vorliegen. Ein Labelwechsel
oder ein erfundener Nachweis reicht nicht; Quelle und Messbilanz pruefen.
- Geraete-/Gateway-Watchdog bei ausbleibenden Stellbefehlen nachweisen.
- Vollstaendiges Manager-/Batterie-Callbackverhalten im IP-Symcon-Kernel pruefen.
Die isolierten Tests verwenden echte neue Traits, aber simulierte IPS-Aufrufe,
Messwerte, Zeit und Register. Reale Modbus-/VGT-Stellreaktion steht aus.
- Zielcontainerpruefung des neuesten Serverstands und Feldabnahme.
- Keine durchgehende unbeaufsichtigte Produktion, kein automatischer Mehranlagenstart.
Modellvergleich, Trainingsanbindung, Mehranlagenabnahme und Betriebs-Release
bleiben weitere Aufgaben.
## Quelltests
`php tests/V4ControlTrial/checks.php` nur im separaten CLI-Testprozess ausfuehren,
niemals im laufenden Symcon-Skripteditor. Die Datei verweigert einen realen
Symcon-Kernel. Eine PHPUnit-Huelle bindet sie an die normale Testsuite an.
Der Server-Test verwendet ausschliesslich synthetische Daten/Temporaerdatenbanken.
Keine Testfunktion liest Zugangsdaten oder schreibt eine reale Stellvariable.