PV Erzeugung über forecast.solar

Allgemeine Fragen rund um die "Smart Home" Hardware/Komponenten

Moderatoren: seppy, udo1toni

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

PV Erzeugung über forecast.solar

Beitrag von Quautiputzli »

Hallo,

ich lese derzeit die voraussichtlichen Erzeugungsdaten der PV über forecast.solar in den Volkszähler ein. Nun möchte ich es gerne über openHAB realisieren. Ich scheitere doch über der JSON Antwort. Die sieht folgendermaßen aus:

Code: Alles auswählen

{
  "result": {
    "watts": {
      "2021-08-29 06:16:00": 0,
      "2021-08-29 07:08:00": 11,
      "2021-08-29 08:00:00": 92,
      "2021-08-29 09:00:00": 308,
      "2021-08-29 10:00:00": 605,
      "2021-08-29 11:00:00": 907,
      "2021-08-29 12:00:00": 1129,
      "2021-08-29 13:00:00": 1269,
      "2021-08-29 14:00:00": 1345,
      "2021-08-29 15:00:00": 1291,
      "2021-08-29 16:00:00": 1107,
      "2021-08-29 17:00:00": 864,
      "2021-08-29 18:00:00": 583,
      "2021-08-29 19:00:00": 286,
      "2021-08-29 20:00:00": 32,
      "2021-08-29 20:03:00": 5,
      "2021-08-29 20:06:00": 0,
      "2021-08-30 06:17:00": 0,
      "2021-08-30 07:09:00": 11,
      "2021-08-30 08:00:00": 86,
      "2021-08-30 09:00:00": 308,
      "2021-08-30 10:00:00": 599,
      "2021-08-30 11:00:00": 902,
      "2021-08-30 12:00:00": 1129,
      "2021-08-30 13:00:00": 1269,
      "2021-08-30 14:00:00": 1339,
      "2021-08-30 15:00:00": 1285,
      "2021-08-30 16:00:00": 1118,
      "2021-08-30 17:00:00": 875,
      "2021-08-30 18:00:00": 583,
      "2021-08-30 19:00:00": 275,
      "2021-08-30 19:32:00": 38,
      "2021-08-30 20:04:00": 0
    },
    "watt_hours": {
      "2021-08-29 06:16:00": 0,
      "2021-08-29 07:08:00": 10,
      "2021-08-29 08:00:00": 89,
      "2021-08-29 09:00:00": 397,
      "2021-08-29 10:00:00": 1002,
      "2021-08-29 11:00:00": 1909,
      "2021-08-29 12:00:00": 3038,
      "2021-08-29 13:00:00": 4307,
      "2021-08-29 14:00:00": 5652,
      "2021-08-29 15:00:00": 6943,
      "2021-08-29 16:00:00": 8050,
      "2021-08-29 17:00:00": 8914,
      "2021-08-29 18:00:00": 9497,
      "2021-08-29 19:00:00": 9783,
      "2021-08-29 20:00:00": 9815,
      "2021-08-29 20:03:00": 9816,
      "2021-08-29 20:06:00": 9816,
      "2021-08-30 06:17:00": 0,
      "2021-08-30 07:09:00": 10,
      "2021-08-30 08:00:00": 83,
      "2021-08-30 09:00:00": 391,
      "2021-08-30 10:00:00": 990,
      "2021-08-30 11:00:00": 1892,
      "2021-08-30 12:00:00": 3021,
      "2021-08-30 13:00:00": 4290,
      "2021-08-30 14:00:00": 5629,
      "2021-08-30 15:00:00": 6914,
      "2021-08-30 16:00:00": 8032,
      "2021-08-30 17:00:00": 8907,
      "2021-08-30 18:00:00": 9490,
      "2021-08-30 19:00:00": 9765,
      "2021-08-30 19:32:00": 9785,
      "2021-08-30 20:04:00": 9785
    },
    "watt_hours_day": {
      "2021-08-29": 9816,
      "2021-08-30": 9785
    }
  },
  "message": {
    "code": 0,
    "type": "success",
    "text": "",
    "info": {
      "latitude": 49.0754,
      "longitude": 12.2096,
      "place": "93173 Wenzenbach, Landkreis Regensburg, Bayern, DE",
      "timezone": "Europe/Berlin"
    },
    "ratelimit": {
      "period": 3600,
      "limit": 12,
      "remaining": 8
    }
  }
}
Interessant für mich wären nun erstmal die beiden Werte unter "watt_hours_day". Wenn ich nun in der state Tronsformation

Code: Alles auswählen

JSONPATH:$.result.watt_hours_day.2021-08-29
eingebe bekomme ich auch den ersten Wert. Jedoch ändert sich dieses Datum ja täglich. Gibt es denn eine Möglichkeit, einfach den Wert der ersten bzw zweiten Zeile abzuholen?

Oder wäre es besser hier mit eine Javascript-transformation zu arbeiten? Bei einem Wechselrichter frage ich auch mit Javascript ab, wüsste aber nicht wie ich das abändern muss. So:

Code: Alles auswählen

(function(string){
    var data = JSON.parse(string);
    try {
        var value = data.Body.Data.Site.P_PV.toString();
    }
    catch (e) {
        var value = 0
    }
    return value;
  })(input)
Servus

Benutzeravatar
udo1toni
Beiträge: 13931
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Erzeugung über forecast.solar

Beitrag von udo1toni »

Eigentlich sollte $.result.watt_hours_day.[0] bzw. $.result.watt_hours_day.[1] funktionieren, allerdings liefert mir jsonpath.org da kein Ergebnis.
Vermutlich wird es darauf hinaus laufen, dass Du das Problem mehrstufig lösen musst. Du bekommst mit $.result.watt_hours_day.[*] einen String, der die Werte in Reihenfolge mit Komma getrennt enthält. Diesen kannst Du dann mit split() in den ersten und den zweiten Wert aufteilen. also so:

Code: Alles auswählen

(function(string){
    var data = JSON.parse(string);
    try {
        var value = data.result.watt_hours_day.[*];
    }
    catch (e) {
        var value = 0
    }
    var myval = value.split(",").get(0); // erster Wert oder
    var myval = value.split(",").get(1); // alternativ zweiter Wert
    return myval;
  })(input)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: PV Erzeugung über forecast.solar

Beitrag von Quautiputzli »

Mhm, krieg ich so auch nicht hin.
Seltsam ist, dass ich überhaupt keinen String auslesen kann, obwohl Channel und Item als String angelegt sind.

Bei

Code: Alles auswählen

JSONPATH:$.message.code
bekomme ich:

Code: Alles auswählen

1970-01-01T00:00:00.000+0000
also den Wert "0", ich weiß nicht warum er das immer in unixtime anezeigt.

Bei

Code: Alles auswählen

JSONPATH:$.message.type
bekomme ich:

Code: Alles auswählen

UNDEF
Servus

Benutzeravatar
udo1toni
Beiträge: 13931
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Erzeugung über forecast.solar

Beitrag von udo1toni »

An welcher Stelle setzt Du JSONPATH ein?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: PV Erzeugung über forecast.solar

Beitrag von Quautiputzli »

Hier das Thing:

Code: Alles auswählen

UID: http:url:forecast
label: forecast
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: https://api.forecast.solar
  refresh: 60
  commandMethod: GET
  timeout: 40000
  bufferSize: 2048
channels:
  - id: forecast_schupfa_e
    channelTypeUID: http:string
    label: forecast_schupfa_e
    description: ""
    configuration:
      stateExtension: /demo-key/estimate/51.15/10.45/30/0/5.json?time=seconds
      stateTransformation: JSONPATH:$.message.code
Servus

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: PV Erzeugung über forecast.solar

Beitrag von Quautiputzli »

Ich hab nun den Channel vom Typ String in dem Thing neu angelegt, nun bekomme ich auch wirklich Strings. Das klappt sowohl mit JASONPATH und auch mit Javascript.

Mit diesem Javascript:

Code: Alles auswählen

(function(string){
    var data = JSON.parse(string);
    var string = data["result"]["watt_hours_day"];
    return string;
  })(input)
bekomme ich dann:

Code: Alles auswählen

[object Object]
Erwarten würde ich:

Code: Alles auswählen

 {
      "2021-08-29": 9816,
      "2021-08-30": 9785
    }
Openhab kann das wohl nicht richtig anzeigen. Ich denke es muss erst weiter zerlegt werden. Jedoch schein der Befehl split nicht zu funktionieren. Ich hab es z.B so probiert:

Code: Alles auswählen

(function(string){
    var data = JSON.parse(string);
    var string = data["result"]["watt_hours_day"];
    var newstring = string.split[","];
    return newstring;
  })(input)


aber dort kommt dann der Fehler:

Code: Alles auswählen

2021-09-03 08:57:09.867 [WARN ] [.transform.SingleValueTransformation] - Executing transformation ChannelStateTransformation{pattern='forecast_solar.js', serviceName='JS'} failed: An error occurred while executing script. TypeError: Cannot read property "," from undefined in <eval> at line number 4
oder mit runden Klammern sowas:

Code: Alles auswählen

2021-09-03 09:02:11.023 [WARN ] [.transform.SingleValueTransformation] - Executing transformation ChannelStateTransformation{pattern='forecast_solar.js', serviceName='JS'} failed: An error occurred while executing script. TypeError: string.split is not a function in <eval> at line number 4
Ich hab es auch schon mit verschieden Zeichen/Möglchkeiten in der Klammer versucht, aber ich bekomme es nicht hin.

Wie muss man diesen String nun richtig zerlegen? Womöglch sogar auf 2mal, einmal mit ":" und einmal mit ","?
Servus

Benutzeravatar
udo1toni
Beiträge: 13931
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Erzeugung über forecast.solar

Beitrag von udo1toni »

Das Problem ist, die Rückgabe enthält immer noch ein JSON Objekt, das ist kein String. Ich bin mit noch nicht mal sicher, ob die Schreibweise für JSONPATH innerhalb von JavaScript so korrekt ist.
Mein Versuch dazu wäre

Code: Alles auswählen

var string = data.result.watt_hours_day["*"];
Was in der Theorie einen String zurückgeben sollte, der nur die beiden Werte enthält, also

Code: Alles auswählen

  9816,
  9785
Allerdings kann auch das immer noch ein Objekt != String sein. Ich bin in JavaScript nur ein Stümper und weiß nicht, wie man das verifizieren kann.
Aber eventuell wird ja auch kein Fehler mehr geschmissen und Du kannst nun einfach am Komma splitten.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: PV Erzeugung über forecast.solar

Beitrag von Quautiputzli »

Dann kommt als Antwort "null"
Servus

Benutzeravatar
udo1toni
Beiträge: 13931
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Erzeugung über forecast.solar

Beitrag von udo1toni »

Probier mal statt [„*“] einfach nur .* (Die Anführungszeichen stemmen vom iPad)


Gesendet von iPad mit Tapatalk
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: PV Erzeugung über forecast.solar

Beitrag von Quautiputzli »

Hab ich auch schon probiert

Code: Alles auswählen

2021-09-03 19:07:05.401 [WARN ] [.transform.SingleValueTransformation] - Executing transformation ChannelStateTransformation{pattern='forecast_solar_2.js', serviceName='JS'} failed: An error occurred while loading JavaScript. <eval>:3:43 Expected an operand but found *
Auch mit einfachen Anfürungszeichen und auch mit Fragezeichen hab ich probiert.

Ich muss mich da wohl etwas in das Javascript einlesen.
Servus

Antworten