Wie kann ich ein externen Programm aus Symcon ansprechen um eine Zeitreihenprognose durchzuführen?

Da es leider in IPSymcon keine Zeitreihenprognose gibt, mit der ich mir aus meinen vergangenen Energieverbrauchsdaten den Verbrauch für den morgigen Tag prognostizieren kann, möchte ich das extern lösen. Leider habe ich dazu keine PHP-Bilbliothek gefunden. Ich war den Annahme, dass ich das Problem mit RubixML fpr PHP erschlagen könnte, aber das war ein Irrtum, da sich die Entwickler mehr auf Bild und andere Mustererkennung konzentrieren, aber Zeitreihen vernachlässigen.
Mein Ziel ist es daher, meine Vergangenheitswerte des Energievebrauches als aggregierte Stundenwerte in eine externe CSV Datei zu schreiben, dann ein externes Programm aufzurufen welches die Prognose rechnet, zu warten, bis dieses fertig ist und dann das Ergebnis in IPS um einen Tag versetzt zurück in IPS zu spielen, da die Datenbank ja keine Zukunftswerte speichern kann.

Ich bin nun kein Großmeister in PHP und würde daher um Unterstützung bitten, wie ich sowas bewerkstelligen kann.

Hi,
vielleicht IPS_Execute()?

Ralf

1 „Gefällt mir“

An welches Programm hast du denn da gedacht? Je nach Komplexität könnte man es ja vielleicht in PHP transferieren.

Um welche Prognose soll es denn gehen?

Es soll um die Prognose meines elektrischen Hausverbrauches gehen. Das Ziel soll sein, vorher zu sagen, was ich an Strom in etwa am kommenden Tag verbrauchen werde. Zusammen mit der Prognose des Solarertrages kann ich dann ausrechnen, wie viel ich wann von Tibber in den Speicher laden muss um kostenoptimal zusein.
Da wie gesagt RubixML nicht wirklcih gut mit Zeitreihen umgehen kann tendiere ich aktuell zu XGBoost. Das gibt es für C++, Java,python und noch ein paar andere Sprachen. Leider nicht für PHP.

Hi,
ich würde einfach einen Spline über die letzten X-Tage legen und dann extrapolieren.

Ralf

Nette Idee,
die Erfahrung er letzten 15 Jahre zeigt aber das dies per Algorythmus kaum vorhersagbar ist.
Die beste Vorhersage ist: Verbrauch morgen = Verbrauch heute
Unsere Lebensgewohnheiten sind typischerweis viel zu individuel als das hier dauerhaft etwas sinnvolles rauskommt.
bspw. haben Schichtarbeit/Kochgewohnheiten/Kurzurlaub/Wochenede/Baden/Auto Laden haben einen sehr großen aber kaum vorhersagbaren Einfluß auf den Energieverbrauch. Umgekehrt machen dir die dadurch erzeugten Spitzen jede Vorhersage kaputt.
Also würdest du einen sehr sehr inteligenten Algorythmus benötigen und trotzdem viele tagesfeine parameter manuell warten müssen. Oder du bist die halbe Zeit falsch.
Gleiches gilt für den Solarertrag. Zumindest bei mir ist die absolut beste Methode einafch den Ertrag vom Vortag auf den nächsten Tag zu extrapolieren. Funktioniert viele besser als die diversen komplexen und wetterabhängigen Vorhersagen.

greez
bb

es geht ja auch nur um eine Schätzung.
Man muss ohnehin noch zusätzliche Features in die Daten einbauen, wie Wetter, Wochentag, Monat, Feiertage, Urlaubszeit usw.
Ich will ja nicht auf die kWh genau, aber so, das ich am tage einen etwaigen Wert habe, wie viel Strom ich verbrauche. Wenn da ein Fehler von 10-20 Prozent ist, dann ist mir das egal.

Ohne den ganzen Aufwand ist der Fehler bei 25% und du sparst dir Monate an Lebenszeit. Lohnt sich das wirklich?

Man kann auch was dabei lernen und das ist mir der Aufwand wert.

Möchtest du einfach nur die Tagessumme oder auch den Zeitverlauf über den Tag schätzen?

Also prinzipiell würde mir die Tagessumme reichen. Man kann natürlich überlegen, ob man auf Stundenwerte gezht, weil man dann über den Tibbertarif und den Speicherverlauf optimieren könnte.
Also die aggregierten Werte bekomme ich ja erst mal mit dem folgendeneinfachen Befehlen aus der Datenbank in eine csv-Datei

$werte = AC_GetAggregatedValues(54833, 54245, 0 /*Stündlich*/, mktime(0, 0, 0, 1, 1, 2019), mktime(23, 59, 59, 12, 31, 2023), 0);
file_put_contents("c:\timeseries.csv", serialize($werte));

Das wäre halt der ganz einfache Weg. Allerdings ist das Format der Datei alles andere als geeignet in einem Fremdsystem damit zu arbeiten. Das können die anderen Programme nicht ohne Aufwand direkt lesen.

a:14585:{i:0;a:7:{s:8:"Duration";i:3600;s:9:"TimeStamp";i:1704060000;s:3:"Avg";d:0.6735881056891544;s:7:"MinTime";i:1704060125;s:3:"Min";d:0.5676921997070312;s:7:"MaxTime";i:1704063365;s:3:"Max";d:1.5864699707031251;}i:1;a:7:{s:8:"Duration";i:3600;s:9:"TimeStamp";i:1704056400;s:3:"Avg";d:0.654364102596.....

ich bräuchte eigentlich nur eine CSV-Datei, die folgendermaßen aussieht

Zeit; Wert
01.01.2019 00:00:00; 1234,00
01.01.2019 01:00:00; 2345,00
..
..
25.01.2024 23:00:00; 9876,00

Gibt es da eine elgante Formatierungslösung beim Speichern oder muss ich mir dann zum Beispiel die AVG Werte in ein extra Array schreiben und den timestamp in eine String umrechnen und dann alles händisch an die Datei anhängen?

Hier mal quick & dirty um dein gewünschtes Format zu schreiben, geht vielleicht auch einfacher:

$archiveID = 18193;
$dataID = 43305;

$dataarray = AC_GetAggregatedValues($archiveID, $dataID, 0 /*Stündlich*/, mktime(0, 0, 0, 12, 31, 2023), mktime(23, 59, 59, 12, 31, 2023), 0);
foreach ($dataarray as $data) {
    $datatime = date("d.m.y H:i:s", $data["TimeStamp"]);
    $datavalue = $data["Avg"];
    echo (sprintf ("%s; %s\n",$datatime,$datavalue));
}
1 „Gefällt mir“

Danke. Das passt doch schon super. Mal schauen, wie die Qualität der Prognose mit Tensorflow ist.
Ich hab halt erst 1,5 Jahre an verlässlichen Vebrauchsdaten.

Ich muss hier nochmal nachhaken, weil ich ein aggregationsproblem habe.
Ich logge meinen aktuellen Hausverbrauch in kW als Standardvariable. Nun hätte ich aber gern für jeden Tag den Verbrauch in kWh, also als Zähler. Da ich ja eine Variable nur als Standard oder Zähler loggen kann, frage ich mich jetzt, wie ich das am elegantesten anstelle. Ich müsste ja alle geloggten Werte aus dem Archiv auslesen und mit dem Loggingintervall in kWh bzw kWs umrechen und dann aufsummieren.
Hat jemand eine elgantere Idee?

Du loggst den Zählerstand als normale Variable, also nicht als Zähler?

Ausgehend von dem Code, den ich oben gepostet hatte, könntest du den maximalen und minimalen Zählerstand jedes Tages abfragen, das wäre $data[„Max“] und $data[„Min“]. Die Differenz ist dann der Tagesverbrauch. Aggregationsstufe dabei auf 1 = täglich einstellen.

Hier gibt’s die Beschreibung:

Viel Erfolg!
Volker

Nein es ist kein Zähler. Es sind Momentanwerte der Leistung in kW und ich brauche das Integral in kWh über den Tag.

Das dürfte nicht sinnvoll funktionieren, weil die Leistung so schnell schwanken kann dass man extrem viele Datenpunkt benötigen würde. Das wird selbst mit minütlichen Werten schon arg ungenau. Ich halte das für einen Irrweg, völlig unabhängig von der Auswertung in IPS.

Ich würde unbedingt schauen ob Gerät/Zähler zusätzlich zur Momentanleistung auch einen Zähler in kWh anbieten, den man auslesen kann.