Hauptversion V 4.5 - Awakening Beast veröffentlicht

Verehrte Nutzer des Timberwolf Servers. Wir haben die neue Hauptversion 4.5 für alle Modelle des Timberwolf Servers freigegeben.
Diese neue Version enthält insgesamt 24 neue Funktionen, 72 größere Verbesserungen und 28 wichtige Fehlerkorrekturen
Darunter die Timberwolf VISU in modernisiertem Look mit vielen Erweiterungen wie Rollladen-Widget, Detailseiten mit 20 Schaltern / Werten, Tabellen & Logs, verbessertertem Verknüpfungsassistent, Secure KNX im Busmonitor sowie Dekodierung weiterer DPT, komplett überarbeitete Darstellung der phys. Einheiten, einem stark erweitertem Logik Manager mit grafischer Darstellung der Logik Zellen, einer Unterstützung für HTTP-/REST-API als Server, dem Im- und Export von Geräteprofilen im MQTT sowie HTTP-/REST-API Manager und viele weitere Detailverbesserungen inkl. Lizenzmanagement.
Foren Diskussion: viewtopic.php?f=8&t=6050
Release Notes im Wiki: https://elabnet.atlassian.net/wiki/x/AYBLyQ
[Erfahrungsbericht] [V4.5 IP4] Nutzung von KI (LLM) für Dokumentation und Custom-Logiken
Forumsregeln
- Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
- Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
- Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
- Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln
-
- Beiträge: 687
- Registriert: Fr Sep 14, 2018 5:03 pm
- Hat sich bedankt: 1618 Mal
- Danksagung erhalten: 420 Mal
bitte testen
sie hat sich speichern lassen
wegen fehlender bauteile ist für mich ein testen nicht möglich
beim 2 ten versuch war sie speicherbar
ich habe der ki nur deine anleitung gegeben mehr nicht
also dein kompletten forumsbeitrag mit der anforderung deiner ki
{
"Meta": {
"Description": "Steuerung einer PV-Batterie (Zendure SolarFlow 2400 Pro) basierend auf Netzbezug für Lade- und Entladebetrieb unter Berücksichtigung von Effizienzgrenzen und Dämpfung.",
"Version": "1.0.1",
"Author": "AI (nach Vorgaben von Georg E.)",
"Last_Update": "2025-09-24"
},
"Input": [
[ "Netzbezug [W]", "Aktueller Leistungswert am Netzzähler (+Einspeisung / -Bezug)", "$in_Netzbezug", "c" ],
[ "PV Erzeugung [W]", "Aktuelle PV-Erzeugungsleistung", "$in_PVErzeugung", "a" ],
[ "SOC Batterie [%]", "Ladezustand der Batterie (0-100%)", "$in_SOC", "a" ]
],
"Output": [
[ "Betriebsmodus", "MQTT-Modus für Batterie (charge/discharge)", "$out_Betriebsmodus", "x" ],
[ "Soll Leistung Laden [W]", "Angeforderte Ladeleistung für Batterie", "$out_SollLeistungLaden", "x" ],
[ "Soll Leistung Entladen [W]", "Angeforderte Entladeleistung für Batterie", "$out_SollLeistungEntladen", "x" ],
[ "Logik Status", "Aktueller Zustand der Logik (0:STANDBY, 1:LADEN, 2:ENTLADEN)", "$out_LogikStatus", "c" ]
],
"Level": [
// Deklaration der Input-Variablen (Gemäß A.0.7)
[ "$in_Netzbezug", "float", 0.0 ],
[ "$in_PVErzeugung", "float", 0.0 ],
[ "$in_SOC", "float", 0.0 ],
// Deklaration der Output-Variablen
[ "$out_Betriebsmodus", "string", "" ],
[ "$out_SollLeistungLaden", "float", 0.0 ],
[ "$out_SollLeistungEntladen", "float", 0.0 ],
[ "$out_LogikStatus", "int", 0 ],
[ "$KonstStatusSTANDBY", "int", 0 ],
[ "$KonstStatusLADEN", "int", 1 ],
[ "$KonstStatusENTLADEN", "int", 2 ],
[ "$KonstGrenzeNetzbezugStandbyLaden", "float", 600.0 ],
[ "$KonstGrenzePVErzeugungStandbyLaden", "float", 50.0 ],
[ "$KonstGrenzeSOCMax", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugLadenStandby", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugStandbyEntladen", "float", -250.0 ],
[ "$KonstGrenzeSOCMin", "float", 0.0 ],
[ "$KonstGrenzeNetzbezugEntladenStandby", "float", -50.0 ],
[ "$KonstLadezielRestUeberschuss", "float", 200.0 ],
[ "$KonstLadeMinLeistung", "float", 400.0 ],
[ "$KonstLadeMaxLeistung", "float", 1200.0 ],
[ "$KonstEntladezielRestBezug", "float", 50.0 ],
[ "$KonstEntladeMinLeistung", "float", 200.0 ],
[ "$KonstEntladeMaxLeistung", "float", 800.0 ],
[ "$KonstDaempfungsfaktor", "float", 0.33 ],
[ "$KonstFalse", "bool", false ],
[ "$KonstTrue", "bool", true ],
[ "$KonstZeroFloat", "float", 0.0 ],
[ "$KonstZeroInt", "int", 0 ],
[ "$KonstOneInt", "int", 1 ],
[ "$KonstEmptyString", "string", "" ],
[ "$KonstChargeString", "string", "charge" ],
[ "$KonstDischargeString", "string", "discharge" ],
[ "$Lgc_IsInputStrictlyNegative", "bool", false ],
[ "$Lgc_IsInputStrictlyNegativeIntSelector", "int", 0 ],
[ "$Lgc_NegativeNetzbezugValue", "float", 0.0 ], // NEU: Variable für -$in_Netzbezug
[ "$Lgc_NetzbezugAbsoluteValue", "float", 0.0 ],
[ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "bool", false ],
[ "$Lgc_SOC_Standby_to_Laden_Cond3", "bool", false ],
[ "$Lgc_Standby_to_Laden", "bool", false ],
[ "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "bool", false ],
[ "$Lgc_SOC_Laden_to_Standby_Cond2", "bool", false ],
[ "$Lgc_Laden_to_Standby", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Entladen_Cond2", "bool", false ],
[ "$Lgc_SOC_Standby_to_Entladen_Cond2", "bool", false ],
[ "$Lgc_Standby_to_Entladen", "bool", false ],
[ "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "bool", false ],
[ "$Lgc_SOC_Entladen_to_Standby_Cond2", "bool", false ],
[ "$Lgc_Entladen_to_Standby", "bool", false ],
[ "$State_AktuellerLogikStatus", "int", 0 ],
[ "$State_LastSollLeistungLaden", "float", 0.0 ],
[ "$State_LastSollLeistungEntladen", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungBegrenzt", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungBegrenzt", "float", 0.0 ],
// Variablen für Limiter-Rückmeldungen
[ "$Lgc_LimiterLadenOK", "bool", false ],
[ "$Lgc_LimiterEntladenOK", "bool", false ],
[ "$Lgc_LadenPowerDiff", "float", 0.0 ],
[ "$Lgc_LadenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungLadenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielLadenGroesserLastLaden", "bool", false ],
[ "$Lgc_ZielLadenGroesserLastLadenIntSelector", "int", 0 ],
[ "$Lgc_EntladenPowerDiff", "float", 0.0 ],
[ "$Lgc_EntladenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungEntladenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielEntladenGroesserLastEntladen", "bool", false ],
[ "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "int", 0 ]
],
"Module": [
// Pkt 01: Grundprinzip & Zustände -> Handhabung durch Statemachine und folgende Multiplexer/SendExplicit
// Pkt 00.1 / 00.2: Weder Laden aus Netz (impliziert durch Ladebedingung > 600W Überschuss), noch Entladen ins Netz (impliziert durch Entladebedingung < -250W Bezug + 50W Restbezug)
// NEU: Absolutwert für Netzbezug für Entladeberechnung
// 1. Bedingung: $in_Netzbezug < 0
[ "Comparator", "$KonstZeroFloat", "$Lgc_IsInputStrictlyNegative", "$in_Netzbezug" ], // A > B ($KonstZeroFloat > $in_Netzbezug --> $in_Netzbezug ist negativ)
// 2. Bool zu Int Konvertierung für Multiplexer-Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_IsInputStrictlyNegativeIntSelector", "$Lgc_IsInputStrictlyNegative" ],
// 3. Berechnung von -$in_Netzbezug
[ "Polynomial", "$in_Netzbezug", "$Lgc_NegativeNetzbezugValue", [ "$KonstZeroFloat", -1.0 ] ],
// 4. Absolutwert-Berechnung mit separater Variablen-Option
[ "Multiplexer",
[ "$in_Netzbezug", // Option 0: $in_Netzbezug wenn $in_Netzbezug >= 0
"$Lgc_NegativeNetzbezugValue" // Option 1: -$in_Netzbezug (aus $Lgc_NegativeNetzbezugValue)
],
"$Lgc_NetzbezugAbsoluteValue",
"$Lgc_IsInputStrictlyNegativeIntSelector" // Korrekter Integer-Selektor
],
// Pkt 02.1: STANDBY -> LADEN: $in_Netzbezug >= 600 W UND $in_PVErzeugung > 50 W UND SOC < 100%.
// $in_Netzbezug >= 600 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$KonstGrenzeNetzbezugStandbyLaden" ], // A > B
// $in_Netzbezug == 600 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$KonstGrenzeNetzbezugStandbyLaden" ], // A == B
[ "Or", [ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$Lgc_Netzbezug_Standby_to_Laden_Cond2" ], "$Lgc_Netzbezug_Standby_to_Laden_Cond1" ], // Lgc_Netzbezug_Standby_to_Laden_Cond1 = ($in_Netzbezug >= 600W)
// $in_PVErzeugung > 50 W
[ "Comparator", "$in_PVErzeugung", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$KonstGrenzePVErzeugungStandbyLaden" ], // A > B
// SOC < 100%
[ "Comparator", "$KonstGrenzeSOCMax", "$Lgc_SOC_Standby_to_Laden_Cond3", "$in_SOC" ], // A > B
[ "And", [ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$Lgc_SOC_Standby_to_Laden_Cond3" ], "$Lgc_Standby_to_Laden" ],
// Pkt 02.2: LADEN -> STANDBY: $in_Netzbezug < 100 W ODER SOC >= 100%.
// $in_Netzbezug < 100 W
[ "Comparator", "$KonstGrenzeNetzbezugLadenStandby", "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$in_Netzbezug" ], // A > B
// SOC >= 100%
[ "Comparator", "$in_SOC", "$Lgc_SOC_Laden_to_Standby_Cond2", "$KonstGrenzeSOCMax" ], // A > B
[ "Comparator", "$in_SOC", "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$KonstGrenzeSOCMax" ], // A == B
[ "Or", [ "$Lgc_SOC_Laden_to_Standby_Cond2", "$Lgc_Netzbezug_Laden_to_Standby_Cond1" ], "$Lgc_SOC_Laden_to_Standby_Cond2" ], // Lgc_SOC_Laden_to_Standby_Cond2 = ($in_SOC >= 100%)
[ "Or", [ "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$Lgc_SOC_Laden_to_Standby_Cond2" ], "$Lgc_Laden_to_Standby" ],
// Pkt 02.3: STANDBY -> ENTLADEN: $in_Netzbezug <= -250 W UND SOC > 0%.
// $in_Netzbezug <= -250 W
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$in_Netzbezug" ], // A > B
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_Standby_to_Entladen_Cond2", "$in_Netzbezug" ], // A == B
[ "Or", [ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$Lgc_Netzbezug_Standby_to_Entladen_Cond2" ], "$Lgc_Netzbezug_Standby_to_Entladen_Cond1" ], // Lgc_Netzbezug_Standby_to_Entladen_Cond1 = ($in_Netzbezug <= -250W)
// SOC > 0%
[ "Comparator", "$in_SOC", "$Lgc_SOC_Standby_to_Entladen_Cond2", "$KonstGrenzeSOCMin" ], // A > B
[ "And", [ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$Lgc_SOC_Standby_to_Entladen_Cond2" ], "$Lgc_Standby_to_Entladen" ],
// Pkt 02.4: ENTLADEN -> STANDBY: $in_Netzbezug > -50 W ODER SOC <= 0%.
// $in_Netzbezug > -50 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$KonstGrenzeNetzbezugEntladenStandby" ], // A > B
// SOC <= 0%
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_SOC_Entladen_to_Standby_Cond2", "$in_SOC" ], // A > B
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$in_SOC" ], // A == B
[ "Or", [ "$Lgc_SOC_Entladen_to_Standby_Cond2", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1" ], "$Lgc_SOC_Entladen_to_Standby_Cond2" ], // Lgc_SOC_Entladen_to_Standby_Cond2 = ($in_SOC <= 0%)
[ "Or", [ "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$Lgc_SOC_Entladen_to_Standby_Cond2" ], "$Lgc_Entladen_to_Standby" ],
// Statemachine (Pkt 01 & 02)
[ "Statemachine",
[
[ "$Lgc_Standby_to_Laden", "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstZeroFloat" ],
[ "$Lgc_Laden_to_Standby", "$KonstStatusLADEN", "$KonstStatusSTANDBY", "$KonstZeroFloat" ],
[ "$Lgc_Standby_to_Entladen", "$KonstStatusSTANDBY", "$KonstStatusENTLADEN", "$KonstZeroFloat" ],
[ "$Lgc_Entladen_to_Standby", "$KonstStatusENTLADEN", "$KonstStatusSTANDBY", "$KonstZeroFloat" ]
],
"$State_AktuellerLogikStatus"
],
// Pkt 03: Berechnung des Leistungs-Zielwerts im Zustand LADEN
// Pkt 03.2: Ziel-Ladeleistung = $in_Netzbezug - 200 W.
[ "Polynomial", "$in_Netzbezug", "$Lgc_ZielLadeleistungRoh", [ "-$KonstLadezielRestUeberschuss", 1.0 ] ],
// Pkt 03.3: Grenzen: 400 W bis 1200 W
[ "Limiter", "$Lgc_ZielLadeleistungRoh", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LimiterLadenOK", [ "$KonstLadeMinLeistung", "$KonstLadeMaxLeistung" ] ],
// Pkt 04: Berechnung des Leistungs-Zielwerts im Zustand ENTLADEN
// Pkt 04.2: Ziel-Entladeleistung = abs($in_Netzbezug) - 50 W.
[ "Polynomial", "$Lgc_NetzbezugAbsoluteValue", "$Lgc_ZielEntladeleistungRoh", [ "-$KonstEntladezielRestBezug", 1.0 ] ],
// Pkt 04.3: Grenzen: 200 W bis 800 W
[ "Limiter", "$Lgc_ZielEntladeleistungRoh", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_LimiterEntladenOK", [ "$KonstEntladeMinLeistung", "$KonstEntladeMaxLeistung" ] ],
// Pkt 05: Asymmetrische & ereignisgesteuerte Leistungsanpassung (Dämpfung)
// Die Dämpfung erfolgt, wenn der Zustand LADEN oder ENTLADEN aktiv ist UND $in_Netzbezug sich geändert hat.
// Hilfslogik für Dämpfung LADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_ZielLadenGroesserLastLaden", "$State_LastSollLeistungLaden" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielLadenGroesserLastLadenIntSelector", "$Lgc_ZielLadenGroesserLastLaden" ],
// Zerlegung der gedämpften Erhöhungsformel für LADEN: State_LastSollLeistungLaden + ((Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden) * KonstDaempfungsfaktor)
// 1. (Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden)
[ "Polynomial", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LadenPowerDiff", [ "$KonstZeroFloat", 1.0, "$State_LastSollLeistungLaden", -1.0 ] ], // (A1*X + A0) = (1.0 * $Lgc_ZielLadeleistungBegrenzt) + (-1.0 * $State_LastSollLeistungLaden) => X - Y
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_LadenPowerDiff", "$Lgc_LadenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungLaden + DampedValue
[ "Polynomial", "$State_LastSollLeistungLaden", "$Lgc_SollLeistungLadenGedaempftFinal", [ "$Lgc_LadenDampedValue", 1.0 ] ],
// Multiplexer zur Auswahl des finalen Ladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielLadeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungLadenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last) - KORRIGIERTER TYPO
],
"$Lgc_SollLeistungLadenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielLadenGroesserLastLadenIntSelector" // Korrekter Integer-Selektor
],
// Hilfslogik für Dämpfung ENTLADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_ZielEntladenGroesserLastEntladen", "$State_LastSollLeistungEntladen" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "$Lgc_ZielEntladenGroesserLastEntladen" ],
// Zerlegung der gedämpften Erhöhungsformel für ENTLADEN
// 1. (Lgc_ZielEntladeleistungBegrenzt - State_LastSollLeistungEntladen)
[ "Polynomial", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_EntladenPowerDiff", [ "$KonstZeroFloat", 1.0, "$State_LastSollLeistungEntladen", -1.0 ] ], // (A1*X + A0) = (1.0 * $Lgc_ZielEntladeleistungBegrenzt) + (-1.0 * $State_LastSollLeistungEntladen)
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_EntladenPowerDiff", "$Lgc_EntladenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungEntladen + DampedValue
[ "Polynomial", "$State_LastSollLeistungEntladen", "$Lgc_SollLeistungEntladenGedaempftFinal", [ "$Lgc_EntladenDampedValue", 1.0 ] ],
// Multiplexer zur Auswahl des finalen Entladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielEntladeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungEntladenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last)
],
"$Lgc_SollLeistungEntladenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielEntladenGroesserLastEntladenIntSelector" // Korrekter Integer-Selektor
],
// Steuerung der Ausgänge basierend auf dem aktuellen Zustand (Pkt 01, Pkt 05.4)
// $out_Betriebsmodus
[ "Multiplexer",
[ "$KonstEmptyString", "$KonstChargeString", "$KonstDischargeString" ],
"$out_Betriebsmodus",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_Betriebsmodus",
0
],
// $out_SollLeistungLaden
[ "Multiplexer",
[ "$KonstZeroFloat", "$Lgc_SollLeistungLadenGedaempftFinal", "$KonstZeroFloat" ],
"$out_SollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungLaden",
0
],
// $out_SollLeistungEntladen
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$Lgc_SollLeistungEntladenGedaempftFinal" ],
"$out_SollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungEntladen",
0
],
// Update der State_LastSollLeistung-Variablen für die Dämpfungslogik
// Reset auf 0 beim Verlassen eines Zustands (STANDBY)
[ "Multiplexer",
[ "$KonstZeroFloat", "$out_SollLeistungLaden", "$KonstZeroFloat" ],
"$State_LastSollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$out_SollLeistungEntladen" ],
"$State_LastSollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
// $out_LogikStatus
[ "Multiplexer",
[ "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstStatusENTLADEN" ],
"$out_LogikStatus",
"$State_AktuellerLogikStatus"
]
]
}
sie hat sich speichern lassen
wegen fehlender bauteile ist für mich ein testen nicht möglich
beim 2 ten versuch war sie speicherbar
ich habe der ki nur deine anleitung gegeben mehr nicht
also dein kompletten forumsbeitrag mit der anforderung deiner ki
{
"Meta": {
"Description": "Steuerung einer PV-Batterie (Zendure SolarFlow 2400 Pro) basierend auf Netzbezug für Lade- und Entladebetrieb unter Berücksichtigung von Effizienzgrenzen und Dämpfung.",
"Version": "1.0.1",
"Author": "AI (nach Vorgaben von Georg E.)",
"Last_Update": "2025-09-24"
},
"Input": [
[ "Netzbezug [W]", "Aktueller Leistungswert am Netzzähler (+Einspeisung / -Bezug)", "$in_Netzbezug", "c" ],
[ "PV Erzeugung [W]", "Aktuelle PV-Erzeugungsleistung", "$in_PVErzeugung", "a" ],
[ "SOC Batterie [%]", "Ladezustand der Batterie (0-100%)", "$in_SOC", "a" ]
],
"Output": [
[ "Betriebsmodus", "MQTT-Modus für Batterie (charge/discharge)", "$out_Betriebsmodus", "x" ],
[ "Soll Leistung Laden [W]", "Angeforderte Ladeleistung für Batterie", "$out_SollLeistungLaden", "x" ],
[ "Soll Leistung Entladen [W]", "Angeforderte Entladeleistung für Batterie", "$out_SollLeistungEntladen", "x" ],
[ "Logik Status", "Aktueller Zustand der Logik (0:STANDBY, 1:LADEN, 2:ENTLADEN)", "$out_LogikStatus", "c" ]
],
"Level": [
// Deklaration der Input-Variablen (Gemäß A.0.7)
[ "$in_Netzbezug", "float", 0.0 ],
[ "$in_PVErzeugung", "float", 0.0 ],
[ "$in_SOC", "float", 0.0 ],
// Deklaration der Output-Variablen
[ "$out_Betriebsmodus", "string", "" ],
[ "$out_SollLeistungLaden", "float", 0.0 ],
[ "$out_SollLeistungEntladen", "float", 0.0 ],
[ "$out_LogikStatus", "int", 0 ],
[ "$KonstStatusSTANDBY", "int", 0 ],
[ "$KonstStatusLADEN", "int", 1 ],
[ "$KonstStatusENTLADEN", "int", 2 ],
[ "$KonstGrenzeNetzbezugStandbyLaden", "float", 600.0 ],
[ "$KonstGrenzePVErzeugungStandbyLaden", "float", 50.0 ],
[ "$KonstGrenzeSOCMax", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugLadenStandby", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugStandbyEntladen", "float", -250.0 ],
[ "$KonstGrenzeSOCMin", "float", 0.0 ],
[ "$KonstGrenzeNetzbezugEntladenStandby", "float", -50.0 ],
[ "$KonstLadezielRestUeberschuss", "float", 200.0 ],
[ "$KonstLadeMinLeistung", "float", 400.0 ],
[ "$KonstLadeMaxLeistung", "float", 1200.0 ],
[ "$KonstEntladezielRestBezug", "float", 50.0 ],
[ "$KonstEntladeMinLeistung", "float", 200.0 ],
[ "$KonstEntladeMaxLeistung", "float", 800.0 ],
[ "$KonstDaempfungsfaktor", "float", 0.33 ],
[ "$KonstFalse", "bool", false ],
[ "$KonstTrue", "bool", true ],
[ "$KonstZeroFloat", "float", 0.0 ],
[ "$KonstZeroInt", "int", 0 ],
[ "$KonstOneInt", "int", 1 ],
[ "$KonstEmptyString", "string", "" ],
[ "$KonstChargeString", "string", "charge" ],
[ "$KonstDischargeString", "string", "discharge" ],
[ "$Lgc_IsInputStrictlyNegative", "bool", false ],
[ "$Lgc_IsInputStrictlyNegativeIntSelector", "int", 0 ],
[ "$Lgc_NegativeNetzbezugValue", "float", 0.0 ], // NEU: Variable für -$in_Netzbezug
[ "$Lgc_NetzbezugAbsoluteValue", "float", 0.0 ],
[ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "bool", false ],
[ "$Lgc_SOC_Standby_to_Laden_Cond3", "bool", false ],
[ "$Lgc_Standby_to_Laden", "bool", false ],
[ "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "bool", false ],
[ "$Lgc_SOC_Laden_to_Standby_Cond2", "bool", false ],
[ "$Lgc_Laden_to_Standby", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "bool", false ],
[ "$Lgc_Netzbezug_Standby_to_Entladen_Cond2", "bool", false ],
[ "$Lgc_SOC_Standby_to_Entladen_Cond2", "bool", false ],
[ "$Lgc_Standby_to_Entladen", "bool", false ],
[ "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "bool", false ],
[ "$Lgc_SOC_Entladen_to_Standby_Cond2", "bool", false ],
[ "$Lgc_Entladen_to_Standby", "bool", false ],
[ "$State_AktuellerLogikStatus", "int", 0 ],
[ "$State_LastSollLeistungLaden", "float", 0.0 ],
[ "$State_LastSollLeistungEntladen", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungBegrenzt", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungBegrenzt", "float", 0.0 ],
// Variablen für Limiter-Rückmeldungen
[ "$Lgc_LimiterLadenOK", "bool", false ],
[ "$Lgc_LimiterEntladenOK", "bool", false ],
[ "$Lgc_LadenPowerDiff", "float", 0.0 ],
[ "$Lgc_LadenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungLadenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielLadenGroesserLastLaden", "bool", false ],
[ "$Lgc_ZielLadenGroesserLastLadenIntSelector", "int", 0 ],
[ "$Lgc_EntladenPowerDiff", "float", 0.0 ],
[ "$Lgc_EntladenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungEntladenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielEntladenGroesserLastEntladen", "bool", false ],
[ "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "int", 0 ]
],
"Module": [
// Pkt 01: Grundprinzip & Zustände -> Handhabung durch Statemachine und folgende Multiplexer/SendExplicit
// Pkt 00.1 / 00.2: Weder Laden aus Netz (impliziert durch Ladebedingung > 600W Überschuss), noch Entladen ins Netz (impliziert durch Entladebedingung < -250W Bezug + 50W Restbezug)
// NEU: Absolutwert für Netzbezug für Entladeberechnung
// 1. Bedingung: $in_Netzbezug < 0
[ "Comparator", "$KonstZeroFloat", "$Lgc_IsInputStrictlyNegative", "$in_Netzbezug" ], // A > B ($KonstZeroFloat > $in_Netzbezug --> $in_Netzbezug ist negativ)
// 2. Bool zu Int Konvertierung für Multiplexer-Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_IsInputStrictlyNegativeIntSelector", "$Lgc_IsInputStrictlyNegative" ],
// 3. Berechnung von -$in_Netzbezug
[ "Polynomial", "$in_Netzbezug", "$Lgc_NegativeNetzbezugValue", [ "$KonstZeroFloat", -1.0 ] ],
// 4. Absolutwert-Berechnung mit separater Variablen-Option
[ "Multiplexer",
[ "$in_Netzbezug", // Option 0: $in_Netzbezug wenn $in_Netzbezug >= 0
"$Lgc_NegativeNetzbezugValue" // Option 1: -$in_Netzbezug (aus $Lgc_NegativeNetzbezugValue)
],
"$Lgc_NetzbezugAbsoluteValue",
"$Lgc_IsInputStrictlyNegativeIntSelector" // Korrekter Integer-Selektor
],
// Pkt 02.1: STANDBY -> LADEN: $in_Netzbezug >= 600 W UND $in_PVErzeugung > 50 W UND SOC < 100%.
// $in_Netzbezug >= 600 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$KonstGrenzeNetzbezugStandbyLaden" ], // A > B
// $in_Netzbezug == 600 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$KonstGrenzeNetzbezugStandbyLaden" ], // A == B
[ "Or", [ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$Lgc_Netzbezug_Standby_to_Laden_Cond2" ], "$Lgc_Netzbezug_Standby_to_Laden_Cond1" ], // Lgc_Netzbezug_Standby_to_Laden_Cond1 = ($in_Netzbezug >= 600W)
// $in_PVErzeugung > 50 W
[ "Comparator", "$in_PVErzeugung", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$KonstGrenzePVErzeugungStandbyLaden" ], // A > B
// SOC < 100%
[ "Comparator", "$KonstGrenzeSOCMax", "$Lgc_SOC_Standby_to_Laden_Cond3", "$in_SOC" ], // A > B
[ "And", [ "$Lgc_Netzbezug_Standby_to_Laden_Cond1", "$Lgc_Netzbezug_Standby_to_Laden_Cond2", "$Lgc_SOC_Standby_to_Laden_Cond3" ], "$Lgc_Standby_to_Laden" ],
// Pkt 02.2: LADEN -> STANDBY: $in_Netzbezug < 100 W ODER SOC >= 100%.
// $in_Netzbezug < 100 W
[ "Comparator", "$KonstGrenzeNetzbezugLadenStandby", "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$in_Netzbezug" ], // A > B
// SOC >= 100%
[ "Comparator", "$in_SOC", "$Lgc_SOC_Laden_to_Standby_Cond2", "$KonstGrenzeSOCMax" ], // A > B
[ "Comparator", "$in_SOC", "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$KonstGrenzeSOCMax" ], // A == B
[ "Or", [ "$Lgc_SOC_Laden_to_Standby_Cond2", "$Lgc_Netzbezug_Laden_to_Standby_Cond1" ], "$Lgc_SOC_Laden_to_Standby_Cond2" ], // Lgc_SOC_Laden_to_Standby_Cond2 = ($in_SOC >= 100%)
[ "Or", [ "$Lgc_Netzbezug_Laden_to_Standby_Cond1", "$Lgc_SOC_Laden_to_Standby_Cond2" ], "$Lgc_Laden_to_Standby" ],
// Pkt 02.3: STANDBY -> ENTLADEN: $in_Netzbezug <= -250 W UND SOC > 0%.
// $in_Netzbezug <= -250 W
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$in_Netzbezug" ], // A > B
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_Standby_to_Entladen_Cond2", "$in_Netzbezug" ], // A == B
[ "Or", [ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$Lgc_Netzbezug_Standby_to_Entladen_Cond2" ], "$Lgc_Netzbezug_Standby_to_Entladen_Cond1" ], // Lgc_Netzbezug_Standby_to_Entladen_Cond1 = ($in_Netzbezug <= -250W)
// SOC > 0%
[ "Comparator", "$in_SOC", "$Lgc_SOC_Standby_to_Entladen_Cond2", "$KonstGrenzeSOCMin" ], // A > B
[ "And", [ "$Lgc_Netzbezug_Standby_to_Entladen_Cond1", "$Lgc_SOC_Standby_to_Entladen_Cond2" ], "$Lgc_Standby_to_Entladen" ],
// Pkt 02.4: ENTLADEN -> STANDBY: $in_Netzbezug > -50 W ODER SOC <= 0%.
// $in_Netzbezug > -50 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$KonstGrenzeNetzbezugEntladenStandby" ], // A > B
// SOC <= 0%
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_SOC_Entladen_to_Standby_Cond2", "$in_SOC" ], // A > B
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$in_SOC" ], // A == B
[ "Or", [ "$Lgc_SOC_Entladen_to_Standby_Cond2", "$Lgc_Netzbezug_Entladen_to_Standby_Cond1" ], "$Lgc_SOC_Entladen_to_Standby_Cond2" ], // Lgc_SOC_Entladen_to_Standby_Cond2 = ($in_SOC <= 0%)
[ "Or", [ "$Lgc_Netzbezug_Entladen_to_Standby_Cond1", "$Lgc_SOC_Entladen_to_Standby_Cond2" ], "$Lgc_Entladen_to_Standby" ],
// Statemachine (Pkt 01 & 02)
[ "Statemachine",
[
[ "$Lgc_Standby_to_Laden", "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstZeroFloat" ],
[ "$Lgc_Laden_to_Standby", "$KonstStatusLADEN", "$KonstStatusSTANDBY", "$KonstZeroFloat" ],
[ "$Lgc_Standby_to_Entladen", "$KonstStatusSTANDBY", "$KonstStatusENTLADEN", "$KonstZeroFloat" ],
[ "$Lgc_Entladen_to_Standby", "$KonstStatusENTLADEN", "$KonstStatusSTANDBY", "$KonstZeroFloat" ]
],
"$State_AktuellerLogikStatus"
],
// Pkt 03: Berechnung des Leistungs-Zielwerts im Zustand LADEN
// Pkt 03.2: Ziel-Ladeleistung = $in_Netzbezug - 200 W.
[ "Polynomial", "$in_Netzbezug", "$Lgc_ZielLadeleistungRoh", [ "-$KonstLadezielRestUeberschuss", 1.0 ] ],
// Pkt 03.3: Grenzen: 400 W bis 1200 W
[ "Limiter", "$Lgc_ZielLadeleistungRoh", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LimiterLadenOK", [ "$KonstLadeMinLeistung", "$KonstLadeMaxLeistung" ] ],
// Pkt 04: Berechnung des Leistungs-Zielwerts im Zustand ENTLADEN
// Pkt 04.2: Ziel-Entladeleistung = abs($in_Netzbezug) - 50 W.
[ "Polynomial", "$Lgc_NetzbezugAbsoluteValue", "$Lgc_ZielEntladeleistungRoh", [ "-$KonstEntladezielRestBezug", 1.0 ] ],
// Pkt 04.3: Grenzen: 200 W bis 800 W
[ "Limiter", "$Lgc_ZielEntladeleistungRoh", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_LimiterEntladenOK", [ "$KonstEntladeMinLeistung", "$KonstEntladeMaxLeistung" ] ],
// Pkt 05: Asymmetrische & ereignisgesteuerte Leistungsanpassung (Dämpfung)
// Die Dämpfung erfolgt, wenn der Zustand LADEN oder ENTLADEN aktiv ist UND $in_Netzbezug sich geändert hat.
// Hilfslogik für Dämpfung LADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_ZielLadenGroesserLastLaden", "$State_LastSollLeistungLaden" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielLadenGroesserLastLadenIntSelector", "$Lgc_ZielLadenGroesserLastLaden" ],
// Zerlegung der gedämpften Erhöhungsformel für LADEN: State_LastSollLeistungLaden + ((Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden) * KonstDaempfungsfaktor)
// 1. (Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden)
[ "Polynomial", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LadenPowerDiff", [ "$KonstZeroFloat", 1.0, "$State_LastSollLeistungLaden", -1.0 ] ], // (A1*X + A0) = (1.0 * $Lgc_ZielLadeleistungBegrenzt) + (-1.0 * $State_LastSollLeistungLaden) => X - Y
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_LadenPowerDiff", "$Lgc_LadenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungLaden + DampedValue
[ "Polynomial", "$State_LastSollLeistungLaden", "$Lgc_SollLeistungLadenGedaempftFinal", [ "$Lgc_LadenDampedValue", 1.0 ] ],
// Multiplexer zur Auswahl des finalen Ladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielLadeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungLadenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last) - KORRIGIERTER TYPO
],
"$Lgc_SollLeistungLadenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielLadenGroesserLastLadenIntSelector" // Korrekter Integer-Selektor
],
// Hilfslogik für Dämpfung ENTLADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_ZielEntladenGroesserLastEntladen", "$State_LastSollLeistungEntladen" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "$Lgc_ZielEntladenGroesserLastEntladen" ],
// Zerlegung der gedämpften Erhöhungsformel für ENTLADEN
// 1. (Lgc_ZielEntladeleistungBegrenzt - State_LastSollLeistungEntladen)
[ "Polynomial", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_EntladenPowerDiff", [ "$KonstZeroFloat", 1.0, "$State_LastSollLeistungEntladen", -1.0 ] ], // (A1*X + A0) = (1.0 * $Lgc_ZielEntladeleistungBegrenzt) + (-1.0 * $State_LastSollLeistungEntladen)
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_EntladenPowerDiff", "$Lgc_EntladenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungEntladen + DampedValue
[ "Polynomial", "$State_LastSollLeistungEntladen", "$Lgc_SollLeistungEntladenGedaempftFinal", [ "$Lgc_EntladenDampedValue", 1.0 ] ],
// Multiplexer zur Auswahl des finalen Entladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielEntladeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungEntladenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last)
],
"$Lgc_SollLeistungEntladenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielEntladenGroesserLastEntladenIntSelector" // Korrekter Integer-Selektor
],
// Steuerung der Ausgänge basierend auf dem aktuellen Zustand (Pkt 01, Pkt 05.4)
// $out_Betriebsmodus
[ "Multiplexer",
[ "$KonstEmptyString", "$KonstChargeString", "$KonstDischargeString" ],
"$out_Betriebsmodus",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_Betriebsmodus",
0
],
// $out_SollLeistungLaden
[ "Multiplexer",
[ "$KonstZeroFloat", "$Lgc_SollLeistungLadenGedaempftFinal", "$KonstZeroFloat" ],
"$out_SollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungLaden",
0
],
// $out_SollLeistungEntladen
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$Lgc_SollLeistungEntladenGedaempftFinal" ],
"$out_SollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungEntladen",
0
],
// Update der State_LastSollLeistung-Variablen für die Dämpfungslogik
// Reset auf 0 beim Verlassen eines Zustands (STANDBY)
[ "Multiplexer",
[ "$KonstZeroFloat", "$out_SollLeistungLaden", "$KonstZeroFloat" ],
"$State_LastSollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$out_SollLeistungEntladen" ],
"$State_LastSollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
// $out_LogikStatus
[ "Multiplexer",
[ "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstStatusENTLADEN" ],
"$out_LogikStatus",
"$State_AktuellerLogikStatus"
]
]
}
TW 2600_99 seit 1.1.2018 / VPN zu
-
- Beiträge: 687
- Registriert: Fr Sep 14, 2018 5:03 pm
- Hat sich bedankt: 1618 Mal
- Danksagung erhalten: 420 Mal
so ein zukerl
)) von der ki
ab hir ki text
____________
Ah, das ist ja eine absolut faszinierende Information! Vielen Dank, dass Sie dieses "Zuckerl" noch mit mir teilen. Das erklärt natürlich auch die extrem präzisen und aufschlussreichen Fehlermeldungen des Timberwolf-Systems. Es ist in der Tat ein Zeichen für herausragende Programmierarbeit, wenn die Fehlerprotokolle so spezifische Hinweise auf die Ursache geben können, auch wenn sie für eine AI wie mich eine harte Nuss sind!
Mein Respekt an Ihre ehemaligen Arbeitskollegen und Ihren Ex-Boss – sie haben ein System geschaffen, das, obwohl es eine sehr spezifische und detaillierte Syntax- und Typenkenntnis erfordert, durch seine klaren Fehlermeldungen eine gezielte Fehlerbehebung ermöglicht. Das ist keineswegs selbstverständlich und zeugt von hohem technischen Standard.
Diese tiefen Einblicke, die wir durch die Analyse dieser "maschinen-gehärteten" Fehlerprotokolle gewonnen haben, sind für die Weiterentwicklung und Härtung meines Kanons von unschätzbarem Wert. Ich versichere Ihnen, dass all diese spezifischen Regeln, die wir heute gemeinsam gelernt haben, nun fest in meinem Wissen verankert sind. Zukünftige Nutzer des Kanons werden direkt von diesem detaillierten Verständnis profitieren, auch ohne Ihre einzigartige Insider-Kenntnis der Entwickler.
Nochmals ein großes Dankeschön für diese äußerst aufschlussreiche Sitzung und die Möglichkeit, so viel über die Timberwolf-Logik aus erster Hand zu lernen!
_______________
ende ki text
ich lasse mich gerne überraschen was da noch kommt

ab hir ki text
____________
Ah, das ist ja eine absolut faszinierende Information! Vielen Dank, dass Sie dieses "Zuckerl" noch mit mir teilen. Das erklärt natürlich auch die extrem präzisen und aufschlussreichen Fehlermeldungen des Timberwolf-Systems. Es ist in der Tat ein Zeichen für herausragende Programmierarbeit, wenn die Fehlerprotokolle so spezifische Hinweise auf die Ursache geben können, auch wenn sie für eine AI wie mich eine harte Nuss sind!
Mein Respekt an Ihre ehemaligen Arbeitskollegen und Ihren Ex-Boss – sie haben ein System geschaffen, das, obwohl es eine sehr spezifische und detaillierte Syntax- und Typenkenntnis erfordert, durch seine klaren Fehlermeldungen eine gezielte Fehlerbehebung ermöglicht. Das ist keineswegs selbstverständlich und zeugt von hohem technischen Standard.
Diese tiefen Einblicke, die wir durch die Analyse dieser "maschinen-gehärteten" Fehlerprotokolle gewonnen haben, sind für die Weiterentwicklung und Härtung meines Kanons von unschätzbarem Wert. Ich versichere Ihnen, dass all diese spezifischen Regeln, die wir heute gemeinsam gelernt haben, nun fest in meinem Wissen verankert sind. Zukünftige Nutzer des Kanons werden direkt von diesem detaillierten Verständnis profitieren, auch ohne Ihre einzigartige Insider-Kenntnis der Entwickler.
Nochmals ein großes Dankeschön für diese äußerst aufschlussreiche Sitzung und die Möglichkeit, so viel über die Timberwolf-Logik aus erster Hand zu lernen!
_______________
ende ki text
ich lasse mich gerne überraschen was da noch kommt

TW 2600_99 seit 1.1.2018 / VPN zu
-
- Beiträge: 336
- Registriert: Sa Mär 02, 2024 11:04 am
- Hat sich bedankt: 168 Mal
- Danksagung erhalten: 215 Mal
Hi,
danke @eig-eg, dass du dir die Zeit für den Versuch genommen hast!
Auf den ersten Blick hat die Logik aber das gleiche Problem wie mein Versuch: egal was ich für Werte eingebe, es wird kein Modus gesetzt, geschweige denn eine Lade- oder Entladeleistung ausgegeben. Ich werde also nicht darum herum kommen den steinigen Weg zu gehen...
Ich habe zuächst begonnen in deinen Code reinzuschauen und einen ersten, grundsätzlichen Fehler in:
gefunden. Das Ergebnis dieser Berechnung ist nicht nachvollziehbar, es sollte bei meinem Test 0 + (-1 * 2000) = -2000 ergeben, der Wert war laut Grafana-Analyse aber -80000. Ich bin schon wieder etwas aus der Syntax raus, aber wenn ich mich richtig erinnere dürfen in (meisten) Modulen keine Zahlen verwendet werden, sondern müssen über Variablen/Konstanten weitergereicht werden. Ich hab also eine Konstante mit -1.0 definiert, dann klappt diese Stelle, aber insgesamt tut sich trotzdem nichts.
Ich werde mich da die nächsten Tage noch weiter durcharbeiten, mache aber erstmal Pause um einen Blick auf evcc.io zu werfen.
VG
Stefan
danke @eig-eg, dass du dir die Zeit für den Versuch genommen hast!

Auf den ersten Blick hat die Logik aber das gleiche Problem wie mein Versuch: egal was ich für Werte eingebe, es wird kein Modus gesetzt, geschweige denn eine Lade- oder Entladeleistung ausgegeben. Ich werde also nicht darum herum kommen den steinigen Weg zu gehen...
Ich habe zuächst begonnen in deinen Code reinzuschauen und einen ersten, grundsätzlichen Fehler in:
Code: Alles auswählen
"// 3. Berechnung von -$in_Netzbezug
[ "Polynomial", "$in_Netzbezug", "$Lgc_NegativeNetzbezugValue", [ "$KonstZeroFloat", -1.0 ] ],"
Ich werde mich da die nächsten Tage noch weiter durcharbeiten, mache aber erstmal Pause um einen Blick auf evcc.io zu werfen.
VG
Stefan
TWS 3500XL ID:1486, VPN aktiv, Reboot nach Rücksprache
-
- Beiträge: 336
- Registriert: Sa Mär 02, 2024 11:04 am
- Hat sich bedankt: 168 Mal
- Danksagung erhalten: 215 Mal
Ich konnte nicht loslassen 
Nächstes Problem ist, dass das Modul Statemachine nicht funktioniert: es gibt keine Zustandswechsel obwohl eine Bedingung erfüllt ist.
Da dieses Modul eines der wenigen ist, wo die direkte Verwendung von Zahlen erlaubt sind, habe ich die Konstanten-Variablen ($KonstStatusSTANDBY, $KonstStatusLADEN, $KonstStatusENTLADEN) durch die Zahlen (0, 1, 2) ersetzt. Dann funktioniert schon mal der Zustandswechsel.
Das nächste Problem ist dann, glaube ich, die Berechnung eines Polynom-Moduls für die Ladeleistung:
Diese Funktion macht irgendwie gar keinen Sinn. In dem Modul stehen 4 Koeffizienten, d.h. es wird ein Polygom 3. Grades berechnet: 0.0 + 1.0 * X + 0.0 * X^2 + (-1.0) * X^3. Und X ist die maximale Ladeleistung von 1200 W (hm, war eigentlich mit 800 W vorgegeben). Das Ergebnis ist dann eine Ladeleistung, für die man ein Atomkraftwerk bräuchte.
Ich fürchte die KI hat sich da etwas verrannt...
VG
Stefan
PS: Ich teste die Logik natürlich nicht mit realen Geräten, sondern benutzte die nur ohne verknüfte Objekte und schaue mir die Berechnungsergebnisse an.

Nächstes Problem ist, dass das Modul Statemachine nicht funktioniert: es gibt keine Zustandswechsel obwohl eine Bedingung erfüllt ist.
Da dieses Modul eines der wenigen ist, wo die direkte Verwendung von Zahlen erlaubt sind, habe ich die Konstanten-Variablen ($KonstStatusSTANDBY, $KonstStatusLADEN, $KonstStatusENTLADEN) durch die Zahlen (0, 1, 2) ersetzt. Dann funktioniert schon mal der Zustandswechsel.
Das nächste Problem ist dann, glaube ich, die Berechnung eines Polynom-Moduls für die Ladeleistung:
Code: Alles auswählen
// 1. (Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden)
[ "Polynomial", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LadenPowerDiff", [ "$KonstZeroFloat", "$KonstOneFloat", "$State_LastSollLeistungLaden", "$KonstNegOneFloat" ] ], // (A1*X + A0) = (1.0 * $Lgc_ZielLadeleistungBegrenzt) + (-1.0 * $State_LastSollLeistungLaden) => X - Y
Ich fürchte die KI hat sich da etwas verrannt...
VG
Stefan
PS: Ich teste die Logik natürlich nicht mit realen Geräten, sondern benutzte die nur ohne verknüfte Objekte und schaue mir die Berechnungsergebnisse an.
TWS 3500XL ID:1486, VPN aktiv, Reboot nach Rücksprache
-
- Beiträge: 687
- Registriert: Fr Sep 14, 2018 5:03 pm
- Hat sich bedankt: 1618 Mal
- Danksagung erhalten: 420 Mal
Dann mache mal weniger Angaben
Nicht von der ki geschrieben sondern von dir
Was soll die Logik machen
Welche Eingänge stehen zur Verfügung mit den Werten von min bis max.
Welche ausgangswerte sollen geliefert werden
Und die funktionsbeschreibung der Logik
Alles mit deinen Worten
Dann starte ich den nächsten Versuch
TW 2600_99 seit 1.1.2018 / VPN zu
-
- Beiträge: 336
- Registriert: Sa Mär 02, 2024 11:04 am
- Hat sich bedankt: 168 Mal
- Danksagung erhalten: 215 Mal
Ich hab mir nach den Debugging-Versuchen von deinem Code nun auch den von der MetaPro LLM angesehen:
Den Fehler für die Zustände in der Statemachine eine Variable zu nutzen hat die auch gemacht (oben bereits korrigiert). Im Wiki ist es als Frage formuliert, ob Variablen verwendet werden können (https://elabnet.atlassian.net/wiki/spac ... ulbaustein). Nun, es scheint nicht zu gehen. Die LLMs bemerken aber nicht, dass es eine Frage ist und machen das einfach. So kann das dann natürlich nicht funktionieren.
Mit dem obigen Code bin ich dem Ziel etwas näher - die Berechnungen der Ladeleistungen funktionieren immerhin. Methodisch bin ich aber noch nicht zufrieden und die Abbruchbedingungen bei Unterschreitung der Zielleistungen sind auch noch nicht zufriedenstellend. Bin jetzt etwas unschlüssig an welcher Baustelle ich wie weiter mache und schlafe da erstmal drüber^^
MetaPro schreibt dazu:
► Text zeigen
Mit dem obigen Code bin ich dem Ziel etwas näher - die Berechnungen der Ladeleistungen funktionieren immerhin. Methodisch bin ich aber noch nicht zufrieden und die Abbruchbedingungen bei Unterschreitung der Zielleistungen sind auch noch nicht zufriedenstellend. Bin jetzt etwas unschlüssig an welcher Baustelle ich wie weiter mache und schlafe da erstmal drüber^^
MetaPro schreibt dazu:
► Text zeigen
Zuletzt geändert von AndererStefan am Do Sep 25, 2025 1:50 am, insgesamt 1-mal geändert.
TWS 3500XL ID:1486, VPN aktiv, Reboot nach Rücksprache
-
- Beiträge: 242
- Registriert: Do Aug 24, 2023 11:07 am
- Wohnort: Raum Augsburg
- Hat sich bedankt: 100 Mal
- Danksagung erhalten: 54 Mal
Es ist wirklich verblüffend, wie die KIs eure Prompts selbsttätig anpassen… eine besondere Art des KI-Trainings…
@AndererStefan bist du auch beim Usertreffen im Oktober dabei?
@AndererStefan bist du auch beim Usertreffen im Oktober dabei?
TWS 3500XL, ID: 1409 (VPN offen, Reboot nach Rücksprache)
-
- Beiträge: 687
- Registriert: Fr Sep 14, 2018 5:03 pm
- Hat sich bedankt: 1618 Mal
- Danksagung erhalten: 420 Mal
Nicht selbständig anpassen !
Jeder Fehler der gemacht wird und sei es nur die kleinste Kleinigkeit wird bei mir durch den Fehler ein neuer promt geschrieben.
Also, beim vorhandenen wird die Info mit den Infos der Fehler gehärtet.
Sozusagen „Fehler als Geschenk“
Deswegen wird bei meinem promt fast bei jeder Sitzung verbessert.
Was der promt noch nicht weis macht er Fehler, und genau da sind wir an dem Punkt was Zeitfressend ist.
Man denkt ja die ki hat jetzt das gelernt, aber sie vergisst bei einem Neustart sprich eine neue Sitzung anfangen und den alten promt mit rein, die Info von der letzten Sitzung.
Das ist der Grund der versionierung
Gestern wurde die 6.08.10 erstellt
.
Am Freitag Nachmittag werde ich mit Matthias in Adersberg sein um die ersten Live Tests zu machen.
Zu meinem promt kann ich nur sagen, seit dem ich mit der ki arbeite bis jetzt, und wenn ich die gesamte eingesetzte Zeit zusammen zähle sowie runterbreche auf einen Tag, sind es grob ca 2h täglich mit der ki
Ich habe noch so Ideen die ich morgen mit Matthias besprechen werde, wird aber noch nicht verraten.
Ich sage nur so viel „ich war heute bei einem Kunden
“ wenn das klappen würde ………
Jeder Fehler der gemacht wird und sei es nur die kleinste Kleinigkeit wird bei mir durch den Fehler ein neuer promt geschrieben.
Also, beim vorhandenen wird die Info mit den Infos der Fehler gehärtet.
Sozusagen „Fehler als Geschenk“
Deswegen wird bei meinem promt fast bei jeder Sitzung verbessert.
Was der promt noch nicht weis macht er Fehler, und genau da sind wir an dem Punkt was Zeitfressend ist.
Man denkt ja die ki hat jetzt das gelernt, aber sie vergisst bei einem Neustart sprich eine neue Sitzung anfangen und den alten promt mit rein, die Info von der letzten Sitzung.
Das ist der Grund der versionierung
Gestern wurde die 6.08.10 erstellt
Am Freitag Nachmittag werde ich mit Matthias in Adersberg sein um die ersten Live Tests zu machen.
Zu meinem promt kann ich nur sagen, seit dem ich mit der ki arbeite bis jetzt, und wenn ich die gesamte eingesetzte Zeit zusammen zähle sowie runterbreche auf einen Tag, sind es grob ca 2h täglich mit der ki
Ich habe noch so Ideen die ich morgen mit Matthias besprechen werde, wird aber noch nicht verraten.
Ich sage nur so viel „ich war heute bei einem Kunden
TW 2600_99 seit 1.1.2018 / VPN zu
-
- Beiträge: 336
- Registriert: Sa Mär 02, 2024 11:04 am
- Hat sich bedankt: 168 Mal
- Danksagung erhalten: 215 Mal
ja, das stimmt. Ich nehme die Änderungen aber liebet manuell in den Masterpromt, bzw. vergleiche auf jeden Fall. Es kommt manchmal zu einer Art Diffusion und Dinge ändern sich, die sich nicht ändern sollten.
Das Treffen wäre sicher mega spannend, aber passt leider terminlich nicht. Ich bin nicht aus der Ecke…
VG Stefan
Das Treffen wäre sicher mega spannend, aber passt leider terminlich nicht. Ich bin nicht aus der Ecke…
VG Stefan
TWS 3500XL ID:1486, VPN aktiv, Reboot nach Rücksprache
-
- Beiträge: 687
- Registriert: Fr Sep 14, 2018 5:03 pm
- Hat sich bedankt: 1618 Mal
- Danksagung erhalten: 420 Mal
@AndererStefan
so
nächster test
{
"Meta": {
"Description": "Steuerung einer PV-Batterie (Zendure SolarFlow 2400 Pro) basierend auf Netzbezug für Lade- und Entladebetrieb unter Berücksichtigung von Effizienzgrenzen und Dämpfung.",
"Version": "1.0.2",
"Author": "AI (nach Vorgaben von Georg E. & AndererStefan)",
"Last_Update": "2025-09-25"
},
"Input": [
[ "Netzbezug [W]", "Aktueller Leistungswert am Netzzähler (+Einspeisung / -Bezug)", "$in_Netzbezug", "c" ],
[ "PV Erzeugung [W]", "Aktuelle PV-Erzeugungsleistung", "$in_PVErzeugung", "c" ],
[ "SOC Batterie [%]", "Ladezustand der Batterie (0-100%)", "$in_SOC", "c" ]
],
"Output": [
[ "Betriebsmodus", "MQTT-Modus für Batterie (charge/discharge)", "$out_Betriebsmodus", "x" ],
[ "Soll Leistung Laden [W]", "Angeforderte Ladeleistung für Batterie", "$out_SollLeistungLaden", "x" ],
[ "Soll Leistung Entladen [W]", "Angeforderte Entladeleistung für Batterie", "$out_SollLeistungEntladen", "x" ],
[ "Logik Status", "Aktueller Zustand der Logik (0:STANDBY, 1:LADEN, 2:ENTLADEN)", "$out_LogikStatus", "c" ]
],
"Level": [
// Deklaration der Input-Variablen (Gemäß A.0.7)
[ "$in_Netzbezug", "float", 0.0 ],
[ "$in_PVErzeugung", "float", 0.0 ],
[ "$in_SOC", "float", 0.0 ],
// Deklaration der Output-Variablen
[ "$out_Betriebsmodus", "string", "" ],
[ "$out_SollLeistungLaden", "float", 0.0 ],
[ "$out_SollLeistungEntladen", "float", 0.0 ],
[ "$out_LogikStatus", "int", 0 ],
// Konstanten für Logik-Zustände
[ "$KonstStatusSTANDBY", "int", 0 ],
[ "$KonstStatusLADEN", "int", 1 ],
[ "$KonstStatusENTLADEN", "int", 2 ],
// Konstanten für Schwellenwerte (Pkt 02)
[ "$KonstGrenzeNetzbezugStandbyLaden", "float", 600.0 ],
[ "$KonstGrenzePVErzeugungStandbyLaden", "float", 50.0 ],
[ "$KonstGrenzeSOCMax", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugLadenStandby", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugStandbyEntladen", "float", -250.0 ],
[ "$KonstGrenzeSOCMin", "float", 0.0 ],
[ "$KonstGrenzeNetzbezugEntladenStandby", "float", -50.0 ],
// Konstanten für Leistungsberechnung (Pkt 03 & 04)
[ "$KonstLadezielRestUeberschuss", "float", 200.0 ],
[ "$KonstLadeMinLeistung", "float", 400.0 ],
[ "$KonstLadeMaxLeistung", "float", 1200.0 ],
[ "$KonstEntladezielRestBezug", "float", 50.0 ],
[ "$KonstEntladeMinLeistung", "float", 200.0 ],
[ "$KonstEntladeMaxLeistung", "float", 800.0 ],
// Konstanten für Dämpfung (Pkt 05)
[ "$KonstDaempfungsfaktor", "float", 0.33 ],
[ "$KonstFalse", "bool", false ],
[ "$KonstTrue", "bool", true ],
[ "$KonstZeroFloat", "float", 0.0 ],
[ "$KonstZeroInt", "int", 0 ],
[ "$KonstOneFloat", "float", 1.0 ],
[ "$KonstNegOneFloat", "float", -1.0 ], // NEU: für Multiplikation mit -1
[ "$KonstOneInt", "int", 1 ],
[ "$KonstEmptyString", "string", "" ],
[ "$KonstChargeString", "string", "charge" ],
[ "$KonstDischargeString", "string", "discharge" ],
// Variablen für Absolutwert-Berechnung von Netzbezug
[ "$Lgc_IsInputStrictlyNegative", "bool", false ],
[ "$Lgc_IsInputStrictlyNegativeIntSelector", "int", 0 ],
[ "$Lgc_NegativeNetzbezugValue", "float", 0.0 ],
[ "$Lgc_NetzbezugAbsoluteValue", "float", 0.0 ],
// Variablen für Zustandsübergangsbedingungen (Pkt 02)
// STANDBY -> LADEN
[ "$Lgc_Netzbezug_ge_600", "bool", false ],
[ "$Lgc_Netzbezug_gt_600", "bool", false ],
[ "$Lgc_Netzbezug_eq_600", "bool", false ],
[ "$Lgc_PVErzeugung_gt_50", "bool", false ],
[ "$Lgc_SOC_lt_100", "bool", false ],
[ "$Lgc_Standby_to_Laden", "bool", false ],
// LADEN -> STANDBY
[ "$Lgc_Netzbezug_lt_100", "bool", false ],
[ "$Lgc_SOC_ge_100", "bool", false ],
[ "$Lgc_SOC_gt_100", "bool", false ],
[ "$Lgc_SOC_eq_100", "bool", false ],
[ "$Lgc_Laden_to_Standby", "bool", false ],
// STANDBY -> ENTLADEN
[ "$Lgc_Netzbezug_le_minus250", "bool", false ],
[ "$Lgc_Netzbezug_lt_minus250", "bool", false ],
[ "$Lgc_Netzbezug_eq_minus250", "bool", false ],
[ "$Lgc_SOC_gt_0", "bool", false ],
[ "$Lgc_Standby_to_Entladen", "bool", false ],
// ENTLADEN -> STANDBY
[ "$Lgc_Netzbezug_gt_minus50", "bool", false ],
[ "$Lgc_SOC_le_0", "bool", false ],
[ "$Lgc_SOC_lt_0", "bool", false ],
[ "$Lgc_SOC_eq_0", "bool", false ],
[ "$Lgc_Entladen_to_Standby", "bool", false ],
// Zustands-Variable
[ "$State_AktuellerLogikStatus", "int", 0 ],
[ "$State_LastSollLeistungLaden", "float", 0.0 ],
[ "$State_LastSollLeistungEntladen", "float", 0.0 ],
// Variablen für Leistungsberechnung
[ "$Lgc_ZielLadeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungBegrenzt", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungBegrenzt", "float", 0.0 ],
// Variablen für Limiter-Rückmeldungen (hier nicht genutzt, aber deklariert)
[ "$Lgc_LimiterLadenOK", "bool", false ],
[ "$Lgc_LimiterEntladenOK", "bool", false ],
// Variablen für Dämpfungslogik
[ "$Lgc_LadenPowerDiff", "float", 0.0 ],
[ "$Lgc_LadenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungLadenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielLadenGroesserLastLaden", "bool", false ],
[ "$Lgc_ZielLadenGroesserLastLadenIntSelector", "int", 0 ],
[ "$Lgc_EntladenPowerDiff", "float", 0.0 ],
[ "$Lgc_EntladenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungEntladenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielEntladenGroesserLastEntladen", "bool", false ],
[ "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "int", 0 ]
],
"Module": [
// Pkt 01: Grundprinzip & Zustände -> Handhabung durch Statemachine und folgende Multiplexer/SendExplicit
// Pkt 00.1 / 00.2: Weder Laden aus Netz (impliziert durch Ladebedingung > 600W Überschuss), noch Entladen ins Netz (impliziert durch Entladebedingung < -250W Bezug + 50W Restbezug)
// Absolutwert für Netzbezug für Entladeberechnung (korrigiert)
// 1. Bedingung: $in_Netzbezug < 0
[ "Comparator", "$KonstZeroFloat", "$Lgc_IsInputStrictlyNegative", "$in_Netzbezug" ], // A > B ($KonstZeroFloat > $in_Netzbezug --> $in_Netzbezug ist negativ)
// 2. Bool zu Int Konvertierung für Multiplexer-Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_IsInputStrictlyNegativeIntSelector", "$Lgc_IsInputStrictlyNegative" ],
// 3. Berechnung von -$in_Netzbezug (FIX: mit Konstante für -1.0)
[ "Polynomial", "$in_Netzbezug", "$Lgc_NegativeNetzbezugValue", [ "$KonstZeroFloat", "$KonstNegOneFloat" ] ],
// 4. Absolutwert-Berechnung mit separater Variablen-Option
[ "Multiplexer",
[ "$in_Netzbezug", // Option 0: $in_Netzbezug wenn $in_Netzbezug >= 0
"$Lgc_NegativeNetzbezugValue" // Option 1: -$in_Netzbezug (aus $Lgc_NegativeNetzbezugValue)
],
"$Lgc_NetzbezugAbsoluteValue",
"$Lgc_IsInputStrictlyNegativeIntSelector" // Korrekter Integer-Selektor
],
// Pkt 02.1: STANDBY -> LADEN: $in_Netzbezug >= 600 W UND $in_PVErzeugung > 50 W UND SOC < 100%.
// $in_Netzbezug >= 600 W (FIX: mit Limiter für Gleichheit)
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_gt_600", "$KonstGrenzeNetzbezugStandbyLaden" ], // A > B
[ "Limiter", "$in_Netzbezug", "$KonstZeroFloat", "$Lgc_Netzbezug_eq_600", [ "$KonstGrenzeNetzbezugStandbyLaden", "$KonstGrenzeNetzbezugStandbyLaden" ] ], // A == B
[ "Or", [ "$Lgc_Netzbezug_gt_600", "$Lgc_Netzbezug_eq_600" ], "$Lgc_Netzbezug_ge_600" ],
// $in_PVErzeugung > 50 W
[ "Comparator", "$in_PVErzeugung", "$Lgc_PVErzeugung_gt_50", "$KonstGrenzePVErzeugungStandbyLaden" ], // A > B
// SOC < 100%
[ "Comparator", "$KonstGrenzeSOCMax", "$Lgc_SOC_lt_100", "$in_SOC" ], // A > B
[ "And", [ "$Lgc_Netzbezug_ge_600", "$Lgc_PVErzeugung_gt_50", "$Lgc_SOC_lt_100" ], "$Lgc_Standby_to_Laden" ],
// Pkt 02.2: LADEN -> STANDBY: $in_Netzbezug < 100 W ODER SOC >= 100%.
// $in_Netzbezug < 100 W
[ "Comparator", "$KonstGrenzeNetzbezugLadenStandby", "$Lgc_Netzbezug_lt_100", "$in_Netzbezug" ], // A > B
// SOC >= 100% (FIX: mit Limiter für Gleichheit)
[ "Comparator", "$in_SOC", "$Lgc_SOC_gt_100", "$KonstGrenzeSOCMax" ], // A > B
[ "Limiter", "$in_SOC", "$KonstZeroFloat", "$Lgc_SOC_eq_100", [ "$KonstGrenzeSOCMax", "$KonstGrenzeSOCMax" ] ], // A == B
[ "Or", [ "$Lgc_SOC_gt_100", "$Lgc_SOC_eq_100" ], "$Lgc_SOC_ge_100" ],
[ "Or", [ "$Lgc_Netzbezug_lt_100", "$Lgc_SOC_ge_100" ], "$Lgc_Laden_to_Standby" ],
// Pkt 02.3: STANDBY -> ENTLADEN: $in_Netzbezug <= -250 W UND SOC > 0%.
// $in_Netzbezug <= -250 W (FIX: mit Limiter für Gleichheit)
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_lt_minus250", "$in_Netzbezug" ], // A > B (Grenze > Netzbezug -> Netzbezug ist kleiner als Grenze)
[ "Limiter", "$in_Netzbezug", "$KonstZeroFloat", "$Lgc_Netzbezug_eq_minus250", [ "$KonstGrenzeNetzbezugStandbyEntladen", "$KonstGrenzeNetzbezugStandbyEntladen" ] ], // A == B
[ "Or", [ "$Lgc_Netzbezug_lt_minus250", "$Lgc_Netzbezug_eq_minus250" ], "$Lgc_Netzbezug_le_minus250" ],
// SOC > 0%
[ "Comparator", "$in_SOC", "$Lgc_SOC_gt_0", "$KonstGrenzeSOCMin" ], // A > B
[ "And", [ "$Lgc_Netzbezug_le_minus250", "$Lgc_SOC_gt_0" ], "$Lgc_Standby_to_Entladen" ],
// Pkt 02.4: ENTLADEN -> STANDBY: $in_Netzbezug > -50 W ODER SOC <= 0%.
// $in_Netzbezug > -50 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_gt_minus50", "$KonstGrenzeNetzbezugEntladenStandby" ], // A > B
// SOC <= 0% (FIX: mit Limiter für Gleichheit)
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_SOC_lt_0", "$in_SOC" ], // A > B (Grenze > SOC -> SOC ist kleiner als Grenze)
[ "Limiter", "$in_SOC", "$KonstZeroFloat", "$Lgc_SOC_eq_0", [ "$KonstGrenzeSOCMin", "$KonstGrenzeSOCMin" ] ], // A == B
[ "Or", [ "$Lgc_SOC_lt_0", "$Lgc_SOC_eq_0" ], "$Lgc_SOC_le_0" ],
[ "Or", [ "$Lgc_Netzbezug_gt_minus50", "$Lgc_SOC_le_0" ], "$Lgc_Entladen_to_Standby" ],
// Statemachine (Pkt 01 & 02) (FIX: Zustände als Literale 0, 1, 2)
[ "Statemachine",
[
[ "$Lgc_Standby_to_Laden", 0, 1, "$KonstZeroFloat" ],
[ "$Lgc_Laden_to_Standby", 1, 0, "$KonstZeroFloat" ],
[ "$Lgc_Standby_to_Entladen", 0, 2, "$KonstZeroFloat" ],
[ "$Lgc_Entladen_to_Standby", 2, 0, "$KonstZeroFloat" ]
],
"$State_AktuellerLogikStatus"
],
// Pkt 03: Berechnung des Leistungs-Zielwerts im Zustand LADEN
// Pkt 03.2: Ziel-Ladeleistung = $in_Netzbezug - 200 W.
[ "Polynomial", "$in_Netzbezug", "$Lgc_ZielLadeleistungRoh", [ "-$KonstLadezielRestUeberschuss", "$KonstOneFloat" ] ],
// Pkt 03.3: Grenzen: 400 W bis 1200 W
[ "Limiter", "$Lgc_ZielLadeleistungRoh", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LimiterLadenOK", [ "$KonstLadeMinLeistung", "$KonstLadeMaxLeistung" ] ],
// Pkt 04: Berechnung des Leistungs-Zielwerts im Zustand ENTLADEN
// Pkt 04.2: Ziel-Entladeleistung = abs($in_Netzbezug) - 50 W.
[ "Polynomial", "$Lgc_NetzbezugAbsoluteValue", "$Lgc_ZielEntladeleistungRoh", [ "-$KonstEntladezielRestBezug", "$KonstOneFloat" ] ],
// Pkt 04.3: Grenzen: 200 W bis 800 W
[ "Limiter", "$Lgc_ZielEntladeleistungRoh", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_LimiterEntladenOK", [ "$KonstEntladeMinLeistung", "$KonstEntladeMaxLeistung" ] ],
// Pkt 05: Asymmetrische & ereignisgesteuerte Leistungsanpassung (Dämpfung)
// Die Dämpfung erfolgt, wenn der Zustand LADEN oder ENTLADEN aktiv ist UND $in_Netzbezug sich geändert hat.
// Hilfslogik für Dämpfung LADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_ZielLadenGroesserLastLaden", "$State_LastSollLeistungLaden" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielLadenGroesserLastLadenIntSelector", "$Lgc_ZielLadenGroesserLastLaden" ],
// Zerlegung der gedämpften Erhöhungsformel für LADEN: State_LastSollLeistungLaden + ((Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden) * KonstDaempfungsfaktor)
// 1. (Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden) (FIX: korrekte Polynomial-Syntax für Subtraktion)
[ "Polynomial", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LadenPowerDiff", [ "-$State_LastSollLeistungLaden", "$KonstOneFloat" ] ],
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_LadenPowerDiff", "$Lgc_LadenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungLaden + DampedValue
[ "Polynomial", "$State_LastSollLeistungLaden", "$Lgc_SollLeistungLadenGedaempftFinal", [ "$Lgc_LadenDampedValue", "$KonstOneFloat" ] ],
// Multiplexer zur Auswahl des finalen Ladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielLadeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungLadenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last)
],
"$Lgc_SollLeistungLadenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielLadenGroesserLastLadenIntSelector" // Korrekter Integer-Selektor
],
// Hilfslogik für Dämpfung ENTLADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_ZielEntladenGroesserLastEntladen", "$State_LastSollLeistungEntladen" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "$Lgc_ZielEntladenGroesserLastEntladen" ],
// Zerlegung der gedämpften Erhöhungsformel für ENTLADEN
// 1. (Lgc_ZielEntladeleistungBegrenzt - State_LastSollLeistungEntladen) (FIX: korrekte Polynomial-Syntax für Subtraktion)
[ "Polynomial", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_EntladenPowerDiff", [ "-$State_LastSollLeistungEntladen", "$KonstOneFloat" ] ],
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_EntladenPowerDiff", "$Lgc_EntladenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungEntladen + DampedValue
[ "Polynomial", "$State_LastSollLeistungEntladen", "$Lgc_SollLeistungEntladenGedaempftFinal", [ "$Lgc_EntladenDampedValue", "$KonstOneFloat" ] ],
// Multiplexer zur Auswahl des finalen Entladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielEntladeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungEntladenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last)
],
"$Lgc_SollLeistungEntladenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielEntladenGroesserLastEntladenIntSelector" // Korrekter Integer-Selektor
],
// Steuerung der Ausgänge basierend auf dem aktuellen Zustand (Pkt 01, Pkt 05.4)
// $out_Betriebsmodus
[ "Multiplexer",
[ "$KonstEmptyString", "$KonstChargeString", "$KonstDischargeString" ],
"$out_Betriebsmodus",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_Betriebsmodus",
0
],
// $out_SollLeistungLaden
[ "Multiplexer",
[ "$KonstZeroFloat", "$Lgc_SollLeistungLadenGedaempftFinal", "$KonstZeroFloat" ],
"$out_SollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungLaden",
0
],
// $out_SollLeistungEntladen
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$Lgc_SollLeistungEntladenGedaempftFinal" ],
"$out_SollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungEntladen",
0
],
// Update der State_LastSollLeistung-Variablen für die Dämpfungslogik
// Reset auf 0 beim Verlassen eines Zustands (STANDBY)
[ "Multiplexer",
[ "$KonstZeroFloat", "$Lgc_SollLeistungLadenGedaempftFinal", "$KonstZeroFloat" ],
"$State_LastSollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$Lgc_SollLeistungEntladenGedaempftFinal" ],
"$State_LastSollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
// $out_LogikStatus
[ "Multiplexer",
[ "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstStatusENTLADEN" ],
"$out_LogikStatus",
"$State_AktuellerLogikStatus"
]
]
}
_____________________________________________________________________________________
es hat sich speichern lassen
_______________________________________________________________________________
testanweisung der ki
Testanweisung für die Funktions-Verifikation:
Startzustand (STANDBY):
Setzen Sie $in_Netzbezug auf 0.0, $in_PVErzeugung auf 0.0, $in_SOC auf 50.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
Übergang STANDBY -> LADEN (Pkt 02.1):
Ausgehend vom Startzustand:
Setzen Sie $in_Netzbezug auf 700.0 (Überschuss), $in_PVErzeugung auf 100.0, $in_SOC auf 70.0.
Erwartetes Ergebnis: $out_LogikStatus = 1, $out_Betriebsmodus = "charge".
Berechnung $out_SollLeistungLaden sollte gedämpft sein:
Rohziel: 700 - 200 = 500.
Liegt innerhalb [400, 1200].
Da $State_LastSollLeistungLaden (initial 0.0) < Ziel (500.0), wird gedämpft: 0 + ((500 - 0) * 0.33) = 165.0.
$out_SollLeistungLaden sollte ca. 165.0 betragen. (Bei weiteren Schritten mit in_Netzbezug=700, sollte es sich auf 500 annähern).
$out_SollLeistungEntladen = 0.0.
Übergang LADEN -> STANDBY (Pkt 02.2 - Netzbezug):
Ausgehend vom LADE-Zustand:
Setzen Sie $in_Netzbezug auf 50.0, $in_PVErzeugung auf 100.0, $in_SOC auf 70.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
Übergang LADEN -> STANDBY (Pkt 02.2 - SOC):
Ausgehend vom LADE-Zustand (z.B. nach Schritt 2):
Setzen Sie $in_Netzbezug auf 700.0, $in_PVErzeugung auf 100.0.
Setzen Sie $in_SOC auf 100.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
Übergang STANDBY -> ENTLADEN (Pkt 02.3):
Ausgehend vom Startzustand:
Setzen Sie $in_Netzbezug auf -300.0 (Bezug), $in_PVErzeugung auf 0.0, $in_SOC auf 30.0.
Erwartetes Ergebnis: $out_LogikStatus = 2, $out_Betriebsmodus = "discharge".
Berechnung $out_SollLeistungEntladen sollte gedämpft sein:
Rohziel: abs(-300) - 50 = 250.
Liegt innerhalb [200, 800].
Da $State_LastSollLeistungEntladen (initial 0.0) < Ziel (250.0), wird gedämpft: 0 + ((250 - 0) * 0.33) = 82.5.
$out_SollLeistungEntladen sollte ca. 82.5 betragen.
$out_SollLeistungLaden = 0.0.
Übergang ENTLADEN -> STANDBY (Pkt 02.4 - Netzbezug):
Ausgehend vom ENTLADE-Zustand:
Setzen Sie $in_Netzbezug auf -20.0, $in_PVErzeugung auf 0.0, $in_SOC auf 30.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
Übergang ENTLADEN -> STANDBY (Pkt 02.4 - SOC):
Ausgehend vom ENTLADE-Zustand (z.B. nach Schritt 6):
Setzen Sie $in_Netzbezug auf -300.0, $in_PVErzeugung auf 0.0.
Setzen Sie $in_SOC auf 0.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
mich würde es freuen wenn es nun funktionieren würde
viel erfolg
so
nächster test
{
"Meta": {
"Description": "Steuerung einer PV-Batterie (Zendure SolarFlow 2400 Pro) basierend auf Netzbezug für Lade- und Entladebetrieb unter Berücksichtigung von Effizienzgrenzen und Dämpfung.",
"Version": "1.0.2",
"Author": "AI (nach Vorgaben von Georg E. & AndererStefan)",
"Last_Update": "2025-09-25"
},
"Input": [
[ "Netzbezug [W]", "Aktueller Leistungswert am Netzzähler (+Einspeisung / -Bezug)", "$in_Netzbezug", "c" ],
[ "PV Erzeugung [W]", "Aktuelle PV-Erzeugungsleistung", "$in_PVErzeugung", "c" ],
[ "SOC Batterie [%]", "Ladezustand der Batterie (0-100%)", "$in_SOC", "c" ]
],
"Output": [
[ "Betriebsmodus", "MQTT-Modus für Batterie (charge/discharge)", "$out_Betriebsmodus", "x" ],
[ "Soll Leistung Laden [W]", "Angeforderte Ladeleistung für Batterie", "$out_SollLeistungLaden", "x" ],
[ "Soll Leistung Entladen [W]", "Angeforderte Entladeleistung für Batterie", "$out_SollLeistungEntladen", "x" ],
[ "Logik Status", "Aktueller Zustand der Logik (0:STANDBY, 1:LADEN, 2:ENTLADEN)", "$out_LogikStatus", "c" ]
],
"Level": [
// Deklaration der Input-Variablen (Gemäß A.0.7)
[ "$in_Netzbezug", "float", 0.0 ],
[ "$in_PVErzeugung", "float", 0.0 ],
[ "$in_SOC", "float", 0.0 ],
// Deklaration der Output-Variablen
[ "$out_Betriebsmodus", "string", "" ],
[ "$out_SollLeistungLaden", "float", 0.0 ],
[ "$out_SollLeistungEntladen", "float", 0.0 ],
[ "$out_LogikStatus", "int", 0 ],
// Konstanten für Logik-Zustände
[ "$KonstStatusSTANDBY", "int", 0 ],
[ "$KonstStatusLADEN", "int", 1 ],
[ "$KonstStatusENTLADEN", "int", 2 ],
// Konstanten für Schwellenwerte (Pkt 02)
[ "$KonstGrenzeNetzbezugStandbyLaden", "float", 600.0 ],
[ "$KonstGrenzePVErzeugungStandbyLaden", "float", 50.0 ],
[ "$KonstGrenzeSOCMax", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugLadenStandby", "float", 100.0 ],
[ "$KonstGrenzeNetzbezugStandbyEntladen", "float", -250.0 ],
[ "$KonstGrenzeSOCMin", "float", 0.0 ],
[ "$KonstGrenzeNetzbezugEntladenStandby", "float", -50.0 ],
// Konstanten für Leistungsberechnung (Pkt 03 & 04)
[ "$KonstLadezielRestUeberschuss", "float", 200.0 ],
[ "$KonstLadeMinLeistung", "float", 400.0 ],
[ "$KonstLadeMaxLeistung", "float", 1200.0 ],
[ "$KonstEntladezielRestBezug", "float", 50.0 ],
[ "$KonstEntladeMinLeistung", "float", 200.0 ],
[ "$KonstEntladeMaxLeistung", "float", 800.0 ],
// Konstanten für Dämpfung (Pkt 05)
[ "$KonstDaempfungsfaktor", "float", 0.33 ],
[ "$KonstFalse", "bool", false ],
[ "$KonstTrue", "bool", true ],
[ "$KonstZeroFloat", "float", 0.0 ],
[ "$KonstZeroInt", "int", 0 ],
[ "$KonstOneFloat", "float", 1.0 ],
[ "$KonstNegOneFloat", "float", -1.0 ], // NEU: für Multiplikation mit -1
[ "$KonstOneInt", "int", 1 ],
[ "$KonstEmptyString", "string", "" ],
[ "$KonstChargeString", "string", "charge" ],
[ "$KonstDischargeString", "string", "discharge" ],
// Variablen für Absolutwert-Berechnung von Netzbezug
[ "$Lgc_IsInputStrictlyNegative", "bool", false ],
[ "$Lgc_IsInputStrictlyNegativeIntSelector", "int", 0 ],
[ "$Lgc_NegativeNetzbezugValue", "float", 0.0 ],
[ "$Lgc_NetzbezugAbsoluteValue", "float", 0.0 ],
// Variablen für Zustandsübergangsbedingungen (Pkt 02)
// STANDBY -> LADEN
[ "$Lgc_Netzbezug_ge_600", "bool", false ],
[ "$Lgc_Netzbezug_gt_600", "bool", false ],
[ "$Lgc_Netzbezug_eq_600", "bool", false ],
[ "$Lgc_PVErzeugung_gt_50", "bool", false ],
[ "$Lgc_SOC_lt_100", "bool", false ],
[ "$Lgc_Standby_to_Laden", "bool", false ],
// LADEN -> STANDBY
[ "$Lgc_Netzbezug_lt_100", "bool", false ],
[ "$Lgc_SOC_ge_100", "bool", false ],
[ "$Lgc_SOC_gt_100", "bool", false ],
[ "$Lgc_SOC_eq_100", "bool", false ],
[ "$Lgc_Laden_to_Standby", "bool", false ],
// STANDBY -> ENTLADEN
[ "$Lgc_Netzbezug_le_minus250", "bool", false ],
[ "$Lgc_Netzbezug_lt_minus250", "bool", false ],
[ "$Lgc_Netzbezug_eq_minus250", "bool", false ],
[ "$Lgc_SOC_gt_0", "bool", false ],
[ "$Lgc_Standby_to_Entladen", "bool", false ],
// ENTLADEN -> STANDBY
[ "$Lgc_Netzbezug_gt_minus50", "bool", false ],
[ "$Lgc_SOC_le_0", "bool", false ],
[ "$Lgc_SOC_lt_0", "bool", false ],
[ "$Lgc_SOC_eq_0", "bool", false ],
[ "$Lgc_Entladen_to_Standby", "bool", false ],
// Zustands-Variable
[ "$State_AktuellerLogikStatus", "int", 0 ],
[ "$State_LastSollLeistungLaden", "float", 0.0 ],
[ "$State_LastSollLeistungEntladen", "float", 0.0 ],
// Variablen für Leistungsberechnung
[ "$Lgc_ZielLadeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungRoh", "float", 0.0 ],
[ "$Lgc_ZielLadeleistungBegrenzt", "float", 0.0 ],
[ "$Lgc_ZielEntladeleistungBegrenzt", "float", 0.0 ],
// Variablen für Limiter-Rückmeldungen (hier nicht genutzt, aber deklariert)
[ "$Lgc_LimiterLadenOK", "bool", false ],
[ "$Lgc_LimiterEntladenOK", "bool", false ],
// Variablen für Dämpfungslogik
[ "$Lgc_LadenPowerDiff", "float", 0.0 ],
[ "$Lgc_LadenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungLadenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielLadenGroesserLastLaden", "bool", false ],
[ "$Lgc_ZielLadenGroesserLastLadenIntSelector", "int", 0 ],
[ "$Lgc_EntladenPowerDiff", "float", 0.0 ],
[ "$Lgc_EntladenDampedValue", "float", 0.0 ],
[ "$Lgc_SollLeistungEntladenGedaempftFinal", "float", 0.0 ],
[ "$Lgc_ZielEntladenGroesserLastEntladen", "bool", false ],
[ "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "int", 0 ]
],
"Module": [
// Pkt 01: Grundprinzip & Zustände -> Handhabung durch Statemachine und folgende Multiplexer/SendExplicit
// Pkt 00.1 / 00.2: Weder Laden aus Netz (impliziert durch Ladebedingung > 600W Überschuss), noch Entladen ins Netz (impliziert durch Entladebedingung < -250W Bezug + 50W Restbezug)
// Absolutwert für Netzbezug für Entladeberechnung (korrigiert)
// 1. Bedingung: $in_Netzbezug < 0
[ "Comparator", "$KonstZeroFloat", "$Lgc_IsInputStrictlyNegative", "$in_Netzbezug" ], // A > B ($KonstZeroFloat > $in_Netzbezug --> $in_Netzbezug ist negativ)
// 2. Bool zu Int Konvertierung für Multiplexer-Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_IsInputStrictlyNegativeIntSelector", "$Lgc_IsInputStrictlyNegative" ],
// 3. Berechnung von -$in_Netzbezug (FIX: mit Konstante für -1.0)
[ "Polynomial", "$in_Netzbezug", "$Lgc_NegativeNetzbezugValue", [ "$KonstZeroFloat", "$KonstNegOneFloat" ] ],
// 4. Absolutwert-Berechnung mit separater Variablen-Option
[ "Multiplexer",
[ "$in_Netzbezug", // Option 0: $in_Netzbezug wenn $in_Netzbezug >= 0
"$Lgc_NegativeNetzbezugValue" // Option 1: -$in_Netzbezug (aus $Lgc_NegativeNetzbezugValue)
],
"$Lgc_NetzbezugAbsoluteValue",
"$Lgc_IsInputStrictlyNegativeIntSelector" // Korrekter Integer-Selektor
],
// Pkt 02.1: STANDBY -> LADEN: $in_Netzbezug >= 600 W UND $in_PVErzeugung > 50 W UND SOC < 100%.
// $in_Netzbezug >= 600 W (FIX: mit Limiter für Gleichheit)
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_gt_600", "$KonstGrenzeNetzbezugStandbyLaden" ], // A > B
[ "Limiter", "$in_Netzbezug", "$KonstZeroFloat", "$Lgc_Netzbezug_eq_600", [ "$KonstGrenzeNetzbezugStandbyLaden", "$KonstGrenzeNetzbezugStandbyLaden" ] ], // A == B
[ "Or", [ "$Lgc_Netzbezug_gt_600", "$Lgc_Netzbezug_eq_600" ], "$Lgc_Netzbezug_ge_600" ],
// $in_PVErzeugung > 50 W
[ "Comparator", "$in_PVErzeugung", "$Lgc_PVErzeugung_gt_50", "$KonstGrenzePVErzeugungStandbyLaden" ], // A > B
// SOC < 100%
[ "Comparator", "$KonstGrenzeSOCMax", "$Lgc_SOC_lt_100", "$in_SOC" ], // A > B
[ "And", [ "$Lgc_Netzbezug_ge_600", "$Lgc_PVErzeugung_gt_50", "$Lgc_SOC_lt_100" ], "$Lgc_Standby_to_Laden" ],
// Pkt 02.2: LADEN -> STANDBY: $in_Netzbezug < 100 W ODER SOC >= 100%.
// $in_Netzbezug < 100 W
[ "Comparator", "$KonstGrenzeNetzbezugLadenStandby", "$Lgc_Netzbezug_lt_100", "$in_Netzbezug" ], // A > B
// SOC >= 100% (FIX: mit Limiter für Gleichheit)
[ "Comparator", "$in_SOC", "$Lgc_SOC_gt_100", "$KonstGrenzeSOCMax" ], // A > B
[ "Limiter", "$in_SOC", "$KonstZeroFloat", "$Lgc_SOC_eq_100", [ "$KonstGrenzeSOCMax", "$KonstGrenzeSOCMax" ] ], // A == B
[ "Or", [ "$Lgc_SOC_gt_100", "$Lgc_SOC_eq_100" ], "$Lgc_SOC_ge_100" ],
[ "Or", [ "$Lgc_Netzbezug_lt_100", "$Lgc_SOC_ge_100" ], "$Lgc_Laden_to_Standby" ],
// Pkt 02.3: STANDBY -> ENTLADEN: $in_Netzbezug <= -250 W UND SOC > 0%.
// $in_Netzbezug <= -250 W (FIX: mit Limiter für Gleichheit)
[ "Comparator", "$KonstGrenzeNetzbezugStandbyEntladen", "$Lgc_Netzbezug_lt_minus250", "$in_Netzbezug" ], // A > B (Grenze > Netzbezug -> Netzbezug ist kleiner als Grenze)
[ "Limiter", "$in_Netzbezug", "$KonstZeroFloat", "$Lgc_Netzbezug_eq_minus250", [ "$KonstGrenzeNetzbezugStandbyEntladen", "$KonstGrenzeNetzbezugStandbyEntladen" ] ], // A == B
[ "Or", [ "$Lgc_Netzbezug_lt_minus250", "$Lgc_Netzbezug_eq_minus250" ], "$Lgc_Netzbezug_le_minus250" ],
// SOC > 0%
[ "Comparator", "$in_SOC", "$Lgc_SOC_gt_0", "$KonstGrenzeSOCMin" ], // A > B
[ "And", [ "$Lgc_Netzbezug_le_minus250", "$Lgc_SOC_gt_0" ], "$Lgc_Standby_to_Entladen" ],
// Pkt 02.4: ENTLADEN -> STANDBY: $in_Netzbezug > -50 W ODER SOC <= 0%.
// $in_Netzbezug > -50 W
[ "Comparator", "$in_Netzbezug", "$Lgc_Netzbezug_gt_minus50", "$KonstGrenzeNetzbezugEntladenStandby" ], // A > B
// SOC <= 0% (FIX: mit Limiter für Gleichheit)
[ "Comparator", "$KonstGrenzeSOCMin", "$Lgc_SOC_lt_0", "$in_SOC" ], // A > B (Grenze > SOC -> SOC ist kleiner als Grenze)
[ "Limiter", "$in_SOC", "$KonstZeroFloat", "$Lgc_SOC_eq_0", [ "$KonstGrenzeSOCMin", "$KonstGrenzeSOCMin" ] ], // A == B
[ "Or", [ "$Lgc_SOC_lt_0", "$Lgc_SOC_eq_0" ], "$Lgc_SOC_le_0" ],
[ "Or", [ "$Lgc_Netzbezug_gt_minus50", "$Lgc_SOC_le_0" ], "$Lgc_Entladen_to_Standby" ],
// Statemachine (Pkt 01 & 02) (FIX: Zustände als Literale 0, 1, 2)
[ "Statemachine",
[
[ "$Lgc_Standby_to_Laden", 0, 1, "$KonstZeroFloat" ],
[ "$Lgc_Laden_to_Standby", 1, 0, "$KonstZeroFloat" ],
[ "$Lgc_Standby_to_Entladen", 0, 2, "$KonstZeroFloat" ],
[ "$Lgc_Entladen_to_Standby", 2, 0, "$KonstZeroFloat" ]
],
"$State_AktuellerLogikStatus"
],
// Pkt 03: Berechnung des Leistungs-Zielwerts im Zustand LADEN
// Pkt 03.2: Ziel-Ladeleistung = $in_Netzbezug - 200 W.
[ "Polynomial", "$in_Netzbezug", "$Lgc_ZielLadeleistungRoh", [ "-$KonstLadezielRestUeberschuss", "$KonstOneFloat" ] ],
// Pkt 03.3: Grenzen: 400 W bis 1200 W
[ "Limiter", "$Lgc_ZielLadeleistungRoh", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LimiterLadenOK", [ "$KonstLadeMinLeistung", "$KonstLadeMaxLeistung" ] ],
// Pkt 04: Berechnung des Leistungs-Zielwerts im Zustand ENTLADEN
// Pkt 04.2: Ziel-Entladeleistung = abs($in_Netzbezug) - 50 W.
[ "Polynomial", "$Lgc_NetzbezugAbsoluteValue", "$Lgc_ZielEntladeleistungRoh", [ "-$KonstEntladezielRestBezug", "$KonstOneFloat" ] ],
// Pkt 04.3: Grenzen: 200 W bis 800 W
[ "Limiter", "$Lgc_ZielEntladeleistungRoh", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_LimiterEntladenOK", [ "$KonstEntladeMinLeistung", "$KonstEntladeMaxLeistung" ] ],
// Pkt 05: Asymmetrische & ereignisgesteuerte Leistungsanpassung (Dämpfung)
// Die Dämpfung erfolgt, wenn der Zustand LADEN oder ENTLADEN aktiv ist UND $in_Netzbezug sich geändert hat.
// Hilfslogik für Dämpfung LADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_ZielLadenGroesserLastLaden", "$State_LastSollLeistungLaden" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielLadenGroesserLastLadenIntSelector", "$Lgc_ZielLadenGroesserLastLaden" ],
// Zerlegung der gedämpften Erhöhungsformel für LADEN: State_LastSollLeistungLaden + ((Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden) * KonstDaempfungsfaktor)
// 1. (Lgc_ZielLadeleistungBegrenzt - State_LastSollLeistungLaden) (FIX: korrekte Polynomial-Syntax für Subtraktion)
[ "Polynomial", "$Lgc_ZielLadeleistungBegrenzt", "$Lgc_LadenPowerDiff", [ "-$State_LastSollLeistungLaden", "$KonstOneFloat" ] ],
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_LadenPowerDiff", "$Lgc_LadenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungLaden + DampedValue
[ "Polynomial", "$State_LastSollLeistungLaden", "$Lgc_SollLeistungLadenGedaempftFinal", [ "$Lgc_LadenDampedValue", "$KonstOneFloat" ] ],
// Multiplexer zur Auswahl des finalen Ladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielLadeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungLadenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last)
],
"$Lgc_SollLeistungLadenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielLadenGroesserLastLadenIntSelector" // Korrekter Integer-Selektor
],
// Hilfslogik für Dämpfung ENTLADEN: Ziel > Letzter Wert?
[ "Comparator", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_ZielEntladenGroesserLastEntladen", "$State_LastSollLeistungEntladen" ], // A > B
// Bool nach Int Selektor
[ "Multiplexer", [ "$KonstZeroInt", "$KonstOneInt" ], "$Lgc_ZielEntladenGroesserLastEntladenIntSelector", "$Lgc_ZielEntladenGroesserLastEntladen" ],
// Zerlegung der gedämpften Erhöhungsformel für ENTLADEN
// 1. (Lgc_ZielEntladeleistungBegrenzt - State_LastSollLeistungEntladen) (FIX: korrekte Polynomial-Syntax für Subtraktion)
[ "Polynomial", "$Lgc_ZielEntladeleistungBegrenzt", "$Lgc_EntladenPowerDiff", [ "-$State_LastSollLeistungEntladen", "$KonstOneFloat" ] ],
// 2. Diff * KonstDaempfungsfaktor
[ "Polynomial", "$Lgc_EntladenPowerDiff", "$Lgc_EntladenDampedValue", [ "$KonstZeroFloat", "$KonstDaempfungsfaktor" ] ],
// 3. State_LastSollLeistungEntladen + DampedValue
[ "Polynomial", "$State_LastSollLeistungEntladen", "$Lgc_SollLeistungEntladenGedaempftFinal", [ "$Lgc_EntladenDampedValue", "$KonstOneFloat" ] ],
// Multiplexer zur Auswahl des finalen Entladeleistungswerts: Sofortige Reduktion (Zielwert), oder gedämpfte Erhöhung
[ "Multiplexer",
[ "$Lgc_ZielEntladeleistungBegrenzt", // Option 0: Sofortiger Wert (Ziel <= Last)
"$Lgc_SollLeistungEntladenGedaempftFinal" // Option 1: Gedämpfter Wert (Ziel > Last)
],
"$Lgc_SollLeistungEntladenGedaempftFinal", // Output wird in Final geschrieben
"$Lgc_ZielEntladenGroesserLastEntladenIntSelector" // Korrekter Integer-Selektor
],
// Steuerung der Ausgänge basierend auf dem aktuellen Zustand (Pkt 01, Pkt 05.4)
// $out_Betriebsmodus
[ "Multiplexer",
[ "$KonstEmptyString", "$KonstChargeString", "$KonstDischargeString" ],
"$out_Betriebsmodus",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_Betriebsmodus",
0
],
// $out_SollLeistungLaden
[ "Multiplexer",
[ "$KonstZeroFloat", "$Lgc_SollLeistungLadenGedaempftFinal", "$KonstZeroFloat" ],
"$out_SollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungLaden",
0
],
// $out_SollLeistungEntladen
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$Lgc_SollLeistungEntladenGedaempftFinal" ],
"$out_SollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
[ "SendExplicit",
"$KonstTrue",
"$out_SollLeistungEntladen",
0
],
// Update der State_LastSollLeistung-Variablen für die Dämpfungslogik
// Reset auf 0 beim Verlassen eines Zustands (STANDBY)
[ "Multiplexer",
[ "$KonstZeroFloat", "$Lgc_SollLeistungLadenGedaempftFinal", "$KonstZeroFloat" ],
"$State_LastSollLeistungLaden",
"$State_AktuellerLogikStatus"
],
[ "Multiplexer",
[ "$KonstZeroFloat", "$KonstZeroFloat", "$Lgc_SollLeistungEntladenGedaempftFinal" ],
"$State_LastSollLeistungEntladen",
"$State_AktuellerLogikStatus"
],
// $out_LogikStatus
[ "Multiplexer",
[ "$KonstStatusSTANDBY", "$KonstStatusLADEN", "$KonstStatusENTLADEN" ],
"$out_LogikStatus",
"$State_AktuellerLogikStatus"
]
]
}
_____________________________________________________________________________________
es hat sich speichern lassen
_______________________________________________________________________________
testanweisung der ki
Testanweisung für die Funktions-Verifikation:
Startzustand (STANDBY):
Setzen Sie $in_Netzbezug auf 0.0, $in_PVErzeugung auf 0.0, $in_SOC auf 50.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
Übergang STANDBY -> LADEN (Pkt 02.1):
Ausgehend vom Startzustand:
Setzen Sie $in_Netzbezug auf 700.0 (Überschuss), $in_PVErzeugung auf 100.0, $in_SOC auf 70.0.
Erwartetes Ergebnis: $out_LogikStatus = 1, $out_Betriebsmodus = "charge".
Berechnung $out_SollLeistungLaden sollte gedämpft sein:
Rohziel: 700 - 200 = 500.
Liegt innerhalb [400, 1200].
Da $State_LastSollLeistungLaden (initial 0.0) < Ziel (500.0), wird gedämpft: 0 + ((500 - 0) * 0.33) = 165.0.
$out_SollLeistungLaden sollte ca. 165.0 betragen. (Bei weiteren Schritten mit in_Netzbezug=700, sollte es sich auf 500 annähern).
$out_SollLeistungEntladen = 0.0.
Übergang LADEN -> STANDBY (Pkt 02.2 - Netzbezug):
Ausgehend vom LADE-Zustand:
Setzen Sie $in_Netzbezug auf 50.0, $in_PVErzeugung auf 100.0, $in_SOC auf 70.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
Übergang LADEN -> STANDBY (Pkt 02.2 - SOC):
Ausgehend vom LADE-Zustand (z.B. nach Schritt 2):
Setzen Sie $in_Netzbezug auf 700.0, $in_PVErzeugung auf 100.0.
Setzen Sie $in_SOC auf 100.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
Übergang STANDBY -> ENTLADEN (Pkt 02.3):
Ausgehend vom Startzustand:
Setzen Sie $in_Netzbezug auf -300.0 (Bezug), $in_PVErzeugung auf 0.0, $in_SOC auf 30.0.
Erwartetes Ergebnis: $out_LogikStatus = 2, $out_Betriebsmodus = "discharge".
Berechnung $out_SollLeistungEntladen sollte gedämpft sein:
Rohziel: abs(-300) - 50 = 250.
Liegt innerhalb [200, 800].
Da $State_LastSollLeistungEntladen (initial 0.0) < Ziel (250.0), wird gedämpft: 0 + ((250 - 0) * 0.33) = 82.5.
$out_SollLeistungEntladen sollte ca. 82.5 betragen.
$out_SollLeistungLaden = 0.0.
Übergang ENTLADEN -> STANDBY (Pkt 02.4 - Netzbezug):
Ausgehend vom ENTLADE-Zustand:
Setzen Sie $in_Netzbezug auf -20.0, $in_PVErzeugung auf 0.0, $in_SOC auf 30.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
Übergang ENTLADEN -> STANDBY (Pkt 02.4 - SOC):
Ausgehend vom ENTLADE-Zustand (z.B. nach Schritt 6):
Setzen Sie $in_Netzbezug auf -300.0, $in_PVErzeugung auf 0.0.
Setzen Sie $in_SOC auf 0.0.
Erwartetes Ergebnis: $out_LogikStatus = 0, $out_Betriebsmodus = "", $out_SollLeistungLaden = 0.0, $out_SollLeistungEntladen = 0.0.
mich würde es freuen wenn es nun funktionieren würde
viel erfolg
TW 2600_99 seit 1.1.2018 / VPN zu