Daten einer Webseite auslesen

Einrichtung, Nutzung und Hilfe zu RaspberryMatic (OCCU auf Raspberry Pi)

Moderatoren: jmaus, Co-Administratoren

jp112sdl
Beiträge: 12085
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 847 Mal
Danksagung erhalten: 2139 Mal
Kontaktdaten:

Re: Daten einer Webseite auslesen

Beitrag von jp112sdl » 16.01.2023, 09:12

Ich kann mich erinnern, dass das bei mir schon mal nicht geklappt hat und ich mich irre gesucht habe, weil ich mich an dem "+"-Zeichen aus anderen Sprachen orientiert hatte.

Den Punkt in der Doku, dass + auch für string gehen soll, weiter oben, habe ich tatsächlich übersehen.

Ein Test selbst mit varianten Datentypen

Code: Alles auswählen

var a = '0';
var b = a + "1" # "2";
WriteLine(b);

012
gibt die Zeichenfolge korrekt aus. Auch wenn man + und # mischt.

Mag sein, dass das mit der ReGa vor 5-6 Jahren noch nicht so ging.

Deshalb frug ich ja hier noch mal nach :)

Aber wenn auch Jens sagt, dass # der safe way ist, dann... muss eQ-3 mal die Doku ändern. :wink:

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Daten einer Webseite auslesen

Beitrag von Tyfys » 16.01.2023, 10:21

jmaus hat geschrieben:
16.01.2023, 09:09
Du willst anscheinend nicht hören! Ich sagte doch recht klar das man für string concat nur '#' nehmen sollte.
Das klingt doch sehr nach Oberlehrer......
Gruß
Harry

Benutzeravatar
jmaus
Beiträge: 9818
Registriert: 17.02.2015, 14:45
System: Alternative CCU (auf Basis OCCU)
Wohnort: Dresden
Hat sich bedankt: 459 Mal
Danksagung erhalten: 1855 Mal
Kontaktdaten:

Re: Daten einer Webseite auslesen

Beitrag von jmaus » 16.01.2023, 11:09

Tyfys hat geschrieben:
16.01.2023, 10:21
jmaus hat geschrieben:
16.01.2023, 09:09
Du willst anscheinend nicht hören! Ich sagte doch recht klar das man für string concat nur '#' nehmen sollte.
Das klingt doch sehr nach Oberlehrer......
Nein, das klingt nach der Antwort des aktuellen Entwicklers der Skriptengine (ReGaHss), der ich nunmal bin. :mrgreen:
RaspberryMatic 3.75.6.20240316 @ ProxmoxVE – ~200 Hm-RF/HmIP-RF/HmIPW Geräte + ioBroker + HomeAssistant – GitHub / Sponsors / PayPal / ☕️

7thguest
Beiträge: 82
Registriert: 06.02.2015, 21:32
System: CCU
Wohnort: Niedersachsen
Hat sich bedankt: 5 Mal

Re: Daten einer Webseite auslesen

Beitrag von 7thguest » 18.01.2023, 15:29

Henke hat geschrieben:
15.01.2023, 22:19
... Vollzitat raus genommen
Edit 1: + >> #
Edit2: Überflüssige { entfernt, thx Tyfys
Hallo Henke!

Vielen Dank dafür - das funktioniert hervorragend! (Um das Analysieren der Skripte auf der Webseite brauche ich mir keine Gedanken machen. Ich habe mir den Quelltext anzeigen lassen - war damit aber weit überfordert :( )

Das Ganze läuft jetzt täglich um 14:30, da ab 14:00 die Daten für den nächsten Tag angeboten werden.
Ich habe die "date"-Abfrage auch aus dem Systemdatum genommen und diese schon so angepasst, dass automatisch 1 Tag dazugerechnet wird. (Auch das nur durch Suche im Forum und copy-paste und try-and-error)

Jetzt habe ich die Systemvariable mit dem gesamten Text darin.
Nun wollte ich probieren, nur die Werte, die hinter "e_price_epex_excl_vat" stehen, in eine Liste mit entsprechendem Trennzeichen zu bringen.

Das wäre ja hier

Code: Alles auswählen

0.394,0.171,0.41 usw.
Insgesamt also 24 Werte.

Dabei scheitere ich allerdings wieder an meiner grandiosen Skript-Unkenntnis.

Da ich ja bereits jede Stunde (genauer xx:59) den Stromverbrauch der soeben vergangenen Stunde berechne (Das habe ich selbst hinbekommen und es funktioniert auch :) ), könnte ich mir dann aus der Liste den Preis raussuchen, der zu dieser Stunde gültig war, mit den verbrauchten kWh multiplizieren und wüsste dann, was mich die vergangene Stunde gekostet hat.

Könnt ihr mir helfen, eine solche Liste aus der Textvariable zu erstellen?

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Daten einer Webseite auslesen

Beitrag von Tyfys » 18.01.2023, 15:48

wenn du dieses am Ende des Skripts von Henke anfügts
bekommst du den aktuellen Stunden Preis ausgeworfen:

Code: Alles auswählen

!Segment für Uhrzeit von suchen
string datum = localtime.Format("%Y-%m-%d 00:00:00").ToTime().ToInteger();
string stdvon = (datum + (3600.0 * localtime.Hour())).ToTime();
string stdbis = (stdvon + 3600).ToTime();
var such1 = '"start_timestamp": "' # stdvon # '"';
var such2 = '}';
string res = ((stdout.Substr(stdout.Find(such1)))).Substr(0, ((stdout.Substr(stdout.Find(such1))).Find(such2)));
!nun den entsprechenden Preis suchen
such1 = '"e_price_epex_excl_vat":';
such2 = ',';
string preis = res.Substr(res.Find(such1) + such1.Length()).Substr(0, (res.Substr(res.Find(such1) + such1.Length()).Find(such2)));

WriteLine("Zeiraum "# stdvon # " bis "# stdbis);
preis = preis.ToFloat();
WriteLine("Preis: "# preis.ToString(3));
Wenn du alle Werte auf einmal wissen willst, bist du mit dem Skript von MichaelN besser bedient.
Gruß
Harry

7thguest
Beiträge: 82
Registriert: 06.02.2015, 21:32
System: CCU
Wohnort: Niedersachsen
Hat sich bedankt: 5 Mal

Re: Daten einer Webseite auslesen

Beitrag von 7thguest » 18.01.2023, 15:59

Tyfys hat geschrieben:
18.01.2023, 15:48
wenn du dieses am Ende des Skripts von Henke anfügts
bekommst du den aktuellen Stunden Preis ausgeworfen:

Wenn du alle Werte auf einmal wissen willst, bist du mit dem Skript von MichaelN besser bedient.
Okayyyyyy - da ich gerade nicht an der CCU bzw am Raspi sitze, kann ich das Ganze leider gar nicht nachvollziehen.
Ich baue mir dann immer irgendwo "WriteLine xxx" ein, damit ich wenigstens versuchen kann zu verstehen, was da grad passiert :?

Allerdings wollte ich aus der Rückgabe der Webseite gern eine (Text)Liste erstellen lassen, die letztlich nur die 24 Zahlen (natürlich in der richtigen Reihenfolge) enthält und diese als Systemvariable abspeichern. Den restlichen Text der Rückgabe benötige ich nicht.
Anhand der Reihenfolge ist auch klar, dass z.B. Listenelement 4 für die Zeit von 4-5 Uhr steht.

Damit wäre es möglich, in dem anderen Skript den jeweiligen Stundenverbrauch * das Xte Listenelement = Preis der Stunde zu errechnen.

Also etwa das Format:

14.3,8.58,x.xx,y.yy, usw

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Daten einer Webseite auslesen

Beitrag von Tyfys » 18.01.2023, 16:39

falls du das in der Art meinst :

Code: Alles auswählen

!Basiert auf Skript von Henke
string date = localtime.Format("%Y%m%d");
string url = 'https://eex.stwhas.de/' # "json_files/auction_spot_prices_germany_luxembourg_" # date + ".json";

WriteLine(url);
string stdout;
string stderr;
system.Exec("wget -q -O - '" # url # "'",  & stdout,  & stderr);
if (stderr) {
    WriteLine("Err " # stderr);
    quit;
}
string std;
string allepreise="";
foreach(std,system.GenerateEnum(0, 23 )) {
!Segment für Uhrzeit von suchen
string datum = localtime.Format("%Y-%m-%d 00:00:00").ToTime().ToInteger();
string stdvon = (datum + (3600.0 * std.ToInteger())).ToTime();
string stdbis = (stdvon + 3600).ToTime();
var such1 = '"start_timestamp": "' # stdvon # '"';
var such2 = '}';
string res = ((stdout.Substr(stdout.Find(such1)))).Substr(0, ((stdout.Substr(stdout.Find(such1))).Find(such2)));
!nun den entsprechenden Preis suchen
such1 = '"e_price_epex_excl_vat":';
such2 = ',';
string preis = res.Substr(res.Find(such1) + such1.Length()).Substr(0, (res.Substr(res.Find(such1) + such1.Length()).Find(such2)));

Write("Zeiraum "# stdvon # " bis "# stdbis);
preis = preis.ToFloat();
WriteLine("\tPreis: "# preis.ToString(3));
allepreise = allepreise #  preis.ToString(3) #";";
}
allepreise =allepreise.RTrim(";");
WriteLine("alle Preise: "# allepreise);
ergibt dann:

Code: Alles auswählen

https://eex.stwhas.de/json_files/auction_spot_prices_germany_luxembourg_20230118.json
Zeiraum 2023-01-18 00:00:00 bis 2023-01-18 01:00:00	Preis: 12.285
Zeiraum 2023-01-18 01:00:00 bis 2023-01-18 02:00:00	Preis: 12.468
Zeiraum 2023-01-18 02:00:00 bis 2023-01-18 03:00:00	Preis: 12.464
Zeiraum 2023-01-18 03:00:00 bis 2023-01-18 04:00:00	Preis: 12.287
Zeiraum 2023-01-18 04:00:00 bis 2023-01-18 05:00:00	Preis: 11.991
Zeiraum 2023-01-18 05:00:00 bis 2023-01-18 06:00:00	Preis: 12.660
Zeiraum 2023-01-18 06:00:00 bis 2023-01-18 07:00:00	Preis: 15.272
Zeiraum 2023-01-18 07:00:00 bis 2023-01-18 08:00:00	Preis: 17.169
Zeiraum 2023-01-18 08:00:00 bis 2023-01-18 09:00:00	Preis: 18.867
Zeiraum 2023-01-18 09:00:00 bis 2023-01-18 10:00:00	Preis: 18.311
Zeiraum 2023-01-18 10:00:00 bis 2023-01-18 11:00:00	Preis: 16.125
Zeiraum 2023-01-18 11:00:00 bis 2023-01-18 12:00:00	Preis: 15.245
Zeiraum 2023-01-18 12:00:00 bis 2023-01-18 13:00:00	Preis: 14.087
Zeiraum 2023-01-18 13:00:00 bis 2023-01-18 14:00:00	Preis: 14.124
Zeiraum 2023-01-18 14:00:00 bis 2023-01-18 15:00:00	Preis: 14.233
Zeiraum 2023-01-18 15:00:00 bis 2023-01-18 16:00:00	Preis: 15.269
Zeiraum 2023-01-18 16:00:00 bis 2023-01-18 17:00:00	Preis: 15.381
Zeiraum 2023-01-18 17:00:00 bis 2023-01-18 18:00:00	Preis: 16.464
Zeiraum 2023-01-18 18:00:00 bis 2023-01-18 19:00:00	Preis: 15.896
Zeiraum 2023-01-18 19:00:00 bis 2023-01-18 20:00:00	Preis: 13.355
Zeiraum 2023-01-18 20:00:00 bis 2023-01-18 21:00:00	Preis: 13.748
Zeiraum 2023-01-18 21:00:00 bis 2023-01-18 22:00:00	Preis: 13.147
Zeiraum 2023-01-18 22:00:00 bis 2023-01-18 23:00:00	Preis: 12.899
Zeiraum 2023-01-18 23:00:00 bis 2023-01-19 00:00:00	Preis: 11.268
alle Preise: 12.285;12.468;12.464;12.287;11.991;12.660;15.272;17.169;18.867;18.311;16.125;15.245;14.087;14.124;14.233;15.269;15.381;16.464;15.896;13.355;13.748;13.147;12.899;11.268
in allepreise stehen dann die Werte mit Semikolon getrennt.
Gruß
Harry

7thguest
Beiträge: 82
Registriert: 06.02.2015, 21:32
System: CCU
Wohnort: Niedersachsen
Hat sich bedankt: 5 Mal

Re: Daten einer Webseite auslesen

Beitrag von 7thguest » 18.01.2023, 16:45

Jap, genau das meinte ich - die Zeile "allepreise" - DAAANKE :D
Ich werde zu Hause gleich mal versuchen, ob ich das nachvollziehen kann :?

Zersch
Beiträge: 43
Registriert: 08.02.2019, 08:33
Hat sich bedankt: 7 Mal
Danksagung erhalten: 2 Mal

Re: Daten einer Webseite auslesen

Beitrag von Zersch » 26.02.2023, 19:07

Hi. Bis jetzt hat das bei mir nachvollziehbar geklappt.

Ist es möglich aus den ausgegeben Zeitraum die Stunde mit dem niedrigsten Preis herauszusuchen und den Anfang dieses Zeitraums als Startzeit für ein Programm zu übergeben?

Tyfys
Beiträge: 531
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 26 Mal
Danksagung erhalten: 121 Mal

Re: Daten einer Webseite auslesen

Beitrag von Tyfys » 26.02.2023, 20:00

Zersch hat geschrieben:
26.02.2023, 19:07
Ist es möglich aus den ausgegeben Zeitraum die Stunde mit dem niedrigsten Preis herauszusuchen und den Anfang dieses Zeitraums
Eigentlich relativ einfach :

Code: Alles auswählen

!Basiert auf Skript von Henke
string date = localtime.Format("%Y%m%d");
string url = 'https://eex.stwhas.de/' # "json_files/auction_spot_prices_germany_luxembourg_" # date + ".json";

WriteLine(url);
string stdout;
string stderr;
system.Exec("wget -q -O - '" # url # "'",  & stdout,  & stderr);
if (stderr) {
    WriteLine("Err " # stderr);
    quit;
}
real bestpreis= 9999999.99999;
integer beststdvon= -1.00;
integer beststdbis= -1.00;
string std;
string allepreise="";
foreach(std,system.GenerateEnum(0, 23 )) {
!Segment für Uhrzeit von suchen
string datum = localtime.Format("%Y-%m-%d 00:00:00").ToTime().ToInteger();
string stdvon = (datum + (3600.0 * std.ToInteger())).ToTime();
string stdbis = (stdvon + 3600).ToTime();
var such1 = '"start_timestamp": "' # stdvon # '"';
var such2 = '}';
string res = ((stdout.Substr(stdout.Find(such1)))).Substr(0, ((stdout.Substr(stdout.Find(such1))).Find(such2)));
!nun den entsprechenden Preis suchen
such1 = '"e_price_epex_excl_vat":';
such2 = ',';
string preis = res.Substr(res.Find(such1) + such1.Length()).Substr(0, (res.Substr(res.Find(such1) + such1.Length()).Find(such2)));

!besten Preis und Zeitraum merken
if (preis.ToFloat() < bestpreis) {
    bestpreis = preis;
    beststdvon = stdvon;
    beststdbis = stdbis;
}

Write("Zeiraum "# stdvon # " bis "# stdbis);
preis = preis.ToFloat();
WriteLine("\tPreis: "# preis.ToString(3));
allepreise = allepreise #  preis.ToString(3) #";";
}

!besten Preis und Zeitraum ausgeben
WriteLine( "\nbester Preis ist "#bestpreis# " EURO  von " #beststdvon #" bis "#beststdbis #"\n");
allepreise =allepreise.RTrim(";");
WriteLine("alle Preise: "# allepreise);
Zersch hat geschrieben:
26.02.2023, 19:07
den Anfang dieses Zeitraums als Startzeit für ein Programm zu übergeben?
Da steckt das Problem.

Du kannst die Zeit z.B. in eine Systemvariable schreiben.
Und ein Programm erstellen, dass diese Systemvariable stündlich abfragt.

Möglicherweise haben die Mitforisten da noch eine bessere Idee.

EDIT: in Ausgabezeile 1x beststdbis durch beststdvon ersetzt
Zuletzt geändert von Tyfys am 26.02.2023, 21:15, insgesamt 1-mal geändert.
Gruß
Harry

Antworten

Zurück zu „RaspberryMatic“