Daten einer Webseite auslesen
Moderatoren: jmaus, Co-Administratoren
- 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
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…
meine in anderen Foren das gelesen zu haben…
-
- 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
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 +++
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 +++
-
- 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
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
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
-
- Beiträge: 43
- Registriert: 08.02.2019, 08:33
- Hat sich bedankt: 7 Mal
- Danksagung erhalten: 2 Mal
Re: Daten einer Webseite auslesen
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
-
- Beiträge: 43
- Registriert: 08.02.2019, 08:33
- Hat sich bedankt: 7 Mal
- Danksagung erhalten: 2 Mal
Re: Daten einer Webseite auslesen
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.
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.
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);
-
- 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
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);
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);
zu beachten wäre noch der eine liefert ct/kWh, der andere Eur/MWh
Gruß
Harry
Harry
- 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
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.
Ausgabe:
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);
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
Grüße... Baxxy
- Raspberry Pi 4 als Homematic-Zentrale - Tipps und Informationen
- Analysescript für genutzte Funk-Adressen, Funkmodul-Hardware und Zentralen Hardware
- NANO CUL 868MHz - Stick zum AskSin Analyzer XS umflashen (Anleitung für ArduinoIDE unter Windows)
- Firmware Updates für IP-Aktoren / Sensoren... Info's, Tipps und Sonstiges
- CCU funkt nicht - CarrierSense (CS) Probleme erkennen und lösen
-
- 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
Dann hat er/sie/es ja mehrere Möglichkeiten.
Je nach dem was gebraucht wird, ist das eine oder andere besser geeignet.
Gruß
Harry
Harry