Seite 1 von 2
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...
Re: txt-Datei auslesen
Verfasst: 23. Feb 2025 13:55
von mad-mike
Edit:
Ich habe es Online, und nun bekomme ich auch Daten rein.
Nur Wie bekomme ich das jetzt in Zahlen für Heute und Morgen??
Ich habe ein String ITEM und da kommt dieses hier:
Code: Alles auswählen
{"preferredNextApiRequestAt":{"secondOfHour":2083,"epochTimeUtc":1740324883},"status":0,"iLastPredictionGenerationEpochTime":1740322929,"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 > HIER","data":{"20250223":12.909,"20250224":8.385}}
Nun steht weit unten: data... Ich denke das ich hier 2 Number ITEM brauche??
Re: txt-Datei auslesen
Verfasst: 23. Feb 2025 20:08
von udo1toni
Schau mal, so sieht das "hübsch" formatiert aus:
Code: Alles auswählen
{
"preferredNextApiRequestAt": {
"secondOfHour": 2083,
"epochTimeUtc": 1740324883
},
"status": 0,
"iLastPredictionGenerationEpochTime": 1740322929,
"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 > HIER",
"data": {
"20250223": 12.909,
"20250224": 8.385
}
}
Du kannst also aus dem Datum, an dem Du die Abfrage sendest, rückschließen, wie die beiden Datenpunkte heißen (JJJJMMTT für heute und morgen)
In einem Thing gibt es die Möglichkeit, das per Script Transfoprmation zu ermitteln, aber irgendwie erscheint mir das reichlich zerrupft.
Meine Empfehlung: Schreibe eine Rule, welche die Daten direkt per http Request holt (ohne Thing) und nutze innerhalb der Rule den JSONPATH transformation service mit den errechneten Feldnamen (die kennst Du ja jeweils, bzw. kannst sie anhand des aktuellen Zeitstempels leicht bestimmen).
Die Daten kannst Du dann direkt in zwei Number:Energy Items schreiben.
Re: txt-Datei auslesen
Verfasst: 27. Feb 2025 19:12
von mad-mike
In einem Thing gibt es die Möglichkeit, das per Script Transfoprmation zu ermitteln, aber irgendwie erscheint mir das reichlich zerrupft.
Meine Empfehlung: Schreibe eine Rule, welche die Daten direkt per http Request holt (ohne Thing) und nutze innerhalb der Rule den JSONPATH transformation service mit den errechneten Feldnamen
Und wie??
Ich habe nun seit einigen Abenden mich versucht in diese Thematik einzulesen, aber irgendwie bekomme ich immer nur Fehlermeldungen...
Ich habe ein Channel - String und Number erstellt....
Dann habe ich jeweils ein Item Verlinkt und versucht über das Profil an die Werte zu kommen...
Bei den Item String kommt entweder alles, oder garnichts. Nur ein wert der hinter ""Data"" steht, habe ich nicht erstellen können.
Und wie ich eine Profil Script Rule erstellen kann, weiss ich nicht. Bei meinem Versuch hat openHAB gejammert... ich habe versucht den String mittel ""split"" an die werte zu kommen??
Oder wird das nicht in ein Profil hinterlegt?
Danke und Gruss