NEWS
Datenpunkt für JSON
-
@paul53
Danke Paul.
Gibt es noch bestimmte Anforderungen an die Einstellung des Datenpunktes? -
@kail sagte:Gibt es noch bestimmte Anforderungen an die Einstellung des Datenpunktes?
Der DP muss vom Typ "string" oder "json" sein.
In einen DP vom Typ "array" kann man das Array ohne Wandlung schreiben: Die Wandlung nimmt in dem Fall der JS-Adapter vor. -
@paul53
Das Script hat mein Problem noch nicht ganz gelöst. In Grafana kann ich die Daten nicht separieren.
-
@kail sagte: In Grafana kann ich die Daten nicht separieren.
Von Grafana habe ich keine Ahnung.
-
Habe mal das Grafana Thema in einen eigenen Thread verschoben.
Link zum Ziel -
@paul53 sagte in Datenpunkt für JSON:
@kail sagte: Wie müsste ein entsprechendes Javascript aussehen?
const arr = [ {"time": "xxxxxxx", "value": xxx}, {"time": "xxxxxxx", "value": xxx}, {"time": "xxxxxxx", "value": xxx} ]; setState(idJSON, JSON.stringify(arr), true);
Wie fülle ich das Array über eine Schleife?
-
@kail sagte: Wie fülle ich das Array über eine Schleife?
Wo kommen die Daten für das Array her?
-
@paul53
Über das Script sollen Werte aus Datenpunkten von DasWetter gesammelt werden. -
@kail sagte: aus Datenpunkten
Z.B. so:
const ids = [id1, id2, id3]; const arr = []; for(let i = 0; i < ids.length; i++) { let state = getState(ids[i]); let obj = { time: formatDate(state.lc, 'hh:mm:ss'), value: state.val }; arr.push(obj); } setState(idJSON, JSON.stringify(arr), true);
Es wird noch ein Trigger benötigt.
-
@paul53
Danke für Deinen Support.
Die Anzahl der Datenpunkte ist 24
const i_max = 24
Kann die id des Datenpunktes auch zusammensetzt sein, original für den ersten wäre:daswetter.0.NextHours.Location_1.Day_1.Hour_1.rain_value
Die variable Lösung wäre mit i, wobei i dann mit 1 anfangen müsste.
daswetter.0.NextHours.Location_1.Day_1.Hour_ + i + .rain_value
-
@kail sagte: wobei i dann mit 1 anfangen müsste.
Stunden fangen mit 1 an?
-
@kail sagte: Kann die id des Datenpunktes auch zusammensetzt sein
const path = 'daswetter.0.NextHours.Location_1.Day_1.Hour_'; const arr = []; for(let i = 1; i <= 24; i++) { let state = getState(path + i + '.rain_value'); let obj = { time: formatDate(state.lc, 'hh:mm:ss'), value: state.val }; arr.push(obj); } setState(idJSON, JSON.stringify(arr), true);
-
Guten Morgen Paul,
Dein Script habe ich ein wenig ergänzt. Würdest Du bitte einmal schauen, ob es JS konform ist.
Die Abfrage der Wetterdaten wird alle 15 Minuten durchgeführt. Welche art des Triggers bietet sich da an?
Danke und Grüßeconst idJSON = '0_userdata.0.Visualisierung.Niederschlag'/*Niederschlag*/; const path = 'daswetter.0.NextHours.Location_1.Day_1.'; const arr = []; for(let i = 0; i <= 24; i++) { if (i == 0) { var state = getState(path + 'current.rain_value'); var date = new Date(state.ts); } else { state = getState(path + 'Hour_' + i + '.rain_value'); date = new Date(state.ts); date.setHours(date.getHours() + i); }; let obj = { time: formatDate(date, 'YYYY-MM-DD hh:mm:ss'), value: state.val }; arr.push(obj); } setState(idJSON, JSON.stringify(arr), true);
-
@kail sagte: alle 15 Minuten durchgeführt. Welche art des Triggers bietet sich da an?
Ein Trigger auf "current.rain_value" bei Aktualisierung.
const idJSON = '0_userdata.0.Visualisierung.Niederschlag'/*Niederschlag*/; const path = 'daswetter.0.NextHours.Location_1.Day_1.'; on({id: path + 'current.rain_value'}, function(dp) { const arr = []; for(let i = 0; i <= 24; i++) { if (i == 0) { var state = dp.state; // wie bisher
-
Wie ich eben feststellen musste, habe ich die Daten vom Adapter falsch interpretiert.
Die Werte beziehen sich auf die Uhrzeit und nicht auf Stunden.
Dadurch muss ich das Script etwas umbauen.
Wenn das Datum im Format YYYYMMDD als String vorliegt, wie bekomme ich das ins Format
YYYY-MM-DD, nur mit substring?let date = getState(path + '1.day_value'); let year = date.val.substring(0,4); let month = date.val.substring(4,6); let day = date.val.substring(6,8); date = year + '-' + month + '-' + day;
-
Das Script habe ich nun wie folgt umgebaut, vielleicht kann noch jemand darüberschauen, wie man den Code besser schreiben kann.
const idJSON = '0_userdata.0.Visualisierung.Niederschlag'/*Niederschlag*/; const path = 'daswetter.0.NextHours.Location_1.Day_'; on({id: path + '1.current.temp_value'}, function(dp) { const arr = []; let date = getState(path + '1.day_value'); let year = date.val.substring(0,4); let month = date.val.substring(4,6); let day = date.val.substring(6,8); let curr_date = year + '-' + month + '-' + day; for (let d = 1; d <= 2; d++) { for(let i = 1; i <= 24; i++) { var state_temp = getState(path + d +'.Hour_' + i + '.temp_value'); var state_rain = getState(path + d + '.Hour_' + i + '.rain_value'); var time = getState(path + d + '.Hour_' + i + '.hour_value'); if (d == 2 && i == 1) { curr_date = formatDate(new Date(curr_date).setDate(new Date(curr_date).getDate() + 1), 'YYYY-MM-DD'); } var datetime = new Date(curr_date + ' ' + time.val); datetime = new Date(datetime.getTime() - (1000)); let obj = { time: formatDate(datetime, 'YYYY-MM-DD hh:mm:ss'), Niederschlag: state_rain.val, Temperatur: state_temp.val }; arr.push(obj); }; }; setState(idJSON, JSON.stringify(arr), true); });
Das Resultat:
-
@kail sagte in Datenpunkt für JSON:
In Grafana kann ich die Daten nicht separieren
sollte man die daten nicht besser in eine datenbank schreiben (influx oder maria), dann kann grafana die daten selbst daraus lesen?
https://grafana.com/docs/grafana/latest/datasources/ -
@oliverio
Die Einstellungen für Grafana habe ich parallel hinbekommen und es funktioniert gut.
In die MariaDB speichere ich eigentlich nur Daten, die mich für einen längeren Zeitraum gesichert und abrufbar haben möchte dastrifft auf die Wetter-Vorschau nicht zu.
Grüße Kail -
stimmt ich vergaß das der hersteller vorschreibt, das die daten ein minimum-dauer an speicherfrist verlangt
-