Tageswerte abfragen

Hallo Community,

ist es möglich, über die REST API der Edgekomponente, die Tageswerte für Energykanäle abzufragen?
Also zum Beispiel für _sum/ProductionActiveEnergy die Differenz zwischen dem Wert um Mitternacht und jetzt zu bekommen?

Viele Grüße,
Martin Grüning

Ja, es gibt dafür zwei spezifische JSON-RPC Requests:

  1. Abfrage der Differenz für einen Zeitraum: queryHistoricTimeseriesEnergy

Beispielanwendung: History-Widgets im UI:
grafik

  1. Abfrage der Differenzen für einen Zeitraum je Periode: queryHistoricTimeseriesEnergyPerPeriod

Beispielanwendung: Energiemonitor in der Historie über einen längeren Zeitraum:

Gruß,
Stefan

Super, das wird helfen. Gehe ich recht in der Annahme, dass das nur geht wenn man eine InfluxDB-Datenbank als Timeseries-Instanz konfiguriert hat? Oder persistiert die Edge Komponente standardmässig Werte intern (z.B. mit rrd4j)?

Genau, es ist ein “Timedata”-Provider notwendig - also entweder InfluxDB oder RRD4j.

Automatisch wird keiner der beiden Provider aktiviert. RRD4j ist einfacher zu starten, weil er keine externen Abhängigkeiten hat. Für InfluxDB ist eine separate Installation von InfluxDB notwendig - die aber auch nicht kompliziert ist und dann eben z. B. über Grafana erweiterte Auswertungsmöglichkeiten unabhängig von OpenEMS ermöglicht.

Okay, Grafana/InfluxDB nutze ich sowieso.

Ich nutze allerdings die Version 2.0 (OSS und Cloud) von InfluxDB, die in wesentlichen Teilen neu geschrieben und nun mit ‘Flux’ eine wesentlich leistungsfähigere Query Language hat. Ich würde daher gerne den InfluxDB Connector auf den neuen Java Client umschreiben (https://github.com/influxdata/influxdb-client-java).

Dieser unterstützt jedoch nur Verbindungen zu InfluxDB-Datenbanken der Versionen 1.8+ und 2.0+. Das sind die aktuellen Versionen aus den 1.x und 2.x Branches, ab denen die Flux QL an Bord ist. Bislang nutze ich Telegraf als konvertierenden Mittelsmann, der Write Requests im Influx v1 Format entgegen nimmt und dann in zwei InfluxDB v2 Datenbanken schreibt. Der Telegraf-Influx-Listener ist aber “write only”, dass heisst er unterstützt keine lesenden Queries. Die aber möchte ich jetzt aus der Edge Instanz nutzen.

Dieses Provisorium würde ich deshalb gerne durch den neue geschriebenen Connector ablösen. Meine Frage: soll ich den neuen Client ergänzend oder ersetzend in die Codebase einbringen? Oder die Komplexität gehen eine einzige Connectorklasse zu haben, die unter der Haube zwei unterschiedliche Client Libraries integriert (fände ich unnötig komplex und eher schwierig zu maintainen, weil komplex zu testen).

Ergänzend hätte den Vorteil, dass man nicht gezwungen wird alte InfluxDB Stände auf mindestens 1.8 upzudaten, aber den Nachteil dass es verwirren könnte zwei Clients für das gleiche zu haben. Hier bitte ich um einen Ratschlag, welchen Weg ich wählen soll.

Den Umstieg auf Version 2 habe ich mich bisher noch nicht getraut und wollte das Release erst etwas “reifen” lassen.

Aufgrund der Unterschiede wird der sinnvollste Weg wohl sein, eine komplett neue InfluxDB-Komponente zu erstellen. Grundsätzlich dürfte das unkompliziert sein; nur war es leider bei der alten Java-Bibliothek aufgrund der vielen Abhängigkeiten relativ schwer, diese “OSGi-Kompatibel” zu machen.

Hi Martin, hast du dich an den Influx2.0 Connector bereits herangewagt? Ich hätte hieran ebenfalls Interesse. Viele Grüße aus Freiburg!

Nein, mir fehlte bislang schlicht die Zeit. Bislang behelfe ich mir mit einem InfluxDBv1 Listener mittel Telegraf. Telegraf schreibt dann die Daten in zwei InfluxDBv2 Instanzen (in der Cloud und on Premise). Das Konstrukt hat sich bewährt. Da nun OpenEMS auch MQTT kann, wäre das auch ein einfacher Weg,um Daten nach InfluxDB zu bekommen OpenEMS → MQTT → Telegraf → InfluxDBv2. Es führen viele Wege nach Rom, da war mir der native Connector einfach nicht wichtig genug.

Hallo Simon,

ich habe einen Pull-Request dazu gestartet und auch die neue Java-Bibliothek eingebunden. Ich kenne mich allerdings mit der neuen Abfragesprache Flux nicht aus. Hättest du Interesse gemeinsam daran weiter zu arbeiten?

Gruß,
Stefan

Ich bin auch recht fit in Flux und helfe gerne mit. Flux ist aus meiner Sicht für Timedata ein großer Sprung nach vorne vs. SQL.

Hallo Stefan, hallo Martin,

gerne bringe ich mich hier auch ein - ich experimentiere gerade noch mit der Inbetriebnahme einer Test-Infrastruktur. Die Anbindung an ein entsprechendes Influx2 Timedata-Backend steht auf der Liste :wink:

Grüße!

Hallo zusammen,

ich hoffe, es ist ok, wenn ich diesen alten Thread hervorhole. Es ist genau meine Frage und ich habe nichts Neueres dazu gefunden.

Ich möchte gerne

  • über die REST API
  • aus einem FEMS-System
  • Summenwerte für einen bestimmten Zeitraum (z.B. erzeugte Energiemenge)
  • mit Python

abfragen. Also im Grunde genau das, was queryHistoricTimeseriesEnergy leistet.

Meine Fragen:

  • Geht das auch mit FEMS oder nur mit OpenEMS?
  • Falls ja: Wie genau muss der REST-API-Call aussehen? Ein konkretes Beispiel wäre eine große Hilfe für mich.

Danke für jede Antwort.

Viele Grüße

Fabian Bühler

Hallo,

sieh dir doch gerne mal die Doku von Fenecon dazu an.

https://docs.fenecon.de/_/en/fems/fems-app/OEM_App_REST_JSON.html

Grüße!

Das habe ich gelesen und ich kann auch wie dort beschrieben einzelne Werte aus den Channels abrufen. Was mir nicht gelingt ist, das auf einen komplexeren Fall wie die Abfrage der Summenwerte für einen Zeitraum zu übertragen. Ich bin mir auch nicht sicher, ob das in FEMS überhaupt geht.

Mein Ansatz:

REST_USER = "x"
REST_PASSWORD = "user"
url='http://192.168.178.83:80/jsonrpc'
headers = {'jsonrpc': "2.0",
    'Content-Type': 'application/json',
        }
body = {"method": "queryHistoricTimeseriesEnergy",
        "params": {"timezone": "Europe/Berlin",
                   "fromDate": "2024-03-27T00:00:00",
                   "toDate": "2024-03-27T23:59:59",
                   "channels": "_sum/ProductionActiveEnergy"}
        }
session = requests.Session()
session.auth = (REST_USER, REST_PASSWORD)
response = session.post(url, json=body)

response.raise_for_status()
session.close()
response.text

Die response enthält lediglich eine leere html-Seite, kein json-Format, wie erwartet.

So wie ich das aktuell verstehe gibt es auch keine Methode “queryHistoricTimeseriesEnergy” die du von außerhalb an den /jsonrpc Endpoint senden kannst, weder im openEMS, noch im FEMS.

Siehe hier:

Was mir komisch erscheint, ist, dass auch diese Methode " getEdgeConfig" nicht funktioniert…

@stefan.feilmeier machen wir da was falsch?

import requests
import json
from requests.auth import HTTPBasicAuth

# Basic configuration
url = 'http://192.168.178.100:80/jsonrpc'
headers = {
    'Content-Type': 'application/json',
}

username = 'x'
password = 'owner'

body = {
    "method": "getEdgeConfig",
    "params": {},
}

response = requests.post(url, data=json.dumps(body), headers=headers, auth=HTTPBasicAuth(username, password))

try:
    response.raise_for_status()

    json_response = response.json()
    print(json.dumps(json_response, indent=4))
except requests.exceptions.HTTPError as err:
    print(f"HTTP Error: {err}")
except ValueError:
    print("Response:", response.text)

Ok, danke. Dann habe ich das wohl missverstanden. Ich hatte den Post oben so gelesen, dass der Zugriff über die REST-API möglich sein soll.
Gibt es dann überhaupt irgendeine Möglichkeit unter Umgehung der UI an die Summenwerte zu kommen?

Das wäre eine Frage an @stefan.feilmeier

Wobei ich das fast nicht glaube, nein