Seite 1 von 1

txt-Datei auslesen

Verfasst: 26. Mär 2024 07:39
von webjochen
Hallo,

gibt es bei OpenHab eine Möglichkeit eine normale txt Datei auszulesen und in Variablen zu schreiben.
Meine txt Datei sieht wie folgt aus und liegt auf meiner Homepage:

20240326|58.178|20240327|17.911|20240328|24.673|20240329|26.066|20240330|17.432|

(PV-Prognose für die nächsten Tage)

Gruß Jochen

Re: txt-Datei auslesen

Verfasst: 26. Mär 2024 13:11
von udo1toni
Das einfachste wäre vermutlich, den kompletten String einzulesen (z.B. über das exec Binding) und anschließend in einer Rule zu zerlegen.
Die bessere Option wäre vermutlich, dafür zu sorgen, dass die Textdatei von vornherein ein besseres Format aufweist - oder anders gesagt: wo kommen die Daten denn ursprünglich her, wie wird die Textdatei gefüllt?

Re: txt-Datei auslesen

Verfasst: 26. Mär 2024 13:57
von webjochen
ursprünglich kommen die Daten von www.solarprognose.de per API,
ich habe es aber nicht geschafft es direkt von dort einzulesen.


API von dort sieht so aus:

[data] => SimpleXMLElement Object
( [item] => Array ( [0] =>
SimpleXMLElement Object ( [item] => Array ( [0] => 20240320 [1] => 48.92 ) ) [1] =>
SimpleXMLElement Object ( [item] => Array ( [0] => 20240321 [1] => 28.555 ) ) [2] =>
SimpleXMLElement Object ( [item] => Array ( [0] => 20240322 [1] => 41.867 ) ) [3] =>
SimpleXMLElement Object ( [item] => Array ( [0] => 20240323 [1] => 23.77 ) ) [4] =>
SimpleXMLElement Object ( [item] => Array ( [0] => 20240324 [1] => 27.039 ) ) ) ) )

Re: txt-Datei auslesen

Verfasst: 26. Mär 2024 14:46
von tim.l
Hey @webjochen,

die API unterstützt auch JSON:
http://www.solarprognose.de/web/de-de/s ... n/page/api

&_format=json|xml

Dies ist schöner auszulesen und kann einfach selektiert werden. Würde dann das HTTP Binding empfehlen und die Daten mit JSONPATH extrahieren. Das ist deutlich einfacher, als dies vorher durch z.B. ein PHP Skript zu kagen und dann noch relativ "unstrukturiert" in einer txt zu speichern.

Beste Grüße,
Tim

Re: txt-Datei auslesen

Verfasst: 28. Mär 2024 15:49
von webjochen
Hallo,

ich habe es versucht über json, aber irgendwie weis ich nicht genau wie ich das machen soll.
Ich habe ein HTTP Thing erstellt, aber glaube das funktioniert schon nicht?
Token habe ich in der URL geändert im original funktioniert die URL
Bildschirmfoto 2024-03-28 um 15.44.02.png
Bildschirmfoto 2024-03-28 um 15.44.11.png

Re: txt-Datei auslesen

Verfasst: 28. Mär 2024 19:31
von Harka
Moin,

ich habe gerade damit auch ein wenig rum gespielt. Mit der URL "https://www.solarprognose.de/web/solarp ... ormat=json" bekomme ich folgende Ausgabe

Code: Alles auswählen

{
  "preferredNextApiRequestAt": {
    "secondOfHour": 729,
    "epochTimeUtc": 1711649529
  },
  "status": 0,
  "iLastPredictionGenerationEpochTime": 1711646345,
  "weather_source_text": "Kurzfristig (3 Tage): Powered by <a href=\"https://www.weatherapi.com/\" title=\"Free Weather API\">WeatherAPI.com</a> und Langfristig (10 Tage): Powered by <a href=\"https://www.visualcrossing.com/weather-data\" target=\"_blank\">Visual Crossing Weather</a>",
  "datalinename": "Germany > xxxxxx",
  "data": {
    "20240328": 2.018,
    "20240329": 3.501
  }
}
Die API-Abfragen pro Tag (je nach Tarif) sind limitiert. Von daher ist Dein Aktivierungsintervall viel zu kurz.
Ich weiß jetzt nicht wie eine vernünftige Zuordnung der Werte unter data per Things erfolgen kann. Ich würde die Abfrage daher eher per Script abwickeln. Hier ein grobes Beispiel in Javascript (mit Blockly erstellt und noch ohne Fehlerabsicherungen)

Code: Alles auswählen

var url, Rueckgabe, oData, PlusTage, dictValue;
function HTTP_Get(URL) {
  return actions.HTTP.sendHttpGetRequest(URL, 3000);
}
url = 'https://www.solarprognose.de/web/solarprediction/api/v1?access-token=xxxxxxxxxxxxxxxx&type=daily&_format=json';
Rueckgabe = (JSON.parse(HTTP_Get(url)));
console.info(Rueckgabe);
oData = Rueckgabe['data'];
PlusTage = 0;
for (var dictValueKey in oData) {
  dictValue = oData[dictValueKey];
  // statt der folgenden Zeile eine Zuordnung der Werte an Items PrognoseTag0-1bzw.4
  console.info((['PrognoseTag_',PlusTage,' : ',dictValue].join('')));
  PlusTage = + 1;
}
Die Rule 1 bis 2 mal am Tag Zeitgesteuert aufrufen sollte reichen.

Re: txt-Datei auslesen

Verfasst: 28. Mär 2024 23:20
von udo1toni
Ein gutes Beispiel für eine schlechte API :)
Wobei, die API geht ja sogar, aber das gelieferte JSON ist einfach grauslig.
Bezogen auf die hourly Ausgabe:
Statt die Werte in benannten Feldern zu liefern, wird je Stunde ein Array geliefert. Die einzelnen Stunden sind benannt, wodurch man die Möglichkeit verliert, die einzelnen Stunden ohne Nennung des exakten Zeitpunkts zu extrahieren. Man muss also vor extrahieren der Daten die Daten bereits kennen...
Das fällt in die Kategorie "Warum nur?"
Der Zeitstempel dürfte übrigens UTC sein (die einzelnen Stunden gehen derzeit von 4 bis 17 Uhr, in unseren Breiten liefert die PV allerdings eher zwischen 6 und 19 Uhr Energie (also, momentan, falls die Sonne scheint...)

Da hat sich also jemand viel Mühe gemacht, aber ohne so richtig über das nachzudenken, was er da fabriziert...