Daten einer Webseite auslesen

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

Moderatoren: jmaus, Co-Administratoren

Benutzeravatar
shartelt
Beiträge: 7421
Registriert: 14.01.2015, 14:59
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 524 Mal
Danksagung erhalten: 753 Mal

Re: Daten einer Webseite auslesen

Beitrag von shartelt » 26.02.2023, 20:01

gibts nicht direkt bei den EVUs mit dynamischen Börsenpreisen die API mit den Zeiten für günstig und hoch?

meine in anderen Foren das gelesen zu haben…

MichaelN
Beiträge: 9679
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 700 Mal
Danksagung erhalten: 1626 Mal

Re: Daten einer Webseite auslesen

Beitrag von MichaelN » 26.02.2023, 20:25

Tyfys hat geschrieben:
26.02.2023, 20:00
Möglicherweise haben die Mitforisten da noch eine bessere Idee.
Wenn du einen unix Zeitstempel daraus machst, kannst du einen cuxd Timer stellen.
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Xel66
Beiträge: 14165
Registriert: 08.05.2013, 23:33
System: Alternative CCU (auf Basis OCCU)
Wohnort: Nordwürttemberg
Hat sich bedankt: 585 Mal
Danksagung erhalten: 1500 Mal

Re: Daten einer Webseite auslesen

Beitrag von Xel66 » 27.02.2023, 08:54

MichaelN hat geschrieben:
26.02.2023, 20:25
Wenn du einen unix Zeitstempel daraus machst...
Braucht man nicht. Man kann direkt eine Uhrzeit reinschreiben.

Gruß Xel66
-------------------------------------------------------------------------------------------
524 Kanäle in 146 Geräten und 267 CUxD-Kanäle in 34 CUxD-Geräten:
343 Programme, 334 Systemvariablen und 183 Direktverknüpfungen,
RaspberryMatic Version: 3.65.11.20221005 + Testsystem: CCU2 2.61.7
-------------------------------------------------------------------------------------------
Einsteigerthread, Programmlogik-Thread, WebUI-Handbuch

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 » 01.03.2023, 22:34

Danke für die Hilfestellung. Ich habe es jetzt hinbekommen die Preise vom folgenden Tag auszulesen und die Uhrzeit der günstigsten Stunde als Trigger zu verwenden mit Hilfe eines CUxD Timers. Danke nochmals

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 » 06.02.2024, 21:44

Ich hab ein Problem. Die aktuelle Homepage stellt keine Daten mehr bereit. Ich würde jetzt gerne umschwenken auf die Daten von Awattar. Ich weiß das Awattar in den JSON Daten mit Unix Timestamp arbeitet + 000 zusätzlich hinten dran. Ich konnte das Skript soweit zum laufen bringen das er mir die Daten ausgibt aber ich komme nicht mit weiter wie man dann mit dem Unixstempel die Daten heraus sortiert.

Code: Alles auswählen

integer VAR_TAGEPLUS = 1;
integer VAR_DATUMHEUTETEMP = system.Date("%F %X").ToTime().ToInteger();
integer VAR_DATUMCALC_TEMP = VAR_DATUMHEUTETEMP + (86400 * VAR_TAGEPLUS);
string VAR_DATUMCALC = VAR_DATUMCALC_TEMP.ToTime().Format("%Y%m%d");
string VAR_DATUMSUCHEN = VAR_DATUMCALC_TEMP.ToTime().Format("%Y-%m-%d 00:00:00");
WriteLine(VAR_DATUMCALC);
!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_" # VAR_DATUMCALC + ".json";

string stdout;
string stderr;
system.Exec("wget -q -O - '" # url # "'",  & stdout,  & stderr);

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 = VAR_DATUMSUCHEN.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;
}
preis = preis.ToFloat();
allepreise = allepreise #  preis.ToString(3) #";";
}

!besten Preis und Zeitraum ausgeben
WriteLine( "\nbester Preis ist "#bestpreis# " EURO  von " #beststdvon #" bis "#beststdbis #"\n");
string CUXDTimer = beststdvon.Format("%H:%M:%S");  ! sDate = "18:00:00"
WriteLine(CUXDTimer)
allepreise =allepreise.RTrim(";");
integer VAR_Timer = CUXDTimer.ToTime().ToInteger();
integer VAR_TimerCalc = VAR_Timer - (7080);
string TimerCalcFertig = VAR_TimerCalc.ToTime().Format("%H:%M:%S");
dom.GetObject("Stromboerse Bestpreis").State(CUXDTimer);
dom.GetObject("CUxD.CUX2800001:2.TIMER_SET").State(TimerCalcFertig);

Das ist der Code den ich momentan nutze und es hat auch prima funktioniert. Aber ab "!Segment für Uhrzeit von suchen" komme ich nicht weiter weil ich nicht weiß wie ich mit dem Zeitstempel rechnen soll.

Tyfys
Beiträge: 551
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 125 Mal

Re: Daten einer Webseite auslesen

Beitrag von Tyfys » 07.02.2024, 11:50

Zersch hat geschrieben:
06.02.2024, 21:44
Die aktuelle Homepage stellt keine Daten mehr bereit
Ist nicht ganz richtig.
Die haben leider den Pfad-/Dateinamen der JSON-Datei geändert.

ich habe mein skript mal angepasst:

Code: Alles auswählen

!Basiert auf Skript von Henke
time WorkTime = localtime ; ! aktuelles Datum
integer Offset = 0; 
if (WorkTime.Hour() >= 14) {
    Offset = 86400; !für nächsten Tag
}
WorkTime = WorkTime + Offset;
string date = WorkTime.Format("%Y%m%d");
string url = 'https://eex.stwhas.de/' # "flex_json_files/flex_"#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
integer datum = WorkTime.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);
und nun noch mal für awattar :

Code: Alles auswählen

!Basiert auf Skript von Henke
time WorkTime = localtime ; ! aktuelles Datum
integer Offset = 0; 
if (WorkTime.Hour() >= 14) {
    Offset = 86400; !für nächsten Tag
}
WorkTime = WorkTime + Offset;
string date = WorkTime.Format("%Y%m%d");
string url = 'https://api.awattar.de/v1/marketdata';

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
integer datum = WorkTime.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": '# (datum + (3600.0 * std.ToInteger())).ToString(0)#"000";
var such2 = '}';
string res = ((stdout.Substr(stdout.Find(such1)))).Substr(0, ((stdout.Substr(stdout.Find(such1))).Find(such2)));
!nun den entsprechenden Preis suchen
such1 = '"marketprice":';
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() > 0) {
    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);
awattar liefert vor der aktuellen Stunde aber keine Preise. Was nach 14:00 kommt müsste man mal abwarten.
zu beachten wäre noch der eine liefert ct/kWh, der andere Eur/MWh
Gruß
Harry

Benutzeravatar
Baxxy
Beiträge: 10838
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 609 Mal
Danksagung erhalten: 2228 Mal

Re: Daten einer Webseite auslesen

Beitrag von Baxxy » 07.02.2024, 15:55

Für Awattar hätte ich noch einen anderen Ansatz, mit jq.
jq ist bei RM direkt mit dabei und kann auf CCUx mittels CUxD-Installation reingeholt werden.

Code: Alles auswählen

!- Awattar Api abfragen und niedrigsten Preis suchen mittels curl und jq
!- jq ist bei RM nativ dabei, bei CCUx kann jq über CuxD reingeholt werden
!- https://homematic-forum.de/forum/viewtopic.php?f=65&t=77597&p=795959#p795959
!- Awattar-Api / https://www.awattar.de/services/api
!- @Baxxy / v1.0 / 07.02.24

integer iTage_Plus = 1;

string sTag_fuer_Datenabruf = (localtime.ToInteger() + (86400 * iTage_Plus)).ToTime().Format("%Y-%m-%d 00:00:00");
string iTS_fuer_Datenabruf = sTag_fuer_Datenabruf.ToTime().ToInteger()#"000";
WriteLine("Datum für Datenabruf: "#sTag_fuer_Datenabruf#" | Timestamp in MS: "#iTS_fuer_Datenabruf#"\n");

string url = "curl --connect-timeout 0.6 --max-time 0.6 -s https://api.awattar.de/v1/marketdata?start="#iTS_fuer_Datenabruf#" | jq '.data | min_by(.marketprice) | .start_timestamp,.end_timestamp,.marketprice,.unit'";
string stdout;
string stderr;
system.Exec(url,  & stdout,  & stderr);

!- Test-Output: | jq '.data | min_by(.marketprice) | .start_timestamp,.end_timestamp,.marketprice,.unit
!- stdout = '1707429600000
!- 1707433200000
!- 65.98
!- "Eur/MWh"';

!WriteLine("\nstdout:\n"#stdout);
!WriteLine("\nstderr:\n"#stderr);

real rTiefster_Preis = (stdout.StrValueByIndex("\n",2).Trim()).ToFloat();
string sPreis_Einheit = (stdout.StrValueByIndex("\n",3).Trim()).Replace('"',"");
string sStart_Zeit_TS_MS = stdout.StrValueByIndex("\n",0).Trim();
string sEnde_Zeit_TS_MS = stdout.StrValueByIndex("\n",1).Trim();
integer iStart_Zeit_TS_S = (sStart_Zeit_TS_MS.Substr(0,sStart_Zeit_TS_MS.Length() - 3)).ToInteger();
integer iEnde_Zeit_TS_S = (sEnde_Zeit_TS_MS.Substr(0,sEnde_Zeit_TS_MS.Length() - 3)).ToInteger();
string sStart_Zeit = iStart_Zeit_TS_S.ToTime().Format("%d.%m.%y %H:%M");
string sEnde_Zeit = iEnde_Zeit_TS_S.ToTime().Format("%d.%m.%y %H:%M");

!- niedrigsten Preis samt Zeitraum ausgeben
WriteLine("Niedrigster Preis: "#rTiefster_Preis#" "#sPreis_Einheit#" vom "#sStart_Zeit#" bis "#sEnde_Zeit);
Ausgabe:

Code: Alles auswählen

Datum für Datenabruf: 2024-02-08 00:00:00 | Timestamp in MS: 1707346800000

Niedrigster Preis: 65.980000 Eur/MWh vom 08.02.24 23:00 bis 09.02.24 00:00

Tyfys
Beiträge: 551
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 125 Mal

Re: Daten einer Webseite auslesen

Beitrag von Tyfys » 07.02.2024, 16:22

Baxxy hat geschrieben:
07.02.2024, 15:55
Für Awattar hätte ich noch einen anderen Ansatz, mit jq.
Dann hat er/sie/es ja mehrere Möglichkeiten.

Je nach dem was gebraucht wird, ist das eine oder andere besser geeignet.
Gruß
Harry

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 » 07.02.2024, 19:07

Vielen Dank für eure Hilfe. Jetzt funktioniert wieder alles. Ihr seid die Besten.

Antworten

Zurück zu „RaspberryMatic“