Hej zusammen,
ich habe mir folgendes „gebastelt“…ZIel: Erkennen welche Last ich zu/abschalten kann/muss, um am Ende der 15Minuten den Grenzwert nicht zu reissen.
(Das Skript ist im wesentlichen KI-Generiert)
?php
/*
// ---------------------
// Konfiguration
// ---------------------
$id_IstLast = 33375; // aktuelle Leistung (Momentanwert)
$id_IstMenge = 11508; // FLOAT: aufsummierte Ist-Menge im aktuellen 15-Min-Intervall
$id_Abweichung = 12975; // FLOAT: Abweichung im aktuellen 15-Min-Intervall
$id_LastTime = 32244; // INTEGER: letzter Zeitstempel
$duration = 900.0; // 15 Minuten in Sekunden
$MaxMenge15Min = getvalue(33624)/4; // Maximale BezugsMenge im 15-Min-Intervall
// ---------------------
// 1) Zeitbasis bestimmen
// ---------------------
$now = time();
// Beginn des aktuellen 15-Minuten-Zeitraums bestimmen
$minute = (int)date(‚i‘, $now);
$quarterIndex = floor($minute / 15); // 0,1,2,3
$startMinute = $quarterIndex * 15; // 0,15,30,45
$periodStart = mktime(
(int)date(‚H‘, $now),
$startMinute,
0,
(int)date(‚m‘, $now),
(int)date(‚d‘, $now),
(int)date(‚Y‘, $now)
);
$elapsed = $now - $periodStart;
if ($elapsed < 0) $elapsed = 0;
if ($elapsed > 900) $elapsed = 900;
// ---------------------
// 2) Ist-Menge integrieren
// ---------------------
$IstLast = GetValue($id_IstLast);
$lastTime = GetValue($id_LastTime);
// erstes Mal oder neues 15-Minuten-Intervall?
if ($lastTime < $periodStart || $lastTime == 0) {
// Ist-Menge zurücksetzen
SetValue($id_IstMenge, 0.0);
SetValue($id_Abweichung, 0.0);
// Startwerte setzen
SetValue($id_LastTime, $now);
// noch keine Fläche berechnen
return;
}
// Zeitdifferenz seit letztem Aufruf
$dt = $now - $lastTime;
if ($dt < 0) $dt = 0;
// aktuelle Ist-Leistung laden
$IstMenge = GetValueFloat($id_IstMenge);
// aktuelle Istmenge ermittlen
$deltaMenge = $IstLast * $dt/3600;
$IstMenge += $deltaMenge;
// Speichern
SetValue($id_IstMenge, $IstMenge);
SetValue($id_LastTime, $now);
// ---------------------
// 3) Soll-Gesamtmenge & Abweichung
// ---------------------
$Puffer = $MaxMenge15Min * ($elapsed/$duration);
// Abweichung (= Ist - Soll) in kWh
$Abweichung = round(($MaxMenge15Min - $Puffer - $IstMenge), -2, PHP_ROUND_HALF_DOWN) ;
// Abweichung speichern
SetValue($id_Abweichung, $Abweichung*4);
echo „Start - Puffer - Ist = Abweichung | $MaxMenge15Min-$Puffer-$IstMenge=$Abweichung“;
*/
//-----------------------------------
// ---------------------
// Konfiguration
// ---------------------
$id_IstLast = 33375; // aktuelle Netzlast in W (positiv Bezug, negativ Einspeisung)
$id_IstMenge = 11508; // FLOAT: aufsummierte Ist-Menge im aktuellen 15-Min-Intervall (Wh)
$id_Abweichung = 12975; // INTEGER: zulässige Zusatzleistung in W (+ = zuschalten, - = abschalten)
$id_LastTime = 32244; // FLOAT: letzter Zeitstempel (Unix-Zeit als Float)
$id_MaxLastWatt = 33624; // INTEGER: maximal zulässige Momentanleistung in W
$duration = 900.0; // 15 Minuten in Sekunden
// ---------------------
// 0) Max. 15-Min-Energie aus MaxLast (W) berechnen
// ---------------------
$MaxLastW_int = GetValueInteger($id_MaxLastWatt); // z.B. 13500 W
$MaxLastW = (float)$MaxLastW_int;
$MaxMenge15Min = $MaxLastW * 0.25; // Wh in 15 Minuten (0,25 h)
// ---------------------
// 1) Zeitbasis bestimmen (aktuelles 15-Min-Intervall)
// ---------------------
$now = time();
$minute = (int)date(‚i‘, $now);
$quarterIndex = floor($minute / 15); // 0,1,2,3
$startMinute = $quarterIndex * 15; // 0,15,30,45
$periodStart = mktime(
(int)date(‚H‘, $now),
$startMinute,
0,
(int)date(‚m‘, $now),
(int)date(‚d‘, $now),
(int)date(‚Y‘, $now)
);
$elapsed = $now - $periodStart;
if ($elapsed < 0) $elapsed = 0;
if ($elapsed > 900) $elapsed = 900;
// ---------------------
// 2) Ist-Menge integrieren (Wh)
// ---------------------
$IstLast = (float)GetValue($id_IstLast); // W
$lastTimeF = GetValueFloat($id_LastTime); // Float-Zeitstempel
$lastTime = (int)$lastTimeF;
// erstes Mal oder neues 15-Minuten-Intervall?
if ($lastTime < $periodStart || $lastTime == 0) {
SetValue($id_IstMenge, 0.0);
//SetValueInteger($id_Abweichung, 0);
SetValueFloat($id_LastTime, (float)$now);
return;
}
// Zeitdifferenz seit letztem Aufruf
$dt = $now - $lastTime;
if ($dt < 0) $dt = 0;
// aktuelle Ist-Menge laden (Wh)
$IstMenge = GetValueFloat($id_IstMenge);
// deltaMenge in Wh: P[W] * dt[s] / 3600
$deltaMenge = $IstLast * $dt / 3600.0;
$IstMenge += $deltaMenge;
// Speichern der integrierten Energiemenge und Zeit
SetValue($id_IstMenge, $IstMenge);
SetValueFloat($id_LastTime, (float)$now);
// ---------------------
// 3) zulässige Zusatzleistung aus 15-Minuten-Sicht (Wh → W)
// ---------------------
// Restenergie im 15-Min-Intervall (Wh)
$remainingEnergyWh = $MaxMenge15Min - $IstMenge;
// Restzeit im Intervall (s)
$remainingTimeSec = $duration - $elapsed;
// Zusätzliche Leistung, damit die 15-Min-Grenze eingehalten wird
if ($remainingTimeSec <= 0) {
// Intervall vorbei oder quasi vorbei: keine Reserve mehr
$allowedExtraW_15min = 0.0;
} else {
// P_extra[kW] = remainingEnergy[Wh] / remainingTime[h]
// = remainingEnergy * 3600 / remainingTimeSec / 1000
$allowedExtraKW_15min = ($remainingEnergyWh * 3600.0) / $remainingTimeSec / 1000.0;
$allowedExtraW_15min = $allowedExtraKW_15min * 1000.0;
}
// ---------------------
// 4) Momentangrenze durch MaxLast berücksichtigen
// ---------------------
// Reserve aus Momentanleistung: MaxLast - aktuelle Last
// Beispiel: MaxLast=13500, IstLast=-9400 → 13500 - (-9400) = 22900 W
$allowedExtraW_momentan = $MaxLastW - $IstLast;
// ---------------------
// 5) Finale zulässige Zusatzleistung = strengste Grenze
// ---------------------
// Beide Limits wirken gleichzeitig; nimm das kleinere
$finalAllowedExtraW = min($allowedExtraW_15min, $allowedExtraW_momentan);
// zusätzliche Sicherheitsbegrenzung: niemals mehr als MaxLastW zuschaltbar
if ($finalAllowedExtraW > $MaxLastW) {
$finalAllowedExtraW = $MaxLastW;
}
if ($finalAllowedExtraW < -$MaxLastW) {
$finalAllowedExtraW = -$MaxLastW;
}
// runden und in Integer schreiben
$finalAllowedExtraW = (int)round($finalAllowedExtraW);
// Interpretation in 12975:
// >0 → so viel W kannst du noch zuschalten, ohne 15-Min-Korridor zu sprengen
// <0 → so viel W musst du im Mittel abregeln, um das Intervall noch zu retten
SetValueInteger($id_Abweichung, $finalAllowedExtraW);
// Optional: Debug
//echo "IstLast={$IstLast}W, IstMenge={$IstMenge}Wh, remainingEnergy={$remainingEnergyWh}Wh, " .
// „Extra15min={$allowedExtraW_15min}W, ExtraMom={$allowedExtraW_momentan}W, final={$finalAllowedExtraW}W“;




