NEWS
Luftdate.info per Skript einlesen
-
Hallo,
habe nachgesehen und den gleichen Fehler gestern zwei drei mal gehabt:
2017-08-06 08:00:24.939 - [31merror[39m: javascript.2 uncaught exception: Cannot read property 'value' of undefined 2017-08-06 08:00:24.946 - [31merror[39m: javascript.2 TypeError: Cannot read property 'value' of undefined at Request._callback (script.js.Test.Test_Luftdaten:937:103) at Request.self.callback (/Users/pix/Documents/iobroker/node_modules/request/request.js:188:22) at emitTwo (events.js:87:13) at Request.emit (events.js:172:7) at Request. <anonymous>(/Users/pix/Documents/iobroker/node_modules/request/request.js:1171:10) at emitOne (events.js:77:13) at Request.emit (events.js:169:7) at IncomingMessage. <anonymous>(/Users/pix/Documents/iobroker/node_modules/request/request.js:1091:12) at IncomingMessage.g (events.js:260:16) at emitNone (events.js:72:20) at IncomingMessage.emit (events.js:166:7) 2017-08-06 08:00:25.212 - [31merror[39m: host.MacMini.local instance system.adapter.javascript.2 terminated with code 0 (OK) 2017-08-06 08:00:25.213 - [32minfo[39m: host.MacMini.local Restart adapter system.adapter.javascript.2 because enabled</anonymous></anonymous>
Bei mir sieht das Skript schon so aus:
! ````
/* Luftdaten
! Liest Daten eines Feinstaub-Sensors
von luftdaten.info aus
! http://api.luftdaten.info/v1/sensor/####/
! 05.06.2017 erstellt von Pix
10.07.2017 Code angepasst nach Fehler
12.07.2017 Fehler abfangen, wenn JSON leer
30.07.2017 Zoomstufe für VIS
*/
! const sensorid = "4395"; //
! const logging = false;
const instanz = 'javascript.' + instance + '.';
const pfad = 'Luftdaten.' + sensorid + '.';
const cronStr = "14,29,44,59 * * * *";
! function createStates () {
// Nur für VIS Bedienung
createState('Luftdaten.Zoom', {
name: 'Zoom',
desc: 'Zoomstufe Karte in VIS',
type: 'number',
min: 0,
max: 13,
def: 11
}, function () {
if (logging) log('Objekt ' + instanz + 'Luftdaten.Zoom erstellt');
});// Allgemein createState(pfad + 'json', { name: 'JSON', desc: 'JSON Ausgabe', type: 'string', role: 'json' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'json erstellt'); });
! createState(pfad + 'sensor_id', {
name: 'ID',
desc: 'ID-Nummer des Sensors',
type: 'string',
role: 'text'
}, function () {
if (logging) log('Objekt ' + instanz + pfad + 'sensor_id erstellt');
});createState(pfad + 'sensor_type', { name: 'Typ', desc: 'Type des Sensors', type: 'string', role: 'text' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'sensor_type erstellt'); });
! createState(pfad + 'location', {
name: 'Ort',
desc: 'Location des Sensors',
type: 'string',
role: 'text'
}, function () {
if (logging) log('Objekt ' + instanz + pfad + 'location erstellt');
});createState(pfad + 'lat', { name: 'Latitude', desc: 'Geographische Lage des Sensors - Breite', type: 'number', unit: '°', role: 'val' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'latitude erstellt'); }); createState(pfad + 'lon', { name: 'Longitude', desc: 'Geographische Lage des Sensors - Länge', type: 'number', unit: '°', role: 'val' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'longitude erstellt'); }); createState(pfad + 'country', { name: 'Country Code', desc: 'Geographische Lage des Sensors - Landeskürzel', type: 'string', role: 'text' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'country erstellt'); }); createState(pfad + 'Messung.timestamp', { name: 'Zeitstempel', desc: 'Zeitstempel der Messung', type: 'string', role: 'text' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'timestamp erstellt'); }); createState(pfad + 'Messung.P1', { name: 'P1', desc: 'Messung P1', type: 'number', role: 'val', custom: { "influxdb.0": { "enabled": true, "changesOnly": true, "debounce": "", "retention": 63072000 } } }, function () { if (logging) log('Objekt ' + instanz + pfad + 'Messung.P1 erstellt'); });
! createState(pfad + 'Messung.P2', {
name: 'P2',
desc: 'Messung P2',
type: 'number',
role: 'val',
custom: {
"influxdb.0": {
"enabled": true,
"changesOnly": true,
"debounce": "",
"retention": 63072000
}
}
}, function () {
if (logging) log('Objekt ' + instanz + pfad + 'Messung.P2 erstellt');
});
! createState(pfad + 'forceRefresh', {
name: 'aktualisieren',
desc: 'Werte neu einlesen',
type: 'boolean',
def: false,
role: 'indicator'
}, function () {
if (logging) log('Objekt ' + instanz + pfad + 'forceRefresh erstellt');
});
}
! function readData() {
var request = require('request');
var options = {
url: 'http://api.luftdaten.info/v1/sensor/' + sensorid + '/',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1'
}
};
try {
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) { // kein Fehler, Inhalt in body
var p1, p2;
var json = JSON.parse(body);
if (logging) log('JSON: ' + JSON.stringify(json));if (JSON.stringify(json).length <= 2) { log ('JSON Daten sind nicht empfangbar', 'warn'); } else { setState(pfad + 'json', JSON.stringify(json)); setState(pfad + 'sensor_id', json[0].sensor.id.toString()); setState(pfad + 'sensor_type', json[0].sensor.sensor_type.name + ' by ' + json[0].sensor.sensor_type.manufacturer); setState(pfad + 'location', json[0].location.id.toString()); setState(pfad + 'lat', parseFloat(json[0].location.latitude)); setState(pfad + 'lon', parseFloat(json[0].location.longitude)); setState(pfad + 'country', json[0].location.country); setState(pfad + 'Messung.timestamp', json[0].timestamp); if (json[0].sensordatavalues[0].value !== undefined && json[0].sensordatavalues[1].value !== undefined) { p1 = json[0].sensordatavalues[0].value; p2 = json[0].sensordatavalues[1].value; setState(pfad + 'Messung.P1', parseFloat(p1)); setState(pfad + 'Messung.P2', parseFloat(p2)); log('Luftdaten aktualisiert'); } else { log('Luftdaten nicht aktualisiert, da keine Messdaten', 'warn'); } } } else { log("StatusCode = " + response.statusCode); log(error, 'error'); // Error beim Einlesen } }); } catch (e) { log('Fehler (try) Luftdaten.info: ' + e, 'error'); }
}
! // regelmässige Wiederholungen
schedule(cronStr, readData);
! // einmaliger Start bei Skriptstart
createStates();
setTimeout(readData, 1500);
! // Start beim Setzen auf true
on(instanz + pfad + 'forceRefresh', function (obj) {
if (!obj.state.ack && obj.state.val) readData();
});
! ````Vielleicht kann noch jemand helfen?
Gruß
Pix
-
if (json[0].sensordatavalues[0].value !== undefined && json[0].sensordatavalues[1].value !== undefined) {
Ändere mal die Abfrage in
if (json[0].sensordatavalues[0] && json[0].sensordatavalues[1]) {
-
Vielen Dank, paul53.
Z.Zt. ist mein Lieblingssender wieder offline. Daher
20:29:00.784 [warn] javascript.2 script.js.Test.Test_Luftdaten: JSON Daten sind nicht empfangbar
Es greift also die Abfrage:
if (JSON.stringify(json).length <= 2) { log ('JSON Daten sind nicht empfangbar', 'warn'); }
Wenn der Sender wieder online ist, werde ich die Code Korrektur prüfen können.
Gruß
Pix
-
Hallo Pix,
Hab die Änderung eingebaut. Scheint zu kaufen, allerdings kann ich noch nicht testen, da meine gewählte ID jetzt wieder sendet.
Dank dir
-
Hier - für die Vollständigkeit - eine Darstellung mit Grafana.
http://forum.iobroker.net/viewtopic.php … ana#p99946
Pix
-
Nun habe ich mir noch einen zweiten Sensor gebaut der in der Wohnung verbaut ist. (Kachelofen Überwachung) Dieser soll nicht die Daten an den Luftdaten.info Server senden.
Daher möchte ich die Daten per Parser auslesen (IP-Sensor/values).
Laut https://regex101.com/habe ich die Kombinationen gefunden
PM2.5
(?:PM2[^]*)(?=[^]* class='r'>)([0-9.]{1,})
PM10
(?:PM10[^]*)(?=[^]* class='r'>)([0-9.]{1,})
Temperatur
(?:Temper[^]*)(?=[^]* class='r'>)([0-9.]{1,})
Luftfreuchte
(?:rel[^]*)(?=[^]* class='r'>)([0-9.]{1,})
Hoffe das mir jemand helfen kann. `
Hallo,
bist du hier (oder jemand anderes) schon weiter?
Ich möchte gerne einen Feinstaubsensor im Haus installieren und in iobroker auswerten, aber ohne über eine Cloud zu gehen. Analog zu den Dingern wie es die Luftreiniger haben (Xiaomi Air Purifer etc).
Oder gibt es einen anderen Staubsensor den man einbinden kann?
-
also erstmal , coole sache.
Funktioniert und das Skript liest die Daten aus.
Werde mir auch selber noch eine Station bauen.
aber ich benötige bitte mal die erklärung der Daten.
p1= PM10 ?
p2= Pm2,5 ?
Welcher Wert und welches Widget stellt mir die 24h anzeige dar?
Besten Dank
-
Hallo
nach Rücksprache, nunalles in der History und dann per Flot.
Wenn ich die Zahnräder anklicke kann ich zwar "aktivieren" aber nicht speichern. Er macht einfach nix.
Andere Sachen speichert er, aber nicht P1 und P2.
Woran kann das liegen?
2562_32.jpg -
Hallo Ace-k,
ich verstehe dein Problem nicht. Wenn du in das Zahnrad klickst, die Speicherdauer auswählst und aktivierst (Haken links oben setzen), dann werden die eingelesenen Werte in der Datenbank gespeichert. Nach einigen Stunden (ein paar Durchgängen des Einlesens) kannst du mit Flot eine Grafik erstellen.
GrußPix~~@Ace-k:~~
aber ich benötige bitte mal die erklärung der Daten.
p1= PM10 ?
p2= Pm2,5 ?
Welcher Wert und welches Widget stellt mir die 24h anzeige dar? `
Infos zu PM10 und PM2,5 https://www.umweltbundesamt.de/themen/luft/luftschadstoffe/feinstaubEs gibt keinen 24 Stunden Wert, der wird nicht in der API von luftdaten.info zur Verfügung gestellt und kann somit nicht eingelesen werden. Wie oben erklärt, kannst du mit der ioBroker History-FUnktion selbst einen Chart erzeugen (und im iFrame Widget von VIS anzeigen), Mittelwerte berechnen, usw.
Gruß
Pix
-
Ich kann wenn ich den Haken bei aktivieren setze nicht auf speichern klicken .
-
Hallo,
das Problem mit dem speichern hatte ich auch.
Pix verwendet wohl influxdb und du history. Tausche im Script "influxdb.0" gegen "history.0".
Ich musste allerdings unter Objekte den Ordner "Luftdaten" einmal löschen und und das Script dann neu starten.
Speichern war dann automatisch aktiviert.
Gruß
Chris
-
da wollte ich auch gerade mal reinschauen ob im Skript evtl was anderes ist.
aber ob ich genau draufgekommen wäre :lol:
besten dank. es scheint zu gehen!
-
Hallo,
das Problem mit dem speichern hatte ich auch.
Pix verwendet wohl influxdb und du history. Tausche im Script "influxdb.0" gegen "history.0".
Ich musste allerdings unter Objekte den Ordner "Luftdaten" einmal löschen und und das Script dann neu starten.
Speichern war dann automatisch aktiviert.
Gruß
Chris `
Darauf hätte ich auch mal kommen können. Danke für den Hinweis.Gruß
Pix
-
Hallo,
die Daten des eigenen Sensors und fremder Geräte lassen sich auch über Apollon77's neuen iobroker.ham - Adapter einlesen.
Folgt diesem Link: viewtopic.php?f=36&t=14972&p=156438#p156438
Gruß
Pix
-
Es gibt inzwischen einen Adapter.
Da ich kein Doppelposting machen möchte, bitte hier lesen
-
Wahrscheinlich völlig falsche Widgets genommen - aber egal mir gefällts - DANKE pix
-
Anmerkung:
Im Log finde ich immer folgende Meldungen - da wird die verbindung zur DB verloren:
javascript.0 2018-08-12 10:56:16.427 warn Reconnection to DB. javascript.0 2018-08-12 10:56:16.404 warn Reconnection to DB. host.RaPi03-FHEM-Prod 2018-08-12 10:55:15.029 info instance system.adapter.luftdaten.0 terminated with code 0 (OK) luftdaten.0 2018-08-12 10:55:04.376 info starting. Version 0.0.6 in /opt/iobroker/node_modules/iobroker.luftdaten, node: v6.14.3
Ist das richtig so ?
-
Hallo pix,
erstmal vielen Dank für das geniale Skript. Wie immer von Dir super Arbeit. Ich habe nur ein kleines Problem. Falls der Sensor nicht erreichbar ist, bekomme ich folgenden Fehler und JS startet sich immer neu. Kann man das irgendwie umgehen?
! javascript.0 2018-08-13 11:28:36.350 error at Socket.emit (events.js:188:7)
! javascript.0 2018-08-13 11:28:36.350 error at emitOne (events.js:96:13)
! javascript.0 2018-08-13 11:28:36.350 error at Socket.socketErrorListener (_http_client.js:310:9)
! javascript.0 2018-08-13 11:28:36.350 error at ClientRequest.emit (events.js:188:7)
! javascript.0 2018-08-13 11:28:36.350 error at emitOne (events.js:96:13)
! javascript.0 2018-08-13 11:28:36.350 error at Request.onRequestError (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:878:8)
! javascript.0 2018-08-13 11:28:36.350 error at Request.emit (events.js:188:7)
! javascript.0 2018-08-13 11:28:36.350 error at emitOne (events.js:96:13)
! javascript.0 2018-08-13 11:28:36.350 error at self.callback (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:186:22)
! javascript.0 2018-08-13 11:28:36.350 error at Request._callback (script.js.XSkripte.Luftdaten:613:47)
! javascript.0 2018-08-13 11:28:36.350 error TypeError: Cannot read property 'statusCode' of undefined
! javascript.0 2018-08-13 11:28:36.349 error uncaught exception: Cannot read property 'statusCode' of undefinedMein Skript sieht aktuell so aus (Auszug):
! ````
try {
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) { // kein Fehler, Inhalt in body
var p1, p2, note;
var json = JSON.parse(body);
if (logging) log('body: ' + body);if (logging) log('JSON: ' + JSON.stringify(json)); setState(pfad + 'json', JSON.stringify(json)); if (json[0].sensor.id.toString() !== undefined) { .....
! ````
Aktuell scheint die Seite gar nicht mehr zu gehen. Kommt gar nix zurück…
Danke Dir und vg
Falk
-
Hallo,
weil es mit luftdaten.de einige Schwierigkeiten gab und dort auch nur Feinstaubwerte abrufbar sind,
habe ich weiter gesucht und beim UBA schöne Luftqualitätsdaten gefunden - allerdings keine API.
Aber auf Anfrage hat man mir sehr gut geholfen und ich habe jetzt das Script von Pix ein wenig umgebaut.
Ist noch ziemlich roh, aber es funktioniert bisher.
Es ist ein Schritt vorher erforderlich:
Im Browser den Request absetzen, um die gewünschte Station abzufragen (das habe ich nicht automatisiert, weil der Befehl alle Stationen abfragt, somit ziemlich lange braucht und ich den Server nicht nerven will...)
Die Antwort enthält 'stations' und dort kann man die gewünschte Station suchen und dann die zugehörige ID.
Dabei hilft die Karte unter https://www.umweltbundesamt.de/daten/luft/luftdaten/luftqualitaet./* Luftdaten - Liest Daten eines Luftdaten-Sensors von https://www.umweltbundesamt.de/api aus - https://www.umweltbundesamt.de/api/air_data/v2/xxx Request all stations (to find the station code for your region): https://www.umweltbundesamt.de/api/air_data/v2/meta/json?use=airquality&date_from=2019-01-01&date_to=2019-01-01&time_from=1&time_to=2 - todo: Optin - 20.09.2019 erstellt auf Vorlage von von Pix */ var sensorid = "633"; var logging = false; var instanz = 'javascript.' + instance + '.'; var pfad = 'Luftdaten.' + sensorid + '.'; var cronStr = "14,29,44,59 * * * *"; //var cronStr = "* * * * *"; function createStates () { // Allgemein createState(pfad + 'json', { name: 'JSON', desc: 'JSON Ausgabe', type: 'string', role: 'json' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'json erstellt'); }); createState(pfad + 'sensor_id', { name: 'ID', desc: 'ID-Nummer des Sensors', type: 'string', role: 'text' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'sensor_id erstellt'); }); createState(pfad + 'sensor_type', { name: 'Typ', desc: 'Type des Sensors', type: 'string', role: 'text' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'sensor_type erstellt'); }); createState(pfad + 'location', { name: 'Ort', desc: 'Location des Sensors', type: 'string', role: 'text' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'location erstellt'); }); createState(pfad + 'lat', { name: 'Latitude', desc: 'Geographische Lage des Sensors - Breite', type: 'number', unit: '°', role: 'val' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'latitude erstellt'); }); createState(pfad + 'lon', { name: 'Longitude', desc: 'Geographische Lage des Sensors - Länge', type: 'number', unit: '°', role: 'val' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'longitude erstellt'); }); createState(pfad + 'country', { name: 'Country Code', desc: 'Geographische Lage des Sensors - Landeskürzel', type: 'string', role: 'text' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'country erstellt'); }); createState(pfad + 'Messung.timestamp', { name: 'Zeitstempel', desc: 'Zeitstempel der Messung', type: 'string', role: 'text' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'timestamp erstellt'); }); createState(pfad + 'Messung.PM10', { name: 'PM10', desc: 'Messung PM10', type: 'number', role: 'val', }, function () { if (logging) log('Objekt ' + instanz + pfad + 'Messung.PM10 erstellt'); }); createState(pfad + 'Messung.O3', { name: 'O3', desc: 'Messung O3', type: 'number', role: 'val', }, function () { if (logging) log('Objekt ' + instanz + pfad + 'Messung.O3 erstellt'); }); createState(pfad + 'Messung.NO2', { name: 'NO2', desc: 'Messung NO2', type: 'number', role: 'val', }, function () { if (logging) log('Objekt ' + instanz + pfad + 'Messung.NO2 erstellt'); }); createState(pfad + 'forceRefresh', { name: 'aktualisieren', desc: 'Werte neu einlesen', type: 'boolean', def: false, role: 'indicator' }, function () { if (logging) log('Objekt ' + instanz + pfad + 'forceRefresh erstellt'); }); } function readData() { var Today, Now, DateString; var request = require('request'); Today = new Date(); DateString = Today.getFullYear() + '-' + (Today.getMonth()+1) + '-' + (Today.getDate()-1); Now = Today.getHours(); var url= 'https://www.umweltbundesamt.de/api/air_data/v2/airquality/json?date_from=' + DateString + '&date_to=' + DateString + '&time_from=1' + '&time_to=' + (Now-1) + '&station=' + sensorid; //log(url); var options = { url: 'https://www.umweltbundesamt.de/api/air_data/v2/airquality/json?date_from=' + DateString + '&date_to=' + DateString + '&time_from=1' + '&time_to=' + (Now-1) + '&station=' + sensorid, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1' } }; try { request(options, function (error, response, body) { if (!error && response.statusCode == 200) { // kein Fehler, Inhalt in body var p1, p2; var json = JSON.parse(body); var Station = json.data[sensorid]; var allPropertyNames = Object.keys(Station); setState(pfad + 'json',JSON.stringify(json.data)); if (logging) { for (var j=0; j<allPropertyNames.length; j++) { var name = allPropertyNames[j]; var value = Station[name]; log('name: ' + name + '; value: ' + value); } } //log(allPropertyNames.length); //Use only the last entry, because this is the latest: that's what we want to add name = allPropertyNames[allPropertyNames.length-1]; value = Station[name]; if (logging) { //log('JSON: ' + JSON.stringify(json.data)); //log('Station: ' + JSON.stringify(Station)); //log('JSON: ' + JSON.stringify(json.indices.data)); log(name + 'value[0]: ' + value[0]); log(name + 'value[1]: ' + value[1]); log(name + 'value[2]: ' + value[2]); log(name + 'value[3]: ' + value[3]); log(name + 'value[4]: ' + value[4]); log(name + 'value[5]: ' + value[5]); log(name + 'value[6]: ' + value[6]); //var xx = value[3][0]; //log(xx); } var PM10,O3, NO2; for (var count=3; count<value.length; count++) { //log(parseInt(value[count][0])); //log(value.length); switch(parseInt(value[count][0])) { case 1: // PM10 PM10 = value[count][1]; //log('PM10: ' + PM10); setState(pfad + 'Messung.PM10', parseFloat(PM10),true); break; case 3: // O3 O3 = value[count][1]; //log('O3: ' + O3); setState(pfad + 'Messung.O3', parseFloat(O3),true); break; case 5: // NO2 NO2 = value[count][1]; //log('NO2: ' + NO2); setState(pfad + 'Messung.NO2', parseFloat(NO2),true); break; default: // code block } } /* setState(pfad + 'sensor_id', json[0].sensor.id.toString()); setState(pfad + 'sensor_type', json[0].sensor.sensor_type.name + ' by ' + json[0].sensor.sensor_type.manufacturer); setState(pfad + 'location', json[0].location.id.toString()); setState(pfad + 'lat', parseFloat(json[0].location.latitude)); setState(pfad + 'lon', parseFloat(json[0].location.longitude)); setState(pfad + 'country', json[0].location.country); setState(pfad + 'Messung.timestamp', json[0].timestamp); p1 = json[0].sensordatavalues[0].value; p2 = json[0].sensordatavalues[1].value; setState(pfad + 'Messung.P1', parseFloat(p1)); setState(pfad + 'Messung.P2', parseFloat(p2)); */ } else { log("StatusCode = "+response.statusCode); log(error,'error'); // Error beim Einlesen } }); log('Luftdaten aktualisiert'); } catch (e) { log('Fehler (try) Luftdaten.info: ' + e, 'error'); } } // regelmässige Wiederholungen schedule(cronStr, readData); // einmaliger Start bei Skriptstart createStates(); setTimeout(readData, 1500); // Start beim Setzen auf true on(instanz + pfad + 'forceRefresh', function (obj) { if (!obj.state.ack && obj.state.val) readData(); });
-
@piForscher
ich verstehe nicht allzuviel vom Skripten, bekomme mit deinem Skript zwar (manchmal) Ergebnisse, die passen aber nicht zu anderen Ergebnissen.Zum einen wird z.B. das Ozon auf einmal nicht aktualisiert
Zum anderen passen die UBA-Werte nicht zu denen des LANUV, die IMHO die gleiche Station nutzen. Kann mich da aber auch täuschen.
Habe mich dann als Nicht-Skripter zum einen versucht durch dein Skript zu wühlen, zum anderen auf der Website des UBA mehr Informationen zu bekommen.
Einen Hinweis auf die API finde ich gar nicht - und die Werte die auf deren Karten angezeigt werden entsprechen nicht denen, die das Skript auswirft.
Der URL, den du zusammenbaust enthält Datum von und bis.
Warum addierst du bei dem Monat einen drauf?
geht das im Dezember überhaupt?
und im Tag ziehst du einen ab.Im Url.log steht seltsamerweise der 12. als Monat aber der gestrige Tag.