NEWS
Website auslesen/JSON parsen
-
@homoran Der "Text", also die JSON ist vom Aufbau immer identisch und wird hier bereitgestellt:
-
@ianig-iro sagte in Website auslesen/JSON parsen:
wird hier bereitgestellt:
Also hast du sie noch nicht lokal auf deinem Rechner?
Ich versuche mal was
EDIT1:
für den parser:
ue":\s+([\d\.]+)
Edit2:
Blockly:Satt des debug Baustein natürlich ein "aktualisiere" Block für deinen selbst erstellten Datenpunkt
-
@homoran Es kann so einfach sein, wenn man weiß was man tut
Besten Dank, es funktioniert mi Blockly super!
Mit dem Parser muss ich noch rumexperimentieren. -
Hi,
ich hab mal auf die schnelle was zusammen geschrieben, funktioniert hier:// Pegelonline script by ilovegym66 // var request = require('request'); var url = 'https://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/Mainz/W/currentmeasurement.json'; var timestamp; var trend; var value; var stateMnwMhw; var stateNswHsw; var idtimestamp = '0_userdata.0.Pegelonline.Mainz.timestamp'; var idtrend = '0_userdata.0.Pegelonline.Mainz.trend'; var idvalue = '0_userdata.0.Pegelonline.Mainz.value'; var idstateMnwMhw = '0_userdata.0.Pegelonline.Mainz.stateMnwMhw'; var idstateNswHsw = '0_userdata.0.Pegelonline.Mainz.stateNswHsw'; createState('0_userdata.0.Pegelonline.Mainz.timestamp', { name: 'timestamp', }); createState('0_userdata.0.Pegelonline.Mainz.value', { name: 'value', }); createState('0_userdata.0.Pegelonline.Mainz.trend', { name: 'trend', }); createState('0_userdata.0.Pegelonline.Mainz.stateMnwMhw', { name: 'stateMnwMhw', }); createState('0_userdata.0.Pegelonline.Mainz.stateNswHsw', { name: 'stateNswHsw', }); function PegelMainz() { request(url, function ( err, state, body){ if (err) { log("Fehler aufgetreten: " + err); } else { var obj = JSON.parse(body); timestamp = obj.timestamp; value = obj.value; trend = obj.trend; stateMnwMhw = obj.stateMnwMhw; stateNswHsw = obj.stateNswHsw; setState(idtimestamp, timestamp); setState(idtrend, trend); setState(idvalue, value); setState(idstateMnwMhw, stateMnwMhw); setState(idstateNswHsw, stateNswHsw); } }); } schedule('*/21 * * * *', PegelMainz);
-
@ilovegym Danke, das werde ich aus Interesse auch nochmal testen
-
@ianig-iro Gern geschehen, läuft bei mir, hab für jede Station/Ort ein Script, einfach den Ortsnamen ( hier Mainz ) austauschen, geht mit der funktion "change all Occurences" am einfachsten
-
@ilovegym sagte in Website auslesen/JSON parsen:
ich hab mal auf die schnelle was zusammen geschrieben, funktioniert hier:
Hi Bernd!
Würde das auch mit pegelalarm.at funktionieren?
-
@negalein auf anhieb nicht, da man sich bei deren API anmelden muss.
-
@ilovegym sagte in Website auslesen/JSON parsen:
auf anhieb nicht, da man sich bei deren API anmelden muss.
gerade gesehen, dass es 2 APIs gibt.
Mit 1.1 wird ein Login benötigt, aber mit 1.0 läufts ohne. -
@ilovegym sagte in Website auslesen/JSON parsen:
auf anhieb nicht, da man sich bei deren API anmelden muss
Hallo
Konntest du mit der API 1.0 was erreichen?
-
@negalein ja das kannste einfach umsetzen, ich hatte einfach den link mal ausprobiert und da kamen auch die json dabei raus.
Beispiel:
https://api.pegelalarm.at/api/station/1.0/list?qStationName=Linzund dann schaust du dir die json an und setzt dir die States wie du sie brauchst, also value, trend, etc.
-
@ilovegym sagte in Website auslesen/JSON parsen:
und dann schaust du dir die json an und setzt dir die States wie du sie brauchst, also value, trend, etc.
Danke dir!
Ich benötige eigentlich nur Zeit und Pegel.Müsste das dann so passen?
// Pegelonline script by ilovegym66 // var request = require('request'); var url = 'https://api.pegelalarm.at/api/station/1.0/list?qStationName=Sch%C3%A4rding'; var sourceDate; // var trend; var value; // var stateMnwMhw; // var stateNswHsw; var idsourceDate = '0_userdata.0.Pegelalarm.Schärding.sourceDate'; // var idtrend = '0_userdata.0.Pegelalarm.Schärding.trend'; var idvalue = '0_userdata.0.Pegelalarm.Schärding.value'; // var idstateMnwMhw = '0_userdata.0.Pegelalarm.Schärding.stateMnwMhw'; // var idstateNswHsw = '0_userdata.0.Pegelalarm.Schärding.stateNswHsw'; createState('0_userdata.0.Pegelalarm.Schärding.sourceDate', { name: 'sourceDate', }); createState('0_userdata.0.Pegelalarm.Schärding.value', { name: 'value', }); // createState('0_userdata.0.Pegelalarm.Schärding.trend', { // name: 'trend', // }); // createState('0_userdata.0.Pegelalarm.Schärding.stateMnwMhw', { // name: 'stateMnwMhw', // }); // createState('0_userdata.0.Pegelalarm.Schärding.stateNswHsw', { // name: 'stateNswHsw', // }); function PegelSchärding() { request(url, function ( err, state, body){ if (err) { log("Fehler aufgetreten: " + err); } else { var obj = JSON.parse(body); sourceDate = obj.sourceDate; value = obj.value; // trend = obj.trend; // stateMnwMhw = obj.stateMnwMhw; // stateNswHsw = obj.stateNswHsw; setState(idsourceDate, sourceDate); // setState(idtrend, trend); setState(idvalue, value); // setState(idstateMnwMhw, stateMnwMhw); // setState(idstateNswHsw, stateNswHsw); } }); } schedule('*/21 * * * *', PegelSchärding);
Problem ist, dass in der JSON 2 Stationen sind, ich aber nur 1 benötige!
Beide Stationen verwendenrequestDate
undvalue
.{ "status": { "code": 200 }, "payload": { "stations": [ { "name": "Inn / Schärding / at", "commonid": "206201-at", "country": "Österreich", "stationName": "Schärding", "water": "Inn", "region": "Oberösterreich", "latitude": 48.456197269621, "longitude": 13.428268065578, "positionKm": 16.25, "altitudeM": 299.8, "defaultWarnValueCm": 520.0, "defaultWarnValueM3s": 2600.0, "defaultAlarmValueCm": 580.0, "defaultAlarmValueM3s": 3700.0, "data": [ { "type": "height in cm", "value": 370.0, "requestDate": "13.03.2021T11:20:29+0100", "sourceDate": "13.03.2021T11:00:00+0100" }, { "type": "flow in m3s", "value": 1435.0, "requestDate": "12.08.2016T09:42:10+0200", "sourceDate": "12.08.2016T08:00:00+0200" } ], "trend": 10, "situation": 10, "visibility": "PUBLIC" }, { "name": "Inn / Schärding-Neuhaus Ow / de", "commonid": "18007105-de", "country": "Deutschland", "stationName": "Schärding-Neuhaus Ow", "water": "Inn", "region": "Bayern", "latitude": 48.435577724765, "longitude": 13.440730974464, "positionKm": 0.0, "altitudeM": 0.0, "data": [ { "type": "height in cm", "value": 314.9, "requestDate": "03.08.2016T15:46:12+0200", "sourceDate": "03.08.2016T15:30:00+0200" } ], "trend": 100, "situation": 100, "visibility": "PUBLIC" }, { "name": "Inn / Schärding-Neuhaus Kw / de", "commonid": "18007107-de", "country": "Deutschland", "stationName": "Schärding-Neuhaus Kw", "water": "Inn", "region": "Bayern", "latitude": 48.435577724765, "longitude": 13.440730974464, "positionKm": 18.8, "altitudeM": 315.17, "defaultWarnValueM3s": 2000.0, "data": [ { "type": "flow in m3s", "value": 840.0, "requestDate": "03.08.2016T15:46:12+0200", "sourceDate": "03.08.2016T15:30:00+0200" } ], "trend": -10, "situation": 10, "visibility": "PUBLIC" } ] } }
-
@ilovegym
Müsste das dann so passen?
konntest du schon kurz drüberschaun?
-
@negalein sagte: in der JSON 2 Stationen sind, ich aber nur 1 benötige!
Es sind sogar 3 Stationen. Welche wird benötigt?
Den Namen der benötigten Station anpassen:function PegelSchaerding() { request(url, function(err, state, body) { if (err) { log("Fehler aufgetreten: " + err); } else { let stations = JSON.parse(body).payload.stations; for(let i = 0; i < stations.length; i++) { if(stations[i].stationName == 'Schärding') { let sourceDate = stations[i].data[0].sourceDate; let value = stations[i].data[0].value; setState(idsourceDate, sourceDate, true); setState(idvalue, value, true); break; } } } }); }
-
@paul53 sagte in Website auslesen/JSON parsen:
Es sind sogar 3 Stationen. Welche wird benötigt?
Den Namen der benötigten Station anpassen:Danke
Ja, Schärding wird benötigt.
Also auch wenn im JSON mitä
geschrieben, muss es im Script mitae
sein? -
@negalein sagte: muss es im Script mit ae sein?
Ich habe nur den Funktionsbezeichner geändert, da ich in Bezeichnern Umlaute vermeide. Es funktioniert wahrscheinlich auch mit "ä".
Der Stationsname muss mit "ä" geschrieben werden wie im JSON. -
-
habe es nun so
// Pegelonline script by ilovegym66 // var request = require('request'); var url = 'https://api.pegelalarm.at/api/station/1.0/list?qStationName=Schärding'; var sourceDate; // var trend; var value; // var stateMnwMhw; // var stateNswHsw; var idsourceDate = '0_userdata.0.Pegelalarm.Schaerding.sourceDate'; // var idtrend = '0_userdata.0.Pegelalarm.Schärding.trend'; var idvalue = '0_userdata.0.Pegelalarm.Schaerding.value'; // var idstateMnwMhw = '0_userdata.0.Pegelalarm.Schärding.stateMnwMhw'; // var idstateNswHsw = '0_userdata.0.Pegelalarm.Schärding.stateNswHsw'; createState('0_userdata.0.Pegelalarm.Schaerding.sourceDate', { name: 'sourceDate', }); createState('0_userdata.0.Pegelalarm.Schaerding.value', { name: 'value', }); // createState('0_userdata.0.Pegelalarm.Schärding.trend', { // name: 'trend', // }); // createState('0_userdata.0.Pegelalarm.Schärding.stateMnwMhw', { // name: 'stateMnwMhw', // }); // createState('0_userdata.0.Pegelalarm.Schärding.stateNswHsw', { // name: 'stateNswHsw', // }); function PegelSchaerding() { request(url, function ( err, state, body){ if (err) { log("Fehler aufgetreten: " + err); } else { var obj = JSON.parse(body); sourceDate = obj.sourceDate; value = obj.value; // trend = obj.trend; // stateMnwMhw = obj.stateMnwMhw; // stateNswHsw = obj.stateNswHsw; setState(idsourceDate, sourceDate); // setState(idtrend, trend); setState(idvalue, value); // setState(idstateMnwMhw, stateMnwMhw); // setState(idstateNswHsw, stateNswHsw); } }); } schedule('*/21 * * * *', PegelSchaerding);
Aber auch nach den 21 Minuten lt. Schedule steht nichts in den beiden DP
0_userdata.0.Pegelalarm.Schaerding.sourceDate
und0_userdata.0.Pegelalarm.Schaerding.value
.Könntest du es bei dir testen?
-
@negalein sagte: Könntest du es bei dir testen?
Ich habe es mit dieser URL erfolgreich getestet:
var url = 'https://api.pegelalarm.at/api/station/1.0/list?qStationName=Sch%C3%A4rding';
Mit log() anstelle von setState():
18:21:09.169 info javascript.0 (1916) script.js.common.Neuer_Test: 24.03.2021T17:30:00+0100 18:21:09.169 info javascript.0 (1916) script.js.common.Neuer_Test: 361
-
@paul53 sagte in Website auslesen/JSON parsen:
Ich habe es mit dieser URL erfolgreich getestet:
Ich bekomme keine Daten
Egal ob ich
https://api.pegelalarm.at/api/station/1.0/list?qStationName=Sch%C3%A4rding
oderhttps://api.pegelalarm.at/api/station/1.0/list?qStationName=Sch%C3%A4rding
verwende.So schaut das Script aus.
// Pegelonline script by ilovegym66 // var request = require('request'); var url = 'https://api.pegelalarm.at/api/station/1.0/list?qStationName=Sch%C3%A4rding'; var sourceDate; // var trend; var value; // var stateMnwMhw; // var stateNswHsw; var idsourceDate = '0_userdata.0.Pegelalarm.Schaerding.sourceDate'; // var idtrend = '0_userdata.0.Pegelalarm.Schärding.trend'; var idvalue = '0_userdata.0.Pegelalarm.Schaerding.value'; // var idstateMnwMhw = '0_userdata.0.Pegelalarm.Schärding.stateMnwMhw'; // var idstateNswHsw = '0_userdata.0.Pegelalarm.Schärding.stateNswHsw'; createState('0_userdata.0.Pegelalarm.Schaerding.sourceDate', { name: 'sourceDate', }); createState('0_userdata.0.Pegelalarm.Schaerding.value', { name: 'value', }); // createState('0_userdata.0.Pegelalarm.Schärding.trend', { // name: 'trend', // }); // createState('0_userdata.0.Pegelalarm.Schärding.stateMnwMhw', { // name: 'stateMnwMhw', // }); // createState('0_userdata.0.Pegelalarm.Schärding.stateNswHsw', { // name: 'stateNswHsw', // }); function PegelSchaerding() { request(url, function ( err, state, body){ if (err) { log("Fehler aufgetreten: " + err); } else { var obj = JSON.parse(body); sourceDate = obj.sourceDate; value = obj.value; // trend = obj.trend; // stateMnwMhw = obj.stateMnwMhw; // stateNswHsw = obj.stateNswHsw; setState(idsourceDate, sourceDate); // setState(idtrend, trend); setState(idvalue, value); // setState(idstateMnwMhw, stateMnwMhw); // setState(idstateNswHsw, stateNswHsw); } }); } schedule('*/21 * * * *', PegelSchaerding);
Siehst du noch wo einen Fehler?