Files
Enelix-EMS/docs/NETPLAN_V4_AGENT_HANDOFF.md
T
dh 9fbc52ee47
Tests / test (push) Failing after 49s
feat(manager): integrate forecast controls and merge V4 development
Merge the V4 development history with current manager, SDL and setpoint fixes. Retain guarded trial behavior and consolidate controls in Prognose / Forecast. Exclude the unverified accounting-evidence change; no runtime deployment or new dispatch permission.

Validated: 357 PHPUnit tests / 1758 assertions, 150 PHP syntax checks, 310 backend tests, 16 portal tests and isolated UI/receiver checks. develop and beta publication explicitly approved by Daniel Haefliger.
2026-10-06 14:22:16 +00:00

53 KiB
Raw Blame History

ENELIX Netzfahrplan V4 – verbindlicher Gesprächs- und Arbeitskontext

Integration 06.10.2026: Freigabe fuer develop und beta, kein Anlagenrollout

Daniel hat nach der Bedienintegration Merge, Commit und Push auf develop und beta ausdruecklich beauftragt. Der getestete Integrationsstand verbindet die 22 lokalen V4-Commits bis ce525a1 mit origin/develop bis 5437f3f und den zugehoerigen V4-/Formularkorrekturen. Originalarbeitsverzeichnisse bleiben unangetastet; Integration in /srv/agent/prognose-integration-20261006/repo auf ubuntu. Keine Feature-Branches, kein Force-Push, main bleibt unveraendert.

Die Bedienung liegt im bisherigen Bereich Prognose / Forecast; der separate V4-Bereich entfaellt. Einzelheiten und verbleibender Umfang stehen in docs/prognose-bedienintegration.md. Es bleibt der vorhandene begrenzte Testpfad, kein regulaerer Dauerbetrieb. Keine Laufzeitordner geloescht, keine Dienste neu gestartet, keine Module geladen und kein neuer Stellversuch ausgefuehrt. Die unten dokumentierte Batterietimerblockade bleibt offen. Die ausdrueckliche Branchfreigabe ersetzt keine physische Anlagenabnahme oder Stellfreigabe.

Isoliert bestanden: 357 PHPUnit-Tests / 1758 Assertions, Syntax aller 150 PHP- Dateien, 310 Backend-Tests, 16 Portal-Tests und die Bedien-/V4-Einzelchecks. Kein neuer Symcon-Kernel-/GUI-Test, weil Docker im Agentzugang nicht nutzbar war. Eine lokale Backend-Aenderung, die ungepruefte Messkonfigurationen automatisch mit accountingEvidenceId versah, wurde nach fehlgeschlagenem Schutztest nicht uebernommen; Originalarbeitskopie und laufendes Backend bleiben erhalten.

Commit-Autor ist gemaess bestehender Teamklarstellung dh_Agent dh@belevo.ch, konfiguriertes Gitea-Konto dh. Die Repository-Abfrage bestaetigte Pushrecht; die Profilabfrage war mangels read:user-Scope nicht verfuegbar. Fuer den tatsaechlichen Veroeffentlichungsstand die Remote-Refs und den Merge-Commit pruefen, nicht historische Ahead-/Behind-Angaben weiter unten verwenden.

Kontext-Sicherung 06.10.2026: Lesereihenfolge und Quellen

Auf Daniels ausdruecklichen Wunsch wird der Arbeitsstand dauerhaft verlinkt. Fuer den Laufzeitstand ist der unmittelbar folgende Abschnitt 06.10.2026, 12:01 UTC massgeblich, nicht die aelteren Abschnitte 1, 10, 11 oder 15. Insbesondere ist der bestaetigte Geraeteabruf bereits implementiert/installiert; der naechste Schritt ist die dort belegte instanzbezogene Batterietimerblockade. Der Abschlussnachweis /srv/agent/v4-recovery-20261006/finished.json auf iot-symcon01 wurde erneut gelesen, aber kein neuer Stellversuch ausgefuehrt.

Git-Nachkontrolle in dieser Kontext-Sicherung: nach erfolgreichem Fetch steht das Server-89-develop 22 Commits vor / 3 hinter origin/develop; Remote-Stand bei Fetch 58f91e4. Kein sicherer Fast-Forward. Bestehende fremde/lokale Aenderungen bleiben erhalten; kein Merge, Projekt-Commit oder Projekt-Push. Das ist vom anderen Checkout auf ubuntu und dessen separat dokumentierter Manager-Leistungsverteilung zu unterscheiden.

Die mitgesendeten Screenshots haben kein bestaetigtes Aufnahmedatum und sind historische Anschauung, kein neuer Laufzeitnachweis. Der Aktualisierungsdialog ist keine Freigabe, lokale Modulaenderungen zu verwerfen. Es wurden keine Module aktualisiert, Dienste neu gestartet oder Anlagenfreigaben veraendert.

Fortsetzung 06.10.2026, 12:01 UTC: Code installiert, Batterietimer blockieren Live-Abnahme

  • Daniel hat nach der ausdruecklichen Rueckfrage den Test ohne zusaetzliches +/-5-kW-Limit bestaetigt. Dynamische Geraetegrenzen (hier bis 39 kW), SOC- und Netzgrenzen bleiben verbindlich. Die urspruengliche Freigabe endet unveraendert am 07.10.2026 um 17:38:07 Europe/Zurich (1791387487). Kein Neustart der 48-h-Frist. Der fehlende unabhaengige Hardware-Watchdog bleibt nur durch die bereits genehmigte Testanlagen-Ausnahme abgedeckt.
  • Zusaetzliche allgemeine Arbeitsfreigabe: Routinemaessige Schreibzugriffe auf Lihrenmoos, tunel100 und Server89 benoetigen keine erneute Rueckfrage. Das hebt Sicherheitsgrenzen, technische Berechtigungen, Git-Regeln und konkrete Anlagenfreigaben nicht auf.
  • Der vorstehend beschriebene Kandidat wurde inzwischen installiert und getestet. Weitere eng begrenzte Korrekturen dieser Fortsetzung: (1) Batteriebefehl meldet den konkreten Ablehnungsgrund; (2) physische Geraeteabfrage aus dem Batterie-Stellmutex getrennt, eigenstaendiger 1-s-Samplingtimer mit nicht wartender Lesesperre; (3) Stellpfad nutzt nur unveraenderten bestaetigten Cache, maximal 2 s alt nach Wand- und monotoner Zeit, mit Konfigurations-/Quellenbindungspruefung; (4) passendes Server-Pending fuehrt auch vor Aktivstart zu 15-s-Retry statt zum Verpassen des fertigen Plans, HTTP-429 behaelt normalen Backoff. Cache-90-s-Grenze und physische Zeitstempel wurden nicht verlaengert oder erfunden.
  • Live-Installationen mit SHA-256-Pruefung und Backups: Fehlerdiagnose 11:31:18 UTC; Sampler 11:38:43 UTC; Empfang um 11:50 UTC. Arbeits- und Sicherungsordner: /srv/agent/v4-recovery-20261006 auf iot-symcon01. Berichte deployed.json, sampler-deployed.json, receiver-deployed.json und test-results.json. Geaenderte Quellen und Tests sind auch im bestehenden develop-Arbeitsverzeichnis auf enelix-services, fremde Aenderungen sind erhalten.
  • Letzter Aktivversuch: 11:50:52 UTC, Session 13395dbe-0dbb-42b8-9063-511bd7166f41. Manager meldete danach controller_command_sent (seq 5, 18693 W); Batterie wurde wegen feedback_confirmed_cache_stale_or_invalid gestoppt. Danach Managerabbruch wegen ungueltiger lokaler Betriebsdaten, controllerStopAccepted=true. Kein belastbarer Nachweis von physischem Tracking oder >90-s-Dauerbetrieb. Ein gesendeter Befehl ist ausdruecklich keine Anlagenabnahme.
  • KONKRETE OFFENE BLOCKADE: Saemtliche Timer der Batterieinstanz 44234 zeigen LastRun=0. Meldezyklus (5000 ms) und neuer Rueckmeldungstimer (1000 ms) sind lange ueberfaellig, Running=false. Manager- und uebrige Anlagentimer laufen. Instanzstatus 102; Instanz und alle Elternobjekte nicht deaktiviert; keine dauerhaft belegten Skriptthreads nachgewiesen. IPS_ApplyChanges(44234) bei bestaetigtem Null-Stopp um 11:57:31 UTC gab TRUE zurueck, hat die Timer aber nicht repariert. Die Ursache ist NICHT geklaert. Auch der Batterie-Watchdog hat bisher keinen automatischen Lauf nachgewiesen. Deshalb kein weiterer Aktivstart und keine Umgehung durch einen externen Tick-Hook.
  • Weitere beobachtete Abbruchbedingung: Durch Reloads/Messluecken fehlte zeitweise laufende Viertelstundenenergie; der Planner verwirft Luecken >120 s weiterhin korrekt. Nach einem Quartalswechsel wurden wieder optimale Plaene empfangen. Zum Schluss meldete der Betriebssender zudem veraltete Verbraucher-Rueckmeldung, passend zum nicht laufenden Batterie-Meldezyklus. Keine Energiestaende, Cursor oder Datenbankwerte wurden in dieser Fortsetzung umgeschrieben.
  • Endzustand 12:01:11 UTC: Schalter 46716=false, alter Netzfahrplan=false, Batterie status=stopped, EV-Sollwert 19651=0 W. SDL-Sollwert war 7600 W aus dem unabhaengigen bestehenden Betrieb und wurde nicht auf null gezwungen. Kein physischer V4-Regelungsnachweis. Verbindlicher Abschlussbericht: /srv/agent/v4-recovery-20261006/finished.json.
  • Alle temporaeren Start-, Deploy- und Diagnosehooks wurden aus 12555.ips.php entfernt. Original aus /srv/agent/12555.ips.php.v4hook-backup wiederhergestellt, SHA-256 c702a4947ae200b23c3eecccabeb843ad6a55e97509292584ca2de779d5e4940. Nur v4viewsRun des urspruenglichen getrennten Beobachters verbleibt. Inhaltsuche in /var/lib/symcon/scripts fand keine Verweise auf die V4-Recovery-/Continuation-Hooks. Keine unbeobachtete Wiederanlaufautomatik hinterlassen.
  • Tests erneut erfolgreich: 96 Regel-/Cache-/Lockpruefungen, 32 Empfangspruefungen, 8 Rueckmeldungs-Empfangspruefungen, 9 Geraeteabrufpruefungen und 1 Test der echten Registermethode mit synthetischen Aktionen, insgesamt 146. Syntaxpruefungen erfolgreich; git diff --check sauber. Das sind automatisierte Tests, kein Hardwareabnahmetest.
  • Git bleibt develop, ahead 22 / behind 1 gegen origin/develop, kein sicherer Fast-Forward. Keine Projekt-Commits, Merges oder Pushes. Konto nicht fuer Schreibaktion verifiziert; weder beta noch main geaendert. Die fehlende Live-Abnahme schliesst eine Beta-Freigabe zusaetzlich aus.
  • Naechster fachlicher Schritt: Instanzbezogene Symcon-Timerblockade beheben, automatische Sampler-/Melde-/Watchdog-Ausfuehrung belegen und erst dann einen kontrollierten Neustart des V4-Tests versuchen. Ein etwa erforderlicher Symcon-Dienstneustart betrifft weitere Anlagenfunktionen und wurde hier NICHT ausgefuehrt. Danach physisches Tracking, Planwechsel >90 s und bestaetigten Null-Stopp nachweisen. Alte Startmarker oder Installationshooks keinesfalls einfach loeschen/reaktivieren.

Fortsetzung 06.10.2026: gepruefter Kandidat, Live-Eingriff noch gesperrt

  • Daniel hat die Fortsetzung und die Aufhebung der 5-kW-Testgrenze beauftragt. Die bestehende 48-h-Frist, SOC-/Netz-/Geraetegrenzen und der bereits bekannte fehlende unabhaengige Hardware-Watchdog bleiben unveraendert.
  • Aktuell auf iot-symcon01 gelesen: Refresh-Deployment 07:43:14 UTC; Full-Power-Deployment 08:46:59 UTC. Diese waren schon vor dieser Fortsetzung installiert. Snapshot 09:30:41 UTC: Schalter AUS, Batterie disabled, Manager stopped_fallback_pending wegen ungueltiger lokaler Betriebsdaten. Keine physische V4-Regelung belegt.
  • Neuer Kandidat korrigiert ignorierte FALSE-Rueckgaben von IPS_RequestAction/RequestAction (Start, Command, Stop und Register), den Vor-I/O-Zeitvergleich beim Batterie-Scharfschalten und den blockierenden HTTP-Refresh im Regel-Tick. Separater Empfangstimer: 10 s Prueftakt, aktiver Abruf fruehestens nach 45 s, Fehler-Retry 15 s; Cache-Lebensdauer und Serverzeit bleiben maximal 90 s.
  • Kandidat liegt auf develop im Arbeitsverzeichnis und isoliert unter /srv/agent/v4-continuation-20261006 auf Lihrenmoos. 87 Regeltest-, 29 Empfangs-, 8 Rueckmeldungspruefungen plus 1 echter Modulmethoden-Test mit synthetischen Aktionen bestanden; 5 geaenderte Live-PHP-Dateien syntaxgeprueft. Keine Hardwaretests daraus ableiten. Testbericht: test-results.json im Stage.
  • Neue Tests decken insbesondere FALSE ohne Exception, Sekundengrenze beim Start, bytegleich behaltenen aktiven Cache, 15-s-Retry, 90-s-Ablauf und zukuenftige Empfangszeit ab. git diff --check erfolgreich.
  • Die automatische Sicherheitspruefung hat die Ausfuehrung von /srv/agent/activate_v4_continuation.py abgelehnt, weil diese Live-Installation und Aktivstart koppelt. Der Benutzer wurde um ausdrueckliche Freigabe fuer Installation und Start ohne 5-kW-Limit bis zum bisherigen Ende (07.10.2026 17:38 Europe/Zurich) gebeten. NICHT ueber andere Werkzeuge umgehen. Die Aktivierung wurde nicht ausgefuehrt; 12555.ips.php ist unveraendert.
  • Achtung: Der bestehende temporaere v4_direct_battery_command_hook.php sendet alle 30 s den letzten Managerbefehl erneut. Das kann den Replay-Schutz ausloesen. Vor freigegebenem Neustart kontrolliert entfernen. Vorbereitete Aktivierung sichert den alten Timer und ersetzt alte Schreib-/Diagnosehooks durch eine einmalige gesicherte Installation, genau einen Startversuch und reine Beobachtung. Sie ist noch nicht ausgefuehrt. Bei Live-Drift abbrechen.
  • Git nach erfolgreichem Fetch: develop ist 22 Commits vor und 1 Commit hinter origin/develop (fremder Commit 37addf4). Fremde Lade-/GUI-Aenderungen sind erhalten. Kein Fast-Forward moeglich; kein Commit, Merge oder Push in dieser Fortsetzung. Kandidatenpatch: /srv/agent/v4-continuation-20261006.patch auf enelix-services.
  • Naechster Schritt erst nach Freigabe: Stage/Live-Hashes und Zustand erneut pruefen, Kandidat installieren, genau einen Startversuch beobachten und dessen echte Batterie-Antwort pruefen. Danach >90 s mit Planwechsel, reale Leistungs-/Netzreaktion und sicheren Nullstell-Stopp nachweisen. Erst anschliessend regulaeren Testlauf belassen und temporaere Hooks entfernen. Kein stabiler Aktivbetrieb zugesichert.

Übergabe erstellt am 04.10.2026 auf ausdrücklichen Wunsch von Daniel Häfliger (BELEVO AG). Sie fasst die Anforderungen, Entscheidungen, Fehlerbehebungen und den zuletzt belegten Stand dieses Gesprächs zusammen. Sie ist kein wörtliches Chatarchiv, keine neue Stellfreigabe und kein Nachweis der Produktionsreife.

Zeitbezug: Die letzten hier belegten Betriebsberichte stammen vom 03.10.2026, ca. 14:02 Uhr Europe/Zurich. Am 04.10. wurden für diese Übergabe die genannten Berichte und der Git-Stand erneut gelesen, aber keine neue Anlagenabnahme durchgeführt. Alte Messzahlen deshalb niemals als heutige Live-Werte ausgeben.

Fortsetzung Prognose am 04.10.2026: Der aktuelle Runtime-Stand wurde gelesen, ohne die alten Diagnose- oder Installationsschritte zu wiederholen. Der abgeleitete Datensatz lihrenmoos-physical-published-v2 ist model_ready und erfüllt mit mehr als 24 nutzbaren äquivalenten Stunden die Trainingsschwelle. Die V4-Einstellungen stehen seit Revision 2 in shadow auf forecastSource=corrected_profile und measurementDataset=lihrenmoos-physical-published-v2; liveEnabled und Stellfreigabe bleiben aus. Der erste echte Lauf zeigte einen kompatibilitätsbedingten Stopp bei mikrosekundengenauen observedAt-Zeitstempeln. Die Korrektur rundet ausschliesslich die kausale Verfügbarkeit von Prognoseereignissen auf die nächste volle Sekunde auf; Rohmessungen bleiben streng ganzsekündlich. 310 Python- und 16 Portal-Tests sind erfolgreich. Repository und Runtime-Build-Kontext enthalten bytegleich den geprüften Fix; der laufende Container enthält ihn noch nicht, weil beide Agentzugänge weder Docker-Socket noch sudo erhalten. Der vorbereitete, syntaktisch geprüfte Root-Rollout liegt unter /home/agent/services/netplan-v4-shadow/commissioning/finish_corrected_forecast_rollout.sh und baut/testet vor dem Austausch, hält das vorige Image als Rollback fest und ändert keine Stellfreigabe. Daniel hat danach einen Aktivbetrieb angefragt; der aktuelle V4-Kern ist jedoch technisch shadow-only, und die weiterhin unbelegte Rückmeldung (feedback_source_skew, usableForTrial=false, canDispatch=false) verbietet ein blosses Umstellen. Keine Live-Freigabe wurde erteilt oder eingebaut. Git-Klarstellung durch Daniel: Commit-Autor dh_Agent <dh@belevo.ch>, Gitea-Konto dh; Commit/Push auf develop und beta am 04.10.2026 ausdrücklich freigegeben. Der Agentzugang besitzt derzeit keine HTTPS-Schreibanmeldung für dh.

Fortsetzung bestätigte Rückmeldung am 04.10.2026: Daniels Freigabe des modellierten virtual_split gilt für den ausdrücklich begrenzten Feldtest. Die physische Rückmeldung wurde um synchrone, durch den Gerätetreiber bestätigte Lesevorgänge erweitert: M-Bus verwendet MBUS_UpdateValues, ModBus Device und ModBus Address verwenden ModBus_RequestRead. Nur ein erfolgreicher Geräteaufruf erzeugt confirmedAt; VariableUpdated bleibt getrennte Herkunftsinformation. Die Regeltest-Gates verlangen deviceReadConfirmed=true. Das reproduzierbare inkrementelle Paket liegt auf der Testanlage unter /srv/agent/netplan-v4-confirmed-feedback-20261004; 18 Paketprüfsummen, 37 Rückmeldetests, 7 Geräteabruf-Tests und 71 Regeltest-Prüfungen sind erfolgreich. Es ist noch nicht im IP-Symcon-Kernel installiert, weil der lokale JSON-RPC-Zugang ohne Anmeldung mit HTTP 401 antwortet. Die Installation selbst lässt alten Netzfahrplan und beide Regeltestfreigaben aus. Ein realer Stellversuch bleibt zusätzlich durch den nicht belegten unabhängigen Geräte-Watchdog und die fehlende Serverfreigabe blockiert; der vorhandene Symcon-VorgabeTimeout ist kein unabhängiger Hardware-Nachweis. Auf enelix-services und der Testanlage ist kein nutzbarer Git-HTTPS-Credential-Helper hinterlegt; die Prüfung des Tunnel-Servers lief zweimal in eine externe Connector-Freigabezeitüberschreitung. Tokeninhalt wurde weder gelesen noch ausgegeben. Der Commit des Folgepakets ist lokal mit der vereinbarten Identitaet dh_Agent <dh@belevo.ch> erstellt. Der atomare Push auf develop und beta scheiterte ohne Teilaktualisierung, weil fuer https://dh@git.belevo.ch kein Passwort/Token bereitstand.

Fortsetzung Aktivbereitschaft am 04.10.2026: Die reale Stellkette wurde in den gespeicherten Testanlagen-Settings bis zu den Aktionszielen geprüft. Die ENELIX-Batterieinstanz 44234 schreibt über das Aktionsskript 31800 auf den EV-Sollwerteingang 19651 des Gateways 58448. Dieses Gateway verteilt im Zwei-Sekunden-Takt auf zwei GoodWe-Pfade über reine SetValue-Aktionsskripte und auf drei SolarEdge-Modbus-Adressen. Der ENELIX-VorgabeTimeout setzt bei laufendem Symcon nach 30 Sekunden auf 0 W zurück. Weder im Gateway noch in den drei GoodWe-Aktionsskripten wurde jedoch ein vom Symcon-Kernel unabhängiger Geräte-Watchdog gefunden; auch die SolarEdge-Modbus-Konfiguration weist nur Poll-/Write-Parameter, keinen Geräte-Timeout aus. Ein unbeaufsichtigter 1-2-Tage-Stellbetrieb bleibt deshalb gesperrt. Beide lokalen Regeltestfreigaben sind weiterhin aus, es wurde kein Stellbefehl ausgelöst. Der bestätigte Rückmeldeinstaller ist für einen gestoppten Kernel vorbereitet und geprüft, konnte mangels privilegierter systemctl-Berechtigung des Connector-Benutzers aber noch nicht ausgeführt werden. Auf tunel100 ist ein Credential-Helper für das Konto dh vorhanden und ein develop-Dry-Run war erfolgreich; die danach nötige Connector-Freigabe lief erneut ab, bevor der lokale 19-Commit-Stand übertragen und veröffentlicht werden konnte.

1. Zuerst lesen: Wo wir tatsächlich stehen

  • Daniel möchte die fertige, produktionsgeeignete Anwendung, nicht weitere isolierte Sammler, Diagnosekategorien oder wiederholte Bestätigungsrunden. Er hat die fortlaufende Umsetzung mehrfach beauftragt. Probleme im Code selbst beheben, Tests und Auslieferung bündeln; ihn nur für wirklich notwendige Root-/Symcon-Ausführung oder echte Anlagenfreigaben einbeziehen.
  • Datenaufnahme, bestätigter Versand, historische Aufbereitung, Modellaufbau, V4-Optimierer, Planempfang und ein ausdrücklich begrenzter Regeltest sind implementiert. Der zuletzt installierte Teil verbindet korrigierte physische Rückmeldung mit Vorschau und dem begrenzten Test-Stellpfad.
  • Der Versandblocker durch 100.0/100 ist behoben und der Nachversand hat aufgeholt. Nicht erneut beim Cursor oder der alten Kennungsdiagnose anfangen.
  • Die letzte Feedback-Installation ist erfolgreich abgeschlossen, nicht mehr waiting_for_registration. Bericht: corrected_feedback_installed_trial_disabled, Rückmeldung unavailable, Grund feedback_source_skew.
  • Nächster konkreter Entwicklungsauftrag: bestätigte, zum tatsächlich gelesenen Wert passende Geräte-Lesezeitpunkte an den lokalen Rückmeldepfad anschliessen. Bisher wird VariableUpdated als Live-Zeitbasis verwendet; unveränderte Modbus-Werte werden aber nicht zwingend bei jedem erfolgreichen Abruf erneut publiziert. Geräteabruf, Variablenpublikation und aktueller Lesezugriff müssen auseinandergehalten werden.
  • Keine künstliche Zeitstempelverjüngung, pauschale Toleranzerhöhung, Nullersetzung, historische Interpolation als Live-Messung oder Rückkehr zum festgehaltenen virtuellen EV-Wert.
  • Weiterhin keine produktive V4-Batterieausführung: alter intelligenter Netzfahrplan AUS; beide lokalen Regeltestfreigaben AUS; kein gestarteter Stellversuch. Bestehende lokale Regelung und SDL laufen unabhängig weiter.
  • Ein uneingeschränkter Produktions-Dauerregler ist noch offene Umsetzung, nicht nur ein fehlender Haken. Automatik, reale Modellqualität, Geräteausfallverhalten und Mehranlagenfreigabe haben ebenfalls verbleibende Grenzen.
  • Letzter fachlicher EMS-Commit: 9878197, develop, bei Übergabeprüfung sauber und 15 Commits vor lokalem origin/develop. Kein Remote-Fetch in dieser Prüfung. Vorherige Pushversuche scheiterten an Authentifizierung. Dokumentations-Commits dieser Übergabe können danach folgen.

2. Arbeitsweise und Freigaben

Daniel ist technisch versiert, will aber keine unnötige manuelle Kleinarbeit. Deutsch, Schweizer Schreibweise, konkrete nutzbare Befehle. Ein abgeschlossener Test ist nicht automatisch Installation, Installation nicht Stellfreigabe, optimal nicht reale Einsparung. Immer getrennt berichten: implementiert / isoliert getestet / Zielcontainer getestet / installiert / im Kernel geprüft / am Gerät erprobt / veröffentlicht.

Nicht wieder in die alte Schleife zurückfallen:

  1. Keine neuen Diagnosekategorien als Ersatz für die eigentliche Integration.
  2. Keine erneuten Fragen nach bereits bestätigten EV-Kapazitäten oder pauschal immer wieder nach Wechselrichtertypen. Bestehende Quellen nutzen. Eine tatsächlich fehlende sicherheitsrelevante Eigenschaft darf trotzdem nicht erfunden werden.
  3. Nicht einfach „24 Stunden warten“, solange ein Software- oder Übertragungsfehler das Training verhindert.
  4. Keine alten Einzelinstaller erneut ausführen; neueren Quellstand und parallele GUI-Arbeit nicht überschreiben.
  5. Nicht behaupten, im Hintergrund weiterzuarbeiten. Nur tatsächlich ausgeführte Arbeit und belegte Ergebnisse berichten.
  6. Die Regel „ein einziger konkreter Punkt“ betraf Einträge in Offene Punkte, nicht Entwicklungsaufträge. Implementierungsaufträge dürfen zusammenhängende Anforderungen bündeln.

Git: Keine Feature-Branches. Entwicklung auf develop; nach Tests beta; nach Feldtest main. Daniel hat im Gespräch Commit/Push für develop und damals auch beta ausdrücklich freigegeben. Diese Freigabe nicht als Auftrag interpretieren, einen aktuell ungetesteten Kandidaten blind auf beta/main zu schieben. develop-Push ohne erneute Nachfrage im bestehenden Rahmen erlaubt. Nicht force-pushen, nicht unzusammenhängende Änderungen übernehmen, keine Zugangsdaten verlangen/ausgeben. Historische Agenten-Commitidentität war ENELIX Agent <agent@enelix.invalid>; keine globale Git-Konfiguration ungeprüft ändern.

Die aktuelle Nachricht beauftragt Kontextübergabe. Sie erteilt keine zusätzliche Anlagen-, Runtime- oder Stellfreigabe. Bei späterer Fortsetzung greifen die bestehenden Sicherheits- und Branchregeln weiter.

3. Ursprüngliches fachliches Ziel

3.1 Prognosefamilien und Erweiterbarkeit

Im GUI manuell eine Familie wählen oder auto:

Familienschlüssel / Fahrplan PV Last Fahrplanvariable
3 prog_var_1 prog_var_2 prog_var_3
13 prog_var_10 prog_var_11 prog_var_13
23 prog_var_21 prog_var_22 prog_var_23

Die neun Zahlen sind nicht neun unabhängige Fahrplanmodelle. Daniel akzeptierte die Auswahl der vollständigen Modellfamilie. Registry und Datenadapter so gestalten, dass weitere Familien und später weitere flexible Anlagen ergänzt werden können. Nicht behaupten, drei bereits vorhandene Lastmethoden seien identisch mit den neu aufgebauten physischen Profilen; Datenquelle und Modellversion müssen sichtbar sein.

auto soll jene Familie wählen, die in der jüngeren Vergangenheit wirtschaftlich am besten abgeschnitten hätte, mit gleichen Anfangsbedingungen, Tarifen, SOC-/Restenergiebewertung und Randbedingungen. Keine Auswahl allein nach R², keine Zukunftsinformation im historischen Replay. Mindestabdeckung, Mindestdauer, Rückblick und Wechselmarge verhindern häufige/schlecht belegte Wechsel.

3.2 Netzfahrplan / Optimierung

  • Bis zu 48 Stunden, grundsätzlich 5-Minuten-Schritte (höchstens 576), rollende Neuberechnung.
  • Ausgangsverlauf: korrekt abgegrenzte Verbraucherlast minus PV plus separat berücksichtigte externe Flüsse. Darauf flexible Verbraucher optimieren; aktuell EV-Batterie, später Ladestationen, Boiler usw.
  • Batterie: aktueller virtueller EV-SOC, dessen zugehörige EV-Gesamtkapazität, aktuelle maximale Lade-/Entladeleistung, Min-/Max-SOC, Reserve, Hysterese, Verfügbarkeit und lokale Einschränkungen. Keine zukünftige Energie vor dem Laden nutzen.
  • 90 % Roundtrip-Wirkungsgrad, nicht zweimal 90 %. Implementierung verteilt Verluste mit sqrt(0.9) auf Laden/Entladen.
  • Netzladen ist ausdrücklich erlaubt/gewünscht, wenn freigegeben und wirtschaftlich sinnvoll. Nicht generell Nachtbezug verbieten oder tagsüber Entladung verbieten.
  • Kosten pro Intervall: Bezugsenergie mal Bezugspreis minus Einspeiseenergie mal Einspeisepreis. Leistungswerte in W/kW korrekt über Zeit in kWh umrechnen. Gesamtkosten minimieren, nicht mathematisch auf exakt null zwingen; negative Kosten sind möglich, nicht garantiert.
  • Statische oder dynamische, in der Anlage konfigurierte Bezugspreise und Einspeisevergütungen verwenden. GUI-Preisänderungen speichern und Neuberechnung anfordern. PV-Vergütung, Netzladekosten, Verluste und Peakpreis gehören in dieselbe Wirtschaftlichkeitsbetrachtung.
  • Wenn dynamische Preise noch nicht veröffentlicht sind, den ausführbaren wirtschaftlichen Horizont auf den bekannten Preisbereich begrenzen (published_only); kein frei erfundener Preis für den Rest der 48 h. Volle Prognose und ausführbaren Preishorizont unterscheiden; Ende passend zur vollständigen Abrechnungsviertelstunde.
  • Restenergie am Horizont fair bewerten/absichern, damit die Batterie nicht am Planende oder zu fast wertlosen Mittagstarifen grundlos leerverkauft wird.
  • Bezug/Einspeisung sowie Laden/Entladen nicht als unphysikalische gleichzeitige Arbitrage zulassen.
  • Einspeisebegrenzung, zulässige Abregelung/entgangene Vergütung und lokale harte Netzgrenzen berücksichtigen. Einen unerreichbaren Plan nicht als eingehalten darstellen.

3.3 Monatspeak

  • Leistungstarif auf den relevanten 15-Minuten-Netzbezug; persistenter Monatsmaximalwert, nicht momentane Spitzenleistung. Für den laufenden Monat zusätzliche Kosten nur für Erhöhung über den bereits erreichten Peak; Monatswechsel korrekt behandeln.
  • Bereits verstrichene Energie der aktuellen Viertelstunde mitnehmen. Fehlende Messbasis nicht durch eine konfigurierte Grenze ersetzen.
  • Am Monatsanfang nicht künstlich jede Aktivität verhindern: Restmonatsbewertung/empirische Aussicht ist vorgesehen, mit ausgewiesener Unsicherheit. Ein erwarteter künftiger Peak ist keine bereits bezahlte kostenlose Freigabe.
  • Anlagen können keine feste Bezugsgrenze haben. Falls im Manager statische oder monatliche Peakgrenzen konfiguriert sind, diese zusätzlich respektieren.
  • Tarifeinheiten und tatsächliche Abrechnungsdefinition prüfen; gemessene, geschätzte und nur konfigurierte Peakwerte getrennt kennzeichnen.

3.4 Training, Reaktion und Validierung

Tägliches oder wöchentliches Nachtraining nach GUI-Einstellung; Parameter-/Preisänderungen sollen Neuberechnung auslösen. Getrennte versionierte Historien und Modelle, keine alten belasteten Daten als bereinigt umbenennen. Ein Cold-Start-Modell nach Mindestdatenbasis ist noch keine validierte Feldprognose. Vergleich gegen die bisherige Batterie-Betriebsweise, nicht nur gegen „Anlage ohne Batterie“.

4. Lihrenmoos: bestätigte Anlage und massgebliche Korrekturen

  • Installation: e3a08f9e-af12-4695-99bd-8b51c0520021.
  • Symcon Manager 17004, ENELIX-Batterieinstanz 44234, virtuelles Asset anlage01-virtual-ev, bestehendes EV-/SDL-Gateway 58448.
  • Massgeblich bestätigt: EV-Kapazität 161.44 kWh, EV-Leistung 39 kW. Die vorher genannten 160 kWh, 30 kW und „je 10 kW pro WR“ hat Daniel ausdrücklich als Erinnerungskorrektur zurückgenommen. Daraus keine neue Verteilung auf Einzelgeräte ableiten.
  • Virtueller EV-SOC und die EV-Kapazität bilden ein gemeinsames Energiekonto. Keine SOC-/Energie-Resets oder Umrechnung auf 322 kWh. SDL-Reserve ist bereits ausgegliedert und darf nicht nochmals von EV abgezogen werden.
  • Vom Nutzer genannte physische Ausstattung: zwei GoodWe à 50 kW AC, je 156 kWh Batterie; SolarEdge 10 kW AC / 10 kWh Batterie. Summe physische Kapazitäten rechnerisch 322 kWh, nicht die EV-Kapazität. AC-Nennleistung ist kein unabhängiger Nachweis jeder aktuell zulässigen Batterie-Ladeleistung.
  • Dach-PV ungefähr 20 kWp Ost + 20 kWp West.
  • Exakte Gerätetypen/Firmware, jede AC-/DC-Messgrenze und autonomes Verhalten beim Befehlsausfall sind durch diese Nennwerte nicht automatisch bestätigt. Vorhandene Dokumente/Quellen verwenden, statt Angaben zu erfinden oder Daniel wiederholt pauschal zu befragen.
  • Historischer Tarif-Snapshot: Bezug CKW Dynamisch Home, statischer Fallbackwert 0.246 CHF/kWh, Einspeisung „Preis selber eingeben“ 0.10 CHF/kWh, Peakparameter 5.0. Nicht als aktuelle Tarifvorgabe neu setzen, vor Verwendung aktuelle Konfiguration lesen.

5. Bilanzierung und SDL: nicht wieder die alte Fehlerquelle einbauen

Der alte Prognosesender verwendete sinngemäss PV + Netz − virtuelle EV-Batterieleistung. Weil nur die virtuelle EV-Batterie in der Topologie stand, konnte SDL als Hausverbrauch gelernt werden. Zusätzlich hält das bestehende Gateway unter bestimmten Bedingungen gefilterte virtuelle EV-/SDL-Istleistungen fest und schreibt sie erneut. Neuer Variablenzeitstempel allein machte diese Werte nicht zur frischen physikalischen Messung.

Neue Grundidee, bei passender elektrischer Messgrenze:

Verbraucherlast = Netzbezug + PV-Erzeugung − gesamte physische Batterieladung

Grundlast = Verbraucherlast − separat geplante flexible Verbraucher

Grundlast bedeutet hier zeitabhängiger nicht separat geplanter Verbrauch, keine Konstante. Nicht separat geplante Boiler/Wallboxen bleiben vorerst darin. Später beim Übergang zu eigenständiger Planung genau einmal herausrechnen.

SolarEdge-Sonderfall: PV-Variable 20335 war bereits aus skaliertem AC-Ausgang plus Batterieleistung berechnet und auf null begrenzt. Neuer Lastadapter solar_terminal_v1 verwendet den AC-Ausgang aus 37975/41853 direkt und zieht den SolarEdge-Batteriesaldo nicht nochmals ab. Herkunft, Vorzeichen, AC/DC und Null-Clipping beachten. Algebraischer Bilanzschluss allein ist kein unabhängiger Zählernachweis.

SDL wird nicht vom V4-Flexibilitätsoptimierer gesteuert. Bekannten externen Fahrplan berücksichtigen; bei unbekanntem Verlauf nicht still null einsetzen. Die vorhandene Schattenplanung kann den aktuellen SDL-Auftrag als ausdrücklich gekennzeichnete Fortschreibung verwenden. Das ist kein veröffentlichter Zukunftsfahrplan. Für Dauerproduktion sind belastbare externe Grenzen/Reservebehandlung und Konfliktauflösung noch zu prüfen. Ein aktueller SDL-Wert null garantiert keine SDL-freie kommende halbe Stunde.

Bestehendes Gateway: /var/lib/symcon/modules/Symcon_Belevo_Energiemanagement_testing/Bat_EV_SDL_V4/module.php. Aktionsbrücke historisch scripts/31800.ips.php. State=false war dort kein nachgewiesener Nullstell-/Notstopp. EV-Stopp darf nicht pauschal unabhängige SDL-Aufträge löschen. Virtuelle Energiekonten/Filter nicht ungeprüft umstellen.

6. Quellzuordnung für die nächste Arbeit

Werte/Identitäten mit aktueller Quellenkonfiguration abgleichen; Tabelle ist zuletzt geprüfte Zuordnung, keine Erlaubnis, Register umzulegen.

Grösse Variable Ursprung/Umrechnung
Original-Netzleistung 40348 Parent 11490, Power_8, kW ×1000 → W, Bezug positiv
Netz-Anzeige 49301 Abgeleitet; nicht mit Originalquelle verwechseln
GoodWe 1 PV 48459 Parent 19742, A_3_3_35301, W
GoodWe 2 PV 53802 Parent 57658, A_3_3_35301, W
GoodWe 1 Batterie physisch 47725 Parent 19742, A_6_3_35182, Faktor −1 → Laden positiv
GoodWe 2 Batterie physisch 35724 Parent 57658, A_6_3_35182, Faktor −1
SolarEdge Batterie physisch 21447 Parent 30789, Value, Faktor +1
SolarEdge abgeleitete PV 20335 Parent 36915; nicht unabhängige PV-Messung
SolarEdge AC-Rohwert 37975 Parent 35514, Value, ReadAddress 40083
SolarEdge AC-Skalierung 41853 Parent 48996, Value, ReadAddress 40084
Virtuelle EV-Istleistung 52020 Parent 58448, Aktuelle_Leistung_EV; Filterhaltewert möglich
Virtuelle SDL-Istleistung 25085 Parent 58448, Aktuelle_Leistung_SDL
EV-Auftrag 19651 Parent 58448, Nennleistung_Soll_EV
SDL-Auftrag 38943 Parent 58448, Nennleistung_Soll_SDL
Gateway aktiv 23483 Parent 58448, State; kein Gerätewatchdog-Nachweis
EV-SOC 32871 Parent 58448, SoC_EV
SDL-SOC 23879 Parent 58448, SDL_Pos
EV verfügbare Ladeleistung 50230 Parent 58448, P_EV_laden
EV verfügbare Entladeleistung 43899 Parent 58448, P_EV_entladen
GoodWe 1 / 2 / SolarEdge SOC 27361 / 23109 / 51938 Originalzuordnung siehe Capture-Konfiguration
Wirkenergie Bezug T1 59607 Parent 11490, Energy_0, kWh
Wirkenergie Bezug T2 26620 Parent 11490, Energy_1; Zählerarchivierung aktiviert

Nicht wieder 53476 als nachgewiesenen Bezugszähler verwenden: Im Gespräch zeigte 53476 / Quelle 32797 (Energy_6) einen unplausibel anderen Verlauf gegenüber Netzleistung und T1. Alte Historie 53476 wurde bewusst nicht überschrieben. Archivinstanz 16207. Neuzeitlicher Peak muss aus geeigneter T1/T2-Summe bzw. ausdrücklich zugelassener vollständiger Viertelstundenschätzung stammen.

Poller laut zuletzt gelesenem Snapshot: GoodWe 1 Parent 19742 60000 ms, GoodWe 2 Parent 57658 5000 ms; SolarEdge Batterie Parent 30789 2000 ms, AC Parent 35514 1000 ms, Skalierung Parent 48996 20000 ms. M-Bus Parent 11490 hatte Interval=0, trotzdem laufend frische Originalwerte. Nicht daraus schliessen, die Erfassung sei aus; zusätzliche bestehende Aufrufwege prüfen. Poller nie allein als erfolgreichen Geräteabruf interpretieren.

7. Hosts, Code, Dienste und Berechtigungen

enelix-services / Connector Server_89

  • Host enelix-services, IPv4 87.106.60.89, Agentbenutzer agent. Erlaubte Wurzeln /home/agent/services, /srv/agent.
  • Entwicklung: /srv/agent/repos/Enelix-EMS, Gitea ENELIX/Enelix-EMS auf git.belevo.ch. Weiteres Projekt ENELIX/Enelix-Utils; historische Referenz dh/Symcon_Belevo_Energiemanagement_testing. Andere Hosts/Klone nicht ohne Nachweis gleichsetzen.
  • Versionierter neuer Servercode: services/netplan-v4/ im EMS-Repo.
  • Runtime/Build-Staging: /home/agent/services/netplan-v4-shadow, SQLite data/netplan-v4.sqlite, Compose compose.yaml, interner V4-Port 9100.
  • Bisheriger Forecast/API-Dienst: /home/agent/services/prognosis-manager-enelix2; Forecast Engine interner Port 9000. Nicht durch neue V4-Arbeit unbemerkt ersetzen.
  • Portal: /home/agent/services/license, server.mjs, public/, compose.yaml. Parallele GUI-Arbeit möglich. Unified-RC1 aktualisierte nur V4 und zugehöriges Planner-JS, nicht pauschal alle Portalprozesse.
  • Vor Veränderungen /srv/agent/AGENT_CONTEXT.md lesen. Agent hatte zuletzt keinen Docker-Socket-/Root-Zugriff; den Nutzer Root-Ausführung nur für tatsächlich benötigte Deployment-Schritte erledigen lassen. Keine Berechtigungen auf Docker-Socket ausweiten.

iot-symcon01 / Connector Testanlage_Lihrenmoos

  • IP-Symcon 8.0, Dienst symcon.service, Kerneldateien /var/lib/symcon, Logs /var/log/symcon, Programme /usr/share/symcon.
  • Installiertes EMS-Repo: /var/lib/symcon/modules/Enelix-EMS. Das ist produktionsnah laufender Code, nicht der Entwicklungscheckout auf Server_89.
  • Staging, Tests, Diagnose: /srv/agent/netplan-v4-....
  • Hostregeln /srv/agent/AGENT_CONTEXT.md lesen. Keine allgemeinen Settings-/Credential-Exports. Für gezielte schreibgeschützte Zustandsprüfung nur erlaubte Felder extrahieren, niemals ganze secret-bearing Konfiguration ausgeben.
  • PHP mit IPS-Funktionen gehört in Symcon, nicht in die Linux-Bash und nicht in gewöhnliches CLI-PHP. Isolierte CLI-Tests mit simulierten IPS-Funktionen umgekehrt niemals im echten Kernel ausführen.
  • MC_ReloadModule/IPS_ApplyChanges können bestehende Initialisierungen und deren Nebenwirkungen ausführen. Nicht pauschal als ohne Auswirkungen versprechen. Code- und Settings-Sicherung, Hash-/Driftprüfung, Rücksetzweg nötig.
  • Bei verzögerter Modulregistrierung wurde ein Wiederholen angefordert. Die letzte Installation ist inzwischen fertig: jetzt nicht wiederholen.

8. Installierter Daten-/Prognosepfad

  1. Manager erfasst 23 numerische Quellen alle 30 s, mit originalen Zeitstempeln und Qualitätsmerkmalen. Keine zusätzlichen Modbus-Abfragen durch den bisherigen Sammler.
  2. Lokale append-only Tagesdateien/Outbox. Versand regulär höchstens einmal/min, bis 120 Aufnahmen pro Batch; geordneter, bestätigter Cursor. Backoff bei Fehlern; Originale bleiben erhalten. scheduled kann reguläre Sendepause oder Backoff bedeuten; getrennte letzte erfolgreiche Bestätigung beachten.
  3. Server-Datensatz lihrenmoos-physical-v1 speichert Originalaufnahmen. Abgeleiteter Datensatz lihrenmoos-physical-published-v2 referenziert dieselben Daten für die verbesserte historische Zeitbehandlung.
  4. equal_endpoint_v1: begrenzte rückblickende Schätzung bei gleichen Werten an getrennten Originalzeitpunkten. Verfügbarkeit der späteren Bestätigung wird mitgeführt; keine Leckage in damalige Entscheidungen. Unterschiedliche Werte, lange Ausfälle, widersprüchliche Quellen oder Sammellücken nicht unbemerkt überbrücken. Live-Grenzen unverändert.
  5. Worker verarbeitet im 5-Minuten-Takt. Mindestbasis 24 verwertbare äquivalente Stunden, nicht bloss seit Start verstrichene Zeit. Neue Tagesprofile, versionierte Modelle, konfigurierbare tägliche/wöchentliche Neubildung. Kaltstart/Validierung sind getrennt.
  6. Neue Datenquelle muss als corrected_profile mit passendem measurementDataset gewählt werden, sobald verwendbar; zuletzt blieb forecastSource=legacy, family=3. Nicht bei Installation automatisch umgeschaltet. optimal auf der Legacy-Quelle ist kein Nachweis der neuen Prognosequalität.
  7. Wirtschaftlicher Vergleich Unified-RC1 ist angeschlossen, aber v1 ist eingefrorener Tagesplan + simulierte lokale Netzzielnachführung, nicht vollständiges rollendes MPC-Replay. Eine netzladefähige Batterie; gleiche Anfangsbedingungen, Restenergie, Verluste und einmalige Monatspeakabrechnung. Historischer SDL-Auftrag als gekennzeichnete Schätzung. Vollständige Modellautomatik/Produktversprechen nicht über diesen Scope hinaus behaupten.
  8. Archivierung ist implementiert, AUS als Standard (native NetzfahrplanV4ArchivAktiv, serverseitig NETPLAN_V4_ARCHIVE_ENABLED). Verifizierte komprimierte Archive ersetzen kein externes Backup und lösen keine unendliche Speicherkapazität. Keine unbestätigten Outbox-Daten löschen.

9. Behobene Fehler – nicht erneut aufrollen

  • Früherer numpy-Fehler assignment destination is read-only, falscher Import battery_optimizer_new, Dateirechte im unprivilegierten Container: damalige Deployment-/Codefehler, nicht aktuelle Blocker.
  • Direkt nach Start Connection refused, danach HTTP 409 „bereits ein Lauf aktiv“: Start-/Parallelitätszustand, nicht durch wiederholte Neustarts lösen.
  • Native Betriebsdaten fehlten; anschließend Sender installiert. Tarifimporter und Portal-Rate-Limit wurden repariert. Alte 429-Meldungen nicht ohne neue Evidenz zur heutigen Ursache erklären.
  • Klasse NetzfahrplanV4Messaufnahme doppelt aus Staging und Modulpfad geladen: Installer auf eindeutige installierte Bibliothek umgestellt. require_once verhindert nicht verschiedene Dateien mit derselben Klasse.
  • Gemischter 120er-Block: 45 importierte/75 native Aufnahmen, keine doppelten/rückwärtslaufenden Zeiten, aber andere Kennung allein durch splitToleranceW:100.0 vs 100. Normalisierung korrigiert; beide vollständigen Konfigurationen exakt geprüft. Kompatibilität nur für diese anlagen- und datensatzgebundene Gleichwertigkeit registriert; Ursprungskennung/Evidence gespeichert. Keine Hashs in Originaljournalen ersetzt, kein Cursor-Sprung.
  • Nachweis der Reparatur: am 03.10. 12:58 Schweizer Zeit 1'782 statt 1'320 Aufnahmen, jüngste Aufnahme 12:58:09, 25 s alt, vollständiger ehemals blockierter Batch vorhanden, Manager acknowledged/Fehlerzahl 0. Quelle [F] unten. Keine Garantie über den danach liegenden Zeitraum ableiten.
  • Historische Datenqualität verbesserte sich von 0 brauchbaren Fenstern auf 104/8.66 h, nach Nachversand 130/10.82 h; zuletzt Worker 140/11.65 h. Prozentangaben zur zeitlichen Abdeckung sind keine Messgenauigkeit und keine Prognosegüte.

10. Installierter Rückmelde- und begrenzter Stellpfad

Gemeinsamer Code: NetzfahrplanV4Rueckmeldung.php, BatterieNetzfahrplanV4RueckmeldungTrait.php, ManagerNetzfahrplanV4EmpfangTrait.php, ManagerNetzfahrplanV4TestTrait.php, BatterieNetzfahrplanV4TestTrait.php, NetzfahrplanV4Regeltest.php, Manager-/Batterie-Module.

  • Zweifaches Lesen mit Identitäts- und Originalzeitprüfung; momentan Live-Alter maximal 60 s, Quellenversatz maximal 30 s.
  • Modus in Lihrenmoos virtual_split, allowEstimatedForTrial=false. Auch gültige Rückmeldung oder Vorschau erteilt keine Freigabe.
  • Wenn SDL-Auftrag exakt null, physische Batteriesumme statt gefilterter virtueller EV-Anzeige verwenden; unveränderter Nullauftrag ist Zustand, kein Messgeräte-Heartbeat. Eine neue EV-Vorgabe bedeutet noch keine sofortige physische Reaktion.
  • Bei SDL ungleich null: zeitliche Abdeckung von Auftragsänderung, Tracking-Toleranz und explizite Schätzkennzeichnung. Gegenläufige EV-/SDL-Flüsse sind nicht eindeutig identifizierbar und bleiben für diesen Test gesperrt.
  • Netzziel wird in Gesamt-Batterieleistung, nicht zusätzlichen Ladeauftrag übersetzt. Erwartete Änderungen anderer Verbraucher genau einmal berücksichtigen.
  • Separate interne Server-Testsitzung, leere Default-Allowlist NETPLAN_V4_CONTROL_TRIAL_PLANTS, manuelle Familie, Anlagen-/Asset-/Instanz-/Revisionsbindung, beide lokalen Freigaben NetzfahrplanV4RegeltestErlaubt, bewusster lokaler Start, gültiger Plan, Bilanz- und Gerätewatchdog-Nachweis.
  • Test max. 30 min / 5 kW je Richtung; Serverauthority maximal 90 s; Batteriebefehl maximal 10 s; Batterie-Softwarewatchdog 1 s, Manager-Testtakt 2 s. Nicht einfach Limits für Produktion hochsetzen.
  • Batterie liest vor Ausgabe unabhängig neu und prüft SOC, Reserve, Hysterese, Verfügbarkeit, Sperrzeiten und Netzgrenzen. Unmögliches Netzziel → Testabbruch, keine Erfolgsbehauptung.
  • Abbruch widerruft Sitzung vor Nullstellversuch; Stoppfehler bleibt sichtbar. Danach maximal eine frisch berechnete normale Zuteilung, keine Rückkehr zu gecachtem Test-/Vor-Testwert. Keine Wiederbelebung nach Neustart oder doppeltem Befehl.
  • shadow_seen bedeutet Empfang, nicht ausgeführt. canDispatch=false in Vorschau bedeutet keine Vorschau-Freigabe. Bei einer separat gestarteten Testsitzung wäre runMode=shadow alleine trotzdem kein hinreichender Nachweis für null Stellbefehle.
  • Softwarewatchdog funktioniert nur bei laufendem Kernel/Kommunikation. Kein Nachweis für Rechnerabsturz, Stromausfall oder unerreichbaren Wechselrichter. Bereits vorhandenes Verhalten prüfen, nicht erfinden und nicht Schutzgates entfernen.

11. Aktueller Blocker: bestätigter Geräteabruf statt falscher Zeitbasis

Letzter Installationsbericht [A]:

status: corrected_feedback_installed_trial_disabled
feedback.status: unavailable
feedback.reason: feedback_source_skew
batteryW: null
gridW: null
usableForTrial: false
canDispatch: false

Das ist kein Installationsfehler. Die Meldung „Modellanteil: nein“ im Installer ist im Fehlerfall irreführend: fehlendes Feld wird als false dargestellt, obwohl die Berechnung gar nicht erfolgreich war. Kleine UI-/Diagnosekorrektur mitnehmen.

Letzte Zeituntersuchung [B] (237 Aufnahmen / 2 h): 48 Aufnahmen mit Versatz >30 s. Netz median 1 s/max 2 s, GoodWe 1 median 1 s/max 48 s, GoodWe 2 median 1 s/max 46 s, SolarEdge median 12 s/max 59 s; SolarEdge in 223 Aufnahmen unter den ältesten Quellen. Keine der vier Quellen in genau diesem Zeitfenster über 60 s. Beispiel 13:58:38: drei Quellen neu, SolarEdge 31 s alt → Ablehnung. Frühere mehrminütige Lücken trotzdem nicht damit wegargumentieren.

Nächste Umsetzung, ohne neue Diagnosekategorie:

  1. Installierten Gerätemodultyp und unterstützten Leseweg verifizieren. Im Gespräch wurde ModBus_RequestRead() als möglicher Ansatz genannt. API-/Erfolgs-/Zeitsemantik und Unterschied ModBus Address vs ModBus Device anhand offizieller aktueller Dokumentation und vorhandenem Code prüfen; nicht voraussetzen, dass ein boolescher Erfolg alle Register atomar aktualisiert oder einen unabhängigen Gerätezeitpunkt liefert.
  2. Erfolgreiche vollständige Antwort mit genau den daraus stammenden Werten, Zuordnung, Status und Bestätigungszeit binden. VariableUpdated, Geräteabrufbestätigung und Sammlerzeit getrennt erhalten.
  3. Begrenzte Abfragefrequenz, Timeout, Serialisierung, Kommunikationslast und Lesekohärenz berücksichtigen. Keine Netz-I/O in jedem Vorschau-/Regelcallback vervielfachen, keine blockierenden Abfragen unter dem Stellregler-Lock. Existierende erfolgreiche Polls nach Möglichkeit nutzen.
  4. Wenn keine echte Bestätigung vorliegt, unsicher/gesperrt bleiben. Keine künstlichen SetValue-Herzschläge und keine permissive Freigabe bloss wegen des Pollerintervalls.
  5. In bestehenden Batterie-/Managerpfad integrieren; Tests: unveränderte Werte mit erfolgreichem Abruf, fehlgeschlagene/partielle Antwort, Zeitversatz, Race, Wiederholung, Neustart, erneute unabhängige Batterieprüfung und Rückfall.
  6. Zusammenhängenden Kandidaten bauen und testen; neue Runtime-Installation nur im bekannten gesicherten Verfahren. Bisherige Installer nicht nochmals ausführen.

Diese Arbeit wurde am Gesprächsende noch nicht implementiert oder installiert. Sie ist nicht durch die vorliegende Dokumentationsübergabe erledigt.

12. Produktionsreife: verbleibende echte Arbeiten

  • Verlässlicher bestätigter Live-Messpfad wie oben; unklares AC/DC/externes SDL nicht durch Labels als verifiziert deklarieren.
  • Neue Lastprofile mit tatsächlicher ausreichender Datenbasis/Validierung aufbauen und gezielt zur Schattenrechnung schalten. Aktuelle Einstellungen/Modelle vorher lesen, nicht alte Momentaufnahmen fortschreiben.
  • Dauerbetrieb mit sauberem Authority-/Zustands-/Neustart-/Fallback-Verhalten implementieren. Bisher nur begrenzter Pilot, keine fertige kontinuierliche Produktionsfreigabe.
  • Reale Callback-/Registerstrecke und separat freigegebener Stellversuch; korrekte Vorzeichen, verfügbare Leistungen, Netzziel/Peak-/Exportgrenzen, Abschalten/Verbindungsausfall, lokale Priorität und SDL-Konflikte prüfen.
  • Modellautomatik über den deklarierten Frozen-Day-v1-Scope hinaus nur nach Erweiterung/Nachweis bewerben; Grenzen transparent halten.
  • Lebenszyklus/Backups/Recovery/Observability, Mehranlagenisolierung und parametrisierte Inbetriebnahme. Einige Installer sind bewusst auf Lihrenmoos gebunden; für andere Anlagen nicht IDs blind übernehmen.
  • Git-Authentifizierung/Veröffentlichung lösen; develop → geprüfte beta → Feldabnahme main. Browser-Login, Tailscale oder Portforwarding stellen nicht automatisch Git-Schreibauthentifizierung bereit. Keine Veröffentlichung behaupten, die nicht passiert ist.

13. Wichtige Meilensteine und nicht erneut auszuführende Installer

Paket Status bis Gesprächsende
V4-Schattenserver / Native Operation / Tarife Installiert, Betrieb historisch belegt
Passiver Empfänger /srv/agent/netplan-v4-receiver-stage/install.php Installiert, automatische shadow_seen-ACKs belegt
Rohsammler /srv/agent/netplan-v4-data-capture-stage Separater früherer Sammler; Originaldateien erhalten
Leseexport /srv/agent/netplan-v4-data-review-stage Einmaliger Export wegen restriktiver Originalrechte; heute keine erneute allgemeine Exportpflicht
Getrennter Beobachter /srv/agent/netplan-v4-separated-observer-stage 23 Quellen, Dateien gezielt lesbar; weiterhin Originalbestand
Managerdaten /srv/agent/netplan-v4-application-build/install.php Installiert, Klasse-/Kennungsfehler später behoben
deploy_history_timing.py Installiert, neue Historienversion v2
deploy_unified_release.py --approve-numeric-mapping-compatibility + /srv/agent/netplan-v4-unified-release/install.php Installiert, Aliasfreigabe exakt registriert, Nachversand aufgeholt
/srv/agent/netplan-v4-feedback-stage/install.php Fertig installiert nach einmaliger Registrierungsschleife, aktuell Zeitversatzprüfung

Fachliche Commitfolge (lokales develop; nicht als Remote-/Runtime-Gleichstand missverstehen): b5c1fa6 Empfänger, 9394fe3 begrenzter Test, e0e52d2 Bilanzierung, 76f8b06 Capture, 44362e4 getrennte Beobachtung, fe3f46b Datenanwendung, 6d9aba7 Klassenladen, 5890093 Historienzeit, 6c91d6b Zahlennormalisierung, 8eb9688 Unified RC1, 9878197 korrigierte Rückmelde-/Testkette. Einige weitere Commits können dazwischenliegen; git log ist massgeblich.

14. Quellenindex und Tests – zuerst Nachweise lesen, nicht neu installieren

[A] Letzte erfolgreiche Rückmeldeinstallation (Testhost): /srv/agent/netplan-v4-feedback-stage/INSTALL_RESULT.json – Ende 2026-10-03T11:59:58Z. Der frühere waiting_for_registration-Bericht ist überholt. Die Sicherung stammt vom ersten Dateidurchlauf, nicht vom zweiten already_installed-Durchlauf.

[B] Letzte Zeit-/Pipeline-Auswertung (Server): /home/agent/services/qa/feedback-timing-20261003/TIMING_REVIEW.json – 2026-10-03T12:02:13Z, 140 brauchbare Fenster/11.646 h, Quelle v2 noch collecting.

[C] Unified-Serverinstallation: /home/agent/services/netplan-v4-shadow/unified-releases/20261003T105407.036202Z/REPORT.json; Runtime unified-rc1, Mappingkompatibilität registriert, Einstellungen unverändert.

[D] Unified-Managerinstallation (Testhost): /srv/agent/netplan-v4-unified-release/INSTALL_RESULT.json.

[E] Historieninstallation: /home/agent/services/netplan-v4-shadow/history-timing-releases/20261003T092245.175100Z/REPORT.json.

[F] Erfolgreiches Aufholen des Datenwegs: /home/agent/services/qa/unified-release-20261003/FLOW-20261003T105834.324945Z.json.

[G] Installiertes und versioniertes Verhalten: docs/netplan-v4-corrected-feedback.md, docs/netplan-v4-unified-release.md, docs/netplan-v4-history-timing.md, docs/netplan-v4-numeric-mapping-fix.md, docs/netplan-v4-application.md, docs/netplan-v4-controlled-trial.md, docs/netplan-v4-accounting.md. Alte „noch nicht installiert“-Abschnitte dieser Entwicklungsdokumente durch aktuelle Installationsberichte einordnen; nicht mit echten Runtime-Nachweisen verwechseln.

[H] Rückmelde-/Testsuite (Testhost): /srv/agent/netplan-v4-feedback-stage/PREPARATION.json, TEST_RESULTS.txt, INSTALLER_TEST_RESULTS.json, ORDINARY_OFFER_TEST.json, MANIFEST.json, PACKAGE_HASHES.json, feedback-config.json. 125 isolierte Funktionsprüfungen, 4 vollständige Modul-Linkageprüfungen, 10 Installationsszenarien, 13'824 übereinstimmende normale Leistungsangebotsfälle. Keine Aussage, dass dieselbe Zahl Tests im echten Kernel/Wechselrichter gelaufen sei.

[I] Unified-Suite (Server): /home/agent/services/qa/unified-release-20261003/PYTHON_TEST_RESULTS.txt, NODE_TEST_RESULTS.txt, PUBLICATION.json, DELIVERY_STATUS.json. 306 Python- und 16 Portaltests; native separate Tests. Spätere Änderungen brauchen erneute relevante Tests, nicht bloss Übernahme dieser Zahlen.

[J] Wiederaufbau und Code: EMS examples/V4CorrectedFeedback/, examples/V4UnifiedRelease/, services/netplan-v4/commissioning/. Staging ist nicht dieselbe Quelle wie das laufende Modul. Dateien, Hashs und Abhängigkeiten vor Änderungen vergleichen; Paralleländerungen abbrechen statt überschreiben.

[K] Quellen-/Konfigurationsdiagnose (Testhost): /srv/agent/netplan-v4-application-build/inspect_source_update_policy.py, inspect_delivery_state.py, MAPPING_IDENTITY_DIAGNOSIS.json, MAPPING_EQUIVALENCE.json; netplan-v4-feedback-stage/review_current_feedback_state.py. Diese Skripte zuerst lesen; manche erzeugen nur einen Bericht, manche lesen gespeicherte statt live aktuelle Settings. Alte Settings-Snapshots können eine bereits installierte Eigenschaft noch nicht enthalten.

Sicherheitsnotiz: In einem alten Upload-Skript wurden Klartextzugangsdaten bemerkt. Nicht lesen, verbreiten, in Dokumentation/Git übernehmen oder für neue Integration verwenden. Separate autorisierte Rotation/Secret-Auslagerung bleibt Aufgabe; die Werte gehören nicht in diese Übergabe.

15. Übernahmeroutine für einen neuen Agenten

  1. Host-AGENT_CONTEXT.md, Repo-AGENTS.md und diese Datei vollständig lesen; bei fehlendem Remote-Stand zuerst den Servercheckout prüfen.
  2. git status/Branch/letzte Commits sowie [A], [B], [C] lesen. Zeitstempel nennen; keine alten Zähler als heutige Werte ausgeben. Diese Übernahme selbst ändert keine Anlage.
  3. Nur notwendige gezielte Read-only-Prüfungen. Kein weiterer vollständiger Neustart der Analyse oder Wiederholung bereits erledigter Installer.
  4. Bei Fortsetzungsauftrag direkt Abschnitt 11 umsetzen und anschliessend echte Restarbeiten aus Abschnitt 12 abarbeiten. Anforderungen, Testfall, Implementierung und Rollout in einem Paket halten.
  5. Nach jedem Abschluss diese Übergabe mit Datum, Codecommit, tatsächlichem Installations-/Teststatus und nächstem konkreten Arbeitsschritt ergänzen. Keine gescheiterten Schritte in „fertig“ umdeuten. Bei Widerspruch aktuelle geprüfte Laufzeit und ausdrückliche spätere Nutzerkorrektur nennen.

Kurzübernahme: „Netzfahrplan V4 in ENELIX fortsetzen. Datenkennung/Versand repariert, Unified RC1 und korrigierter Feedback-/Testpfad installiert. Aktuell feedback_source_skew; bestätigte Geräte-Lesezeitpunkte in die bestehende lokale Rückmeldung integrieren. EV 161.44 kWh/39 kW. Keine neue Diagnosekategorie, keine alten Installer, kein automatischer Stelltest. Dauerproduktion ist noch nicht fertig; Tests/Abnahme/Veröffentlichung sauber getrennt halten.“