15min Leistungswert

Hallo vielleicht kann mir ja wer weiterhelfen, da ja ab 2027 in Österreich die Netzgebühren unteranderem über die 15min Leistungsspitzen berechnet werden würde ich gerne das ganze im Blick behalten wo ich ungefähr momentan unterwegs bin und würde gerne anzeigen wie hoch der Durchschnitt der letzten 15min ist.

Habe das ganze schon mit Chatgpt versucht mit keinem Erfolg

Das war der Code:

<?php

// Variable mit dem Stromzählerstand (kWh)

$ZaehlerID = 30181;

// Variable für das Ergebnis (kW)

$LeistungID = 42435;

// Aktueller Zählerstand

$aktuell = GetValueFloat($ZaehlerID);

// Letzten archivierten Wert von vor 15 Minuten holen

$archiv = IPS_GetInstanceListByModuleID(‚{43192F0B-135B-4CE7-A0A7-1475603F3060}‘)[0];

$werte = AC_GetLoggedValues(

$archiv,

$ZaehlerID,

time() - 15 \* 60,

time(),

2

);

if (count($werte) >= 2) {

$alt = $werte\[0\]\["Value"\];



$verbrauch = $aktuell - $alt;



if ($verbrauch >= 0) {

    $kw = $verbrauch \* 4;

    SetValueFloat($LeistungID, round($kw, 3));

}

}

?>

Danke gruß Stefan

Versuch es mal damit AC_GetAggregatedValues — Symcon :: Automatisierungssoftware mit 8 als Parameter.

AC_GetLoggedValues holt die Rohwerte heraus. In deinem Fall die letzten beiden im Zeitraum der letzten 15 Minuten.

Oder statt 2 mal 0 versuchen. Das liefert dir alle Werte (max. 10.000)

Irgendwie bassiert nichts.

<?php

// Variable mit dem Stromzählerstand (kWh)

$ZaehlerID = 30181;

// Variable für das Ergebnis (kW)

$LeistungID = 42435;

// Aktueller Zählerstand

$aktuell = GetValueFloat($ZaehlerID);

// Letzten archivierten Wert von vor 15 Minuten holen

$archiv = IPS_GetInstanceListByModuleID(‚{43192F0B-135B-4CE7-A0A7-1475603F3060}‘)[0];

$werte = AC_GetLoggedValues(

$archiv,

$ZaehlerID,

time() - 15 \* 60,

time(),

8

);

if (count($werte) >= 2) {

$alt = $werte\[0\]\["Value"\];



$verbrauch = $aktuell - $alt;



if ($verbrauch >= 0) {

    $kw = $verbrauch \* 4;

    SetValueFloat($LeistungID, round($kw, 3));

}

}

?>

Was wilslt du eigentlich erreichen oder was soll es machen?

ich will so ca minütlich den Durchschnitt der letzten 15min berechnen (Bezugs kW)

Und genau das liefert doch die Funktion welche dir genannten wurde.
Verstehe nicht warum du hier zweimal ein Script mit AC_GetLoggedValues postes, wenn AC_GetAggregatedValues dir direkt in den Index Avg den Durchschnitt liefert.

Probier mal das

<?php
// Variable mit dem Stromzählerstand (kWh)

$ZaehlerID = 28212;

// Letzten archivierten Wert von vor 15 Minuten holen

$archiv = 46307;

$wert=AC_GetAggregatedValues($archiv,$ZaehlerID,8,time()-900,time(),0);
//var_dump($wert);
$i=0;
foreach ($wert as $werte)
{
    echo "Dauer: ".$wert[$i]["Duration"]." TimeStamp: ". date("d.M.Y H:i:s",$wert[$i]["TimeStamp"])."Durchschnitt: ".$wert[$i]["Avg"]." MinTime: ".date("d.M.Y H:i:s",$wert[$i]["MinTime"])." MaxTime: ".date("d.M.Y H:i:s",$wert[$i]["MaxTime"])." Maximum: ".$wert[$i]["Max"].PHP_EOL;
    $i++;
}

Liefert das

Dauer: 622 TimeStamp: 03.Aug.2026 11:45:00Durchschnitt: 0.0030000000006112 MinTime: 03.Aug.2026 11:45:08 MaxTime: 03.Aug.2026 11:45:08 Maximum: 0.0010000000002037
Dauer: 278 TimeStamp: 03.Aug.2026 11:40:22Durchschnitt: 0.0040000000008149 MinTime: 03.Aug.2026 11:30:00 MaxTime: 03.Aug.2026 11:30:00 Maximum: 0.0010000000002037

weil ich vom Programmieren keine Ahnung habe und einen Denkfehler habe und nicht so recht weis wie das ganze funktioniert

ja schaut gut aus und wo ich meinen Wechselrichter wider eingeschalten habe ging der Wert langsam herunter.

Wenn du mir vielleicht noch einen Tip geben könntest wie ich das jetzt in eine Variable schreiben kann wäre ich die dankbar (Durchschnitt)

Vielen Danke

Am einfachsten nimmst die ganze foreach Schleife weg und speicherst den Wert $wert[0][„Avg“] mit setvalue in einer Variable. Laut Beschreibung der Funktion sollte das der Durchsnitt der letzten 15 Minuten sein.

Irgendwas stimmt noch nicht

setvalue(42435, $wert[0][„AVG“]);

Fatal error: Uncaught Error: Undefined constant "„AVG“" in /mnt/data/symcon/scripts/17297.ips.php:15
Stack trace:
#0 {main}
  thrown in /mnt/data/symcon/scripts/17297.ips.php on line 15

Fehler gefunden man muss es so schreiben:

setvalue(42435, $wert[0][‚Avg‘]);

So

setvalue(42435, $wert[0][“Avg”]);

oder so

setvalue(42435, $wert[0][‘Avg’]);

man darf es halt nicht groß schreiben :sweat_smile:

aber jetzt bast es vielen Dank für die Hilfe

Jetzt habe ich ca. einen Richtwert wo die Leistung ist damit ich unter 10kW bleibe. Richtige Berechnung wäre zwar immer zb. von 12:00 bis 12:15 12:15 bis 12:30 usw. aber will keine Wissenschaft daraus machen

Geht auch :wink:

Müsste man anpassen.

aber sicherlich mit größeren Aufwand?

Kann eine KI auch :wink: , aber so schwierig ist das nicht.

Das Skript holt sich über den Aggregations-Typ 8 (stündliche / periodische Aggregation bzw. verfeinerte Werte je nach Archiv-Einstellung) den passenden Wert und schreibt ihn in die Zielvariable 42435. Zudem prüft es ab, ob das Archiv überhaupt Werte zurückgeliefert hat, um PHP-Fehler (Undefined array key 0) zu vermeiden.

PHP-Skript

PHP

<?php
// Konfiguration der IDs
$zaehlerID = 28212; // ID der Zählerstand-Variable (kWh)
$archivID  = 46307; // ID der Archiv-Instanz (Aggregator)
$zielID    = 42435; // ID der Variable für den errechneten Wert

// Zeitfenster definieren: Die letzten 15 Minuten (900 Sekunden)
$endTime   = time();
$startTime = $endTime - 900;

// Aggregierte Werte abfragen
// Parameter: ArchiveID, VariableID, Aggregationsstufe, StartTime, EndTime, Limit
$wert = AC_GetAggregatedValues($archivID, $zaehlerID, 8, $startTime, $endTime, 0);

// Prüfen, ob Daten zurückgegeben wurden
if (!empty($wert) && isset($wert[0]['Avg'])) {
    
    $durchschnitt = $wert[0]['Avg'];
    
    // Wert in Zielvariable schreiben
    SetValue($zielID, $durchschnitt);
    
    // Optional: Log-Eintrag in IP-Symcon für Nachvollziehbarkeit
    // IPS_LogMessage("Stromverbrauch", "Durchschnitt der letzten 15 Min: " . $durchschnitt);
    
} else {
    IPS_LogMessage("Stromverbrauch-Skript", "Fehler: Keine Aggregationsdaten für Variable $zaehlerID erhalten.");
}

Einrichten des 15-Minuten-Intervalls in IP-Symcon

  1. Erstelle im IP-Symcon Objektbaum ein neues Skript und füge den obigen Code ein.

  2. Klappe das Skript auf und klicke auf Ereignis hinzufügen (oder unten rechts auf +Ereignis).

  3. Wähle Zyklisches Ereignis.

  4. Stelle den Intervall-Typ auf Minuten und den Wert auf 15.

  5. Speichern – ab sofort wird das Skript automatisch alle 15 Minuten ausgeführt.

2 „Gefällt mir“

So schaut meine Version mit KI aus :wink:

<?php

// Variable mit dem Stromzählerstand (kWh)
$ZaehlerID = 28212;

// Archiv-ID
$archiv = 46307;

// Ende = letzte abgeschlossene Viertelstunde
$ende = floor(time() / 900) * 900;

// Start = 15 Minuten davor
$start = $ende - 900;

echo "Zeitraum: " . date("d.m.Y H:i:s", $start) . " bis " . date("d.m.Y H:i:s", $ende) . PHP_EOL;

$wert = AC_GetAggregatedValues($archiv, $ZaehlerID, 6, $start, $ende, 0);
$summe=0;
foreach ($wert as $werte)
{
    echo "Dauer: " . $werte["Duration"] .
         " TimeStamp: " . date("d.m.Y H:i:s", $werte["TimeStamp"]) .
         " Durchschnitt: " . $werte["Avg"] .
         " MinTime: " . date("d.m.Y H:i:s", $werte["MinTime"]) .
         " MaxTime: " . date("d.m.Y H:i:s", $werte["MaxTime"]) .
         " Maximum: " . $werte["Max"] . PHP_EOL;
    $summe=$summe+$werte["Avg"];
}
echo "Durchschnitt: ".$summe/count($wert);
3 „Gefällt mir“

Danke dafür jetzt habe ich (ChatGPT) nochmals alles so geändert damit immer die aktuelle 15 Stunde verwendet wird und nicht die letzte.

<?php

// Variable mit dem Stromzählerstand in W
$ZaehlerID = 54384;

// Archiv-ID
$archiv = 43615;

// Zielvariable für den Durchschnittswert in kW
$AusgangsVariable = 42435;

// Start = Beginn der aktuellen Viertelstunde
$start = floor(time() / 900) * 900;

// Ende = Ende der aktuellen Viertelstunde
$ende = $start + 900;

echo "Zeitraum: " . date("d.m.Y H:i:s", $start) . " bis " . date("d.m.Y H:i:s", $ende) . PHP_EOL;

// Aggregierte Werte lesen
$wert = AC_GetAggregatedValues($archiv, $ZaehlerID, 6, $start, $ende, 0);

$summe = 0;

foreach ($wert as $werte)
{
    echo "Dauer: " . $werte["Duration"] .
         " TimeStamp: " . date("d.m.Y H:i:s", $werte["TimeStamp"]) .
         " Durchschnitt: " . $werte["Avg"] .
         " MinTime: " . date("d.m.Y H:i:s", $werte["MinTime"]) .
         " MaxTime: " . date("d.m.Y H:i:s", $werte["MaxTime"]) .
         " Maximum: " . $werte["Max"] . PHP_EOL;

    $summe += $werte["Avg"];
}

if (count($wert) > 0)
{
    // Durchschnitt berechnen und von W auf kW umrechnen
    $durchschnitt = ($summe / count($wert)) / 1000;

    // Auf 3 Nachkommastellen runden
    $durchschnitt = round($durchschnitt, 3);

    echo "Durchschnitt: " . $durchschnitt . " kW" . PHP_EOL;

    // In IP-Symcon-Variable schreiben
    SetValue($AusgangsVariable, $durchschnitt);
}
else
{
    echo "Keine Werte im Zeitraum gefunden." . PHP_EOL;

    // Optional 0 schreiben
    SetValue($AusgangsVariable, 0);
}

?>

Schau mal auf die Homepage von deinem Netzbetreiber, da kannst ziemlich sicher ein csv file mit 1/4 Stunden Werten herunterladen. Dann hast es ganz genau

Ja das kann ich machen die ganzen Werte gibt es wollte das aber in Symcon haben voralem berechne ich die aktuellen 15min damit ich sehe wo ich gerade herum bin.