Mittelwert Standardvariable ohne Nullen

Hallo Zusammen,
seit ca. 3 Wochen ist meine Wärmepumpe in Betrieb.
Die Daten dazu spuckt diese über ModbusRTU aus, unter anderem auch den COP.
Wenn die Pumpe nicht läuft, wegen Absenken oder Temp. erreicht, wird als COP 0 übermittelt.

Jetzt möchte ich gerne den Durchschnitts-COP errechnen, z.B. aufs Jahr gesehen.
Aber geloggte Nullen sollen natürlich ausgelassen werden.

Geht das irgendwie mit „Aggregated Values“? (würde gerne gleitend 1 Jahr oder Monat nehmen)

Mit Logged Values geht’s und ich kann Nullen rausnehmen.

Gruß,
Matthias

Ich hatte so eine ähnliche Aufgabenstellung: Zur Ermittlung der Verbrauchskennlinie das Datenpaar aus Verbrauch und mittlerer Tagestemperatur bereitstellen, aber die Werte ausserhalb der Heizperiode weglassen.

Dazu habe ich mir zwei Hilfsvariable erzeugt (Verbrauch und Temperatur der Heizperiode) und aus dem Archiv mit Daten befüllt, aber nur für solche Werte bei denen die Temperatur einen bestimmten Wert unterschreitet.

Vielleicht hilft mein Script, wenn du es auf eine Einzelvariable umbaust und die Bedingung anpasst.
$targetIDtemp und $targetIDverbrauch sind die beiden Hilfsvariablen für die Daten der Heizperiode, die zu Beginn des Scripts erstmal gelöscht und dann neu aus dem Archiv (vollständige Verbrauchs- und Temperaturdaten) erzeugt werden.

Viele Grüße
Volker

<?php

// Verbrauch und Temperatur Vortag aus Archiv übernehmen, dabei Daten ausserhalb Heizperiode weglassen über Temperatur als Filterkriterium
$oneday = 24*60*60; // Sekunden pro Tag

// Zeitraum Ende und Anzahl der Tage
$lastday = strtotime("yesterday");
$num_days = 3*365;

$archiveID = 18193;
$targetIDtemp = 25569;
$targetIDverbrauch = 32507;

// alte Werte löschen
AC_DeleteVariableData($archiveID, $targetIDtemp, strtotime("now")-2000*$oneday, strtotime("now"));
AC_DeleteVariableData($archiveID, $targetIDverbrauch, strtotime("now")-2000*$oneday, strtotime("now"));
IPS_Sleep(1000);

for ($offset = 0; $offset < $num_days; $offset++) {

  $timestop  = $lastday - $offset*$oneday;
  $timestart = $timestop - $oneday;

  // echo sprintf ("%s bis %s \n", date("d.m.y H:i:s", $timestart), date("d.m.y H:i:s", $timestop));
  
  // Temperaturwert holen (Tagesmittel)
  $werte = AC_GetAggregatedValues($archiveID,41683 , 1, $timestart, $timestop, 0);
  $Temp = $werte[0]['Avg'];

  // Verbrauchswert holen (Tagesmittel)
  $werte = AC_GetAggregatedValues($archiveID,21946 , 1, $timestart, $timestop, 0);
  $Verbrauch = $werte[0]['Avg'];

  // Werte in Archiv eintragen, aber nur bei niedriger Temperatur (Heizperiode)
  if ($Temp < 17) {
    // Temperatur
    AC_AddLoggedValues($archiveID, $targetIDtemp,[
    [
      'TimeStamp' => $timestop,
      'Value' => $Temp
    ]
    ]);

    // Verbrauch
    AC_AddLoggedValues($archiveID, $targetIDverbrauch,[
    [
      'TimeStamp' => $timestop,
      'Value' => $Verbrauch
    ]
    ]);

  }
}

IPS_Sleep(500);
AC_ReAggregateVariable($archiveID,$targetIDtemp);
AC_ReAggregateVariable($archiveID,$targetIDverbrauch);

1 „Gefällt mir“

Hallo Volker,
ich bin gerade erst dazu gekommen mir das abzuschauen und irgendwie klappt bei mir nichts so richtig.

Ich bekomme immer die Meldung `Notice: Undefined offset: 0 in /var/lib/symcon/scripts/13979.ips.php on line 30

Notice: Trying to access array offset on value of type null in /var/lib/symcon/scripts/13979.ips.php on line 30
NULL`

Und mit Arrays bin ich sehr schlecht :smiley:
Es geht um diese Zeile: $Temp = $werte[0]['Avg'];

Aber nachdem ich geschaut habe, ich glaube, dass dein Script den Stundendurchschnitt nimmt, oder?
Es ist kacke, dass Lambda nicht einfach die Werte des Wärmemengenzählers über Modbus auslesbar hat, dann könnte ich das mit dem Stromverbrauch verrechnen…

Gruß,
Matthias

Ich habe als Python-Nutzer leider auch meine Probleme mit den ungewohnten PHP-Arrays. Die Meldung deutet aber darauf hin dass gar keine Daten zurückkommen. Hattest du die hardcodierte Variable-ID in der Zeile (41683) auf die richtige ID deiner Installation geändert?

~~

Ja, mein Code liest Mittelwerte aus, in dieser Aggregationsstufe gemittelt über jeweils einen Tag. Mir wird gerade bewusst dass das für deinen COP-Anwendungsfall wohl nicht hilft und du noch kürzere Intervalle benötigst oder mit den Rohdaten arbeiten musst.

Hoffentlich hat jemand anderes noch einen Lösungsansatz für dich!

1 „Gefällt mir“