JoeB
30. Oktober 2025 um 15:05
1
Servus,
da im Energiesektor immer mehr im 15Minuten-Takt erfolgt, wäre ein Modul, dass die passenden Werte ermittelt ein schönen Vereinfachung.
Je erfassten Zähler-Wert sollte, im 15Minuten-Takt, folgendes berechnet werden.
Zählerdifferenz und Wert
Der Wert ergibt sich aus der Zählerdifferenz und dem aktuellen Preis .
Im Modul sollten viele Zählerstände auf einmal erfasst/verarbeitet werden können.
Die Berechnun sollte je Eintrag aktiv/inaktiv schaltbar sein.
Ich löse das aktuell mit vielen (15) Einzelskripten, die entsprechend Rechenzeit kosten und u.U. nicht synchron laufen.
Bin ich mit meinem Wunsch allein?
VG
bumaas
30. Oktober 2025 um 19:23
2
Wäre dir vielleicht geholfen, wenn du aus deinen 15 Skripten ein einziges machst? Zeige gerne mal, was du hast und dir wird bestimmt geholfen.
JoeB
31. Oktober 2025 um 08:42
3
Servus,
aktuell mache ich das (für zwei Variablen) „so“:
<?
//echo "15min Summe errechnen; "; //= der Aufruf erfolt alle 15Minuten
$varId1 = 37008; //Zählerstand aktuell
$varId2 = 49144;
$varaltId1 = 27973; //Zählerstand alt
$varaltId2 = 47222;
$AVG_Lademenge = getvalue($varId1)-getvalue($varaltId1);
$AVG_Entademenge = getvalue($varId2)-getvalue($varaltId2);
setvalue(49120,$AVG_Entademenge);
setvalue(35596,$AVG_Lademenge);
//alte Werte speichern
setvalue($varaltId1, getvalue($varId1));
setvalue($varaltId2, getvalue($varId2));
Ich benötige aber immer eine Variable für den „Alt-Wert“.
Schöner wäre es alle Alten Werte in ein array zu schreiben und dort wieder abzuholen
VG
Joe
bumaas
31. Oktober 2025 um 09:45
4
Das ist die eigentliche Schwierigkeit Der Wert lässt sich aber aus dem Archiv holen.
Eine Lösung könnte so aussehen:
<?php
// PHP 8.3
const ARCHIVE_MODULE_ID = '{43192F0B-135B-4CE7-A0A7-1475603F3060}';
$ARCHIVE_ID = IPS_GetInstanceListByModuleID(ARCHIVE_MODULE_ID)[0];
// Konfiguration: [variablenId, zielId]
// [variablenId, zielId(optional)]
$pairs = [
[37008, 35596],
[49144, 49120],
// ...
];
function delta15mAggregiert(int $archiveId, int $varId): float
{
$now = time();
$from = $now - 15 * 60;
// Aggregationsstufe 8 = 15‑Minuten (aus Rohdaten berechnet)
$agg = AC_GetAggregatedValues($archiveId, $varId, 8, $from, $now, 1);
if (empty($agg)) {
return 0.0;
}
// „Avg“ = Summe der positiven Deltas im Intervall
return (float)($agg[0]['Avg']);
}
foreach ($pairs as $def) {
[$varId, $targetId] = [$def[0], $def[1]];
$delta = delta15mAggregiert($ARCHIVE_ID, $varId);
SetValue($targetId, $delta);
}
Das funktioniert aber erst ab 8.1, da erst dort die Aggregationsstufe 8 hinzugekommen ist.
JoeB
31. Oktober 2025 um 10:51
5
Wow, cool.
Vielen Dank, ich werde das die Tage mal testen. (8.1 habe ich)
VG
Joe