NEWS
Frage zu history adapter
-
Hallo ich komme an einer Stelle nicht weiter.
Ich möchte per History geloggte Daten (jede Mininute ein Log) auslesen und das Avarage über einen Zeitraum von einer Stunde bilden und diesen Avarage dann in einen Array schreiben der 16 Stunden vorhält und jede Stunden die Werte eine Position nach hinten schiebt.
Ich bekomme aber die Fehlermeldung, dass ich den .val von der Result Funktion nicht auslesen kann => undefined...
Kann mir jemand helfen?var Liste, i, end = Date.now(); function listsRepeat(value, n) { var array = []; for (var i = 0; i < n; i++) { array[i] = value; } return array; } Liste = listsRepeat(0, 16); schedule("*/60 * * * *", async () => { sendTo('history.0', 'getHistory', { id: 'modbus.0.inputRegisters.30775_Wirkleistung_Gesamt.value', options: { start: end - 3600000, end: end, aggregate: 'average', ignoreNull: 0 } }, function (result) { for (i = 0; i <= 14; i++) { Liste[(i)] = Liste[(i + 1)]; } Liste[15] = result.result[0].val; setState('javascript.0.AWTRIX.BAR_PV', Liste); }); });
-
@totte23 sagte: aggregate: 'average',
liefert nicht nur einen Mittelwert über die 60 Einträge. Man muss auch count: 1 einstellen.
aggregate: 'average', count: 1, ignoreNull: 0 } }, function (data) { Liste.shift(); Liste.push(data.result[1].val);
Eine Liste mit 16 Einträgen von 0 kann man so erzeugen und mit einer bereits existierenden Liste überschreiben:
const idListe = 'javascript.0.AWTRIX.BAR_PV'; var Liste = Array(16).fill(0); if(existsState(idListe) && getState(idListe).val) Liste = getState(idListe).val;
-
@paul53 Danke! Ich teste das später mal aus!
-
@paul53 Zu Testzwecken lasse ich aktuell jede Sekunde einen Wert loggen und bilde dann den Mittelwert je Minute.
Ich habe den Code reduziert um erstmal die grundlegende Funktion zu testen.
Leider kommt immer noch ein Fehler und ich habe keine Idee woran es liegt:var Liste = Array(16).fill(0), i, end = Date.now(); schedule("* * * * *", async () => { sendTo('history.0', 'getHistory', { id: 'modbus.0.inputRegisters.30775_Wirkleistung_Gesamt.value', options: { start: end - 60000, end: end, aggregate: 'average', count: 1, ignoreNull: 0 } }, function (data) { Liste.shift(); Liste.push(data.result[1].val); setState('javascript.0.AWTRIX.BAR_PV', Liste); }); });
Meldung aus dem Log dazu:
States system pmessage io.messagebox.system.adapter.javascript.0 {"command":"getHistory","message":{"result":[],"step":60000,"error":null},"from":"system.adapter.history.0","callback":{"message":{"id":"modbus.0.inputRegisters.30775_Wirkleistung_Gesamt.value","options":{"start":1688561934479,"end":1688561994479,"aggregate":"average","count":1,"ignoreNull":0}},"id":791,"ack":true,"time":1688562060017},"_id":59371133} Cannot read properties of undefined (reading 'val')
und:
TypeError: Cannot read properties of undefined (reading 'val') at Object.cb (script.js.AWTRIX.bars:18:31) at change (/opt/iobroker/node_modules/@iobroker/js-controller-adapter/src/lib/adapter/adapter.ts:10970:45) at Immediate._onImmediate (/opt/iobroker/node_modules/@iobroker/db-states-redis/src/lib/states/statesInRedisClient.ts:379:37) at processImmediate (node:internal/timers:476:21) -
@totte23 sagte: "result":[]
Wird der DP "modbus.0.inputRegisters.30775_Wirkleistung_Gesamt.value" mittels "history.0" aufgezeichnet? Das leere Array sieht nicht danach aus. Füge mal eine Log-Ausgabe ein:
}, function (data) { log(data.result);
Bei mir spuckt das Log ein Array mit zwei Objekten aus:
[{'ts':1688559256536,'val':78.6,'i':true},{'ts':1688561056536,'val':81.1}]
-
@paul53 said in Frage zu history adapter:
log(data.result);
sieht bei mir eigentlich ganz gesund aus....
[{'ts':1688563452965,'val':412.7,'i':true},{'ts':1688563482965,'val':379.4},{'ts':1688563512965,'val':360.2,'i':true}]
Viellecht irgendwo Tippfehler...
-
@totte23 sagte: sieht bei mir eigentlich ganz gesund aus...
Dann muss
data.result[1].val
den Wert 379.4 liefern. Kann keinen Tippfehler erkennen.
-
@paul53 Läuft jetzt. Mir war aufgefallen, dass die "end" deklarierung noch außerhalb vom timer lag. Da kam dann natürlich über Laufzeit nichts sinnvolles bei rum. Mit diesem Code läuft es jetzt...
var Liste = Array(16).fill(0), i; schedule("* * * * *", async () => { var end = Date.now(); sendTo('history.0', 'getHistory', { id: 'modbus.0.inputRegisters.30775_Wirkleistung_Gesamt', options: { start: end - 60000, end: end, aggregate: 'average', count: 1, ignoreNull: 0 } }, function (data) { Liste = getState('javascript.0.AWTRIX.BAR_PV').val; Liste.shift(); Liste.push(data.result[1].val); setState('javascript.0.AWTRIX.BAR_PV', Liste); }); });
Nochmals vielen Dank für den Support. Ohne dich hätte ich es nicht gelöst!