@arteck
Danke für deine Rückmeldung.
Dann versuche ich gerne selbst mein Glück, trotz meiner bescheidenen Scripting Skills.
Ich hab das Script wie folgt nach bestem Wissen und Gewissen angepasst:
const _apg = 'apg-info.0.marketprice.'; // Anpassen!
const _apgDP1 = '0_userdata.0';
const _apgDP2 = 'Stromversorgung.apg.';
const _apgDP = _apgDP1 + '.' + _apgDP2;
const options = { hour12: false, hour: '2-digit', minute:'2-digit'};
// bei jeder preisänderung wird die neue Stunde mit dem niedrigen Preis für die vis übernommen
const apgPreisUebermnehmen = true;
//
const _apgLevelErmitteln = false;
createUserStates(_apgDP1, false, [_apgDP2 + 'extra.apgPvForcast', { 'name': 'apg formattierung für pv prognose', 'type':'array', 'read': true, 'write': false, 'role': 'json'}], function () { });
createUserStates(_apgDP1, false, [_apgDP2 + 'extra.apgPvForcastTomorrow', { 'name': 'apg rest preise für morgen', 'type':'array', 'read': true, 'write': false, 'role': 'json'}], function () { });
createUserStates(_apgDP1, false, [_apgDP2 + 'extra.apgBestPreisArrayLang', { 'name': 'apg bester preis als array', 'type':'array', 'read': true, 'write': false, 'role': 'json'}], function () { });
createUserStates(_apgDP1, false, [_apgDP2 + 'extra.apgBestPreisArrayLangTomorrow', { 'name': 'apg bester preis als array für Morgen', 'type':'array', 'read': true, 'write': false, 'role': 'json'}], function () { });
createUserStates(_apgDP1, false, [_apgDP2 + 'extra.apgBestPreis', { 'name': 'apg Best Preis', 'type':'number', 'read': true, 'write': false, 'role': 'state', 'def':0 , "unit": "ct" }], function () {
setState(_apgDP + 'extra.apgBestPreis', 0, true);
});
createUserStates(_apgDP1, false, [_apgDP2 + 'extra.apgPreisJetzt', { 'name': 'apg Preis Jetzt', 'type':'number', 'read': true, 'write': false, 'role': 'state', 'def':0, "unit": "ct" }], function () {
setState(_apgDP + 'extra.apgPreisJetzt', 0, true);
});
createUserStates(_apgDP1, false, [_apgDP2 + 'extra.apgPreisNächsteStunde', { 'name': 'apg Preis Nächste Stunde', 'type':'number', 'read': true, 'write': false, 'role': 'state', 'def':0, "unit": "ct" }], function () {
setState(_apgDP + 'extra.apgPreisNächsteStunde', 0, true);
});
if (_apgLevelErmitteln) {
createUserStates(_apgDP1, false, [_apgDP2 + 'extra.apgLevelJetzt', { 'name': 'Preis Level', 'type':'string', 'read': true, 'write': false, 'role': 'text', 'def': '' }], function () {
setState(_apgDP + 'extra.apgLevelJetzt', '', true);
});
createUserStates(_apgDP1, false, [_apgDP2 + 'extra.apgLevelNächsteStunde', { 'name': 'Preis Level', 'type':'string', 'read': true, 'write': false, 'role': 'text', 'def': '' }], function () {
setState(_apgDP + 'extra.apgLevelNächsteStunde', '', true);
});
}
holePreis();
preisJetzt();
function holePreis() {
let preiseHeute = [];
let preiseMorgen = [];
let preisePV = [];
let preisePVTommorow = [];
const arr1 = JSON.parse(getState(_apg +'today.jsonChartPricesToday.json').val);
const arr2 = JSON.parse(getState(_apg +'tomorrow.jsonChart').val);
let arrPrice = arr1;
let now = new Date();
if (arr2.length > 0) {
now.setMinutes(0, 0, 0);
const heutePreise = arrPrice.filter(price => new Date(price.startsAt) >= now);
arrPrice = heutePreise.concat(arr2); // füge beide zusammen
} else {
now.setHours(0, 0, 0, 0);
}
const next24Hours = new Date(now.getTime() + 24 * 60 * 60 * 1000);
for (let i = 0; i < arrPrice.length; i++) {
const element = arrPrice[i];
const startsAt = element.startsAt;
const start = new Date(startsAt);
const preis = element.total;
const end = new Date(Date.parse(startsAt)).getTime()+3600000;
const startTime = start.toLocaleTimeString('de-DE', options);
const endTime = new Date(end).toLocaleTimeString('de-DE', options);
const hhStartTime = startTime.split(':')[0];
let objHeute = {};
if (start >= now && start < next24Hours) {
// console.warn(`Starts at: ${start}, Total: ${preis}`);
objHeute.start = start.getHours();
objHeute.preis = preis;
preiseHeute.push(objHeute);
preisePV.push([preis, startTime , hhStartTime + ':30']);
preisePV.push([preis, hhStartTime + ':30', endTime]);
}
}
// preise für morgen für die VIS
for (let m = 0; m < arr2.length; m++) {
const element = arr2[m];
const startsAt = element.startsAt;
const start = new Date(startsAt);
const preis = element.total;
const end = new Date(Date.parse(startsAt)).getTime()+3600000;
const startTime = start.toLocaleTimeString('de-DE', options);
const endTime = new Date(end).toLocaleTimeString('de-DE', options);
const hhStartTime = startTime.split(':')[0];
let objMorgen = {
start : start.getHours(),
preis : preis
};
preiseMorgen.push(objMorgen);
preisePVTommorow.push([preis, startTime , hhStartTime + ':30']);
preisePVTommorow.push([preis, hhStartTime + ':30', endTime]);
}
let preiseSortLang = preiseHeute;
preiseSortLang.sort(function(a, b) {
return a.start - b.start;
});
let preiseSortLangTomorrow = preiseMorgen;
preiseSortLangTomorrow.sort(function(a, b) {
return a.start - b.start;
});
const preisePVSort = sortArrayByStartTime(preisePV, getHH());
setState(_apgDP + 'extra.apgBestPreisArrayLang', preiseSortLang, true);
setState(_apgDP + 'extra.apgBestPreisArrayLangTomorrow', preiseSortLangTomorrow, true);
setState(_apgDP + 'extra.apgPvForcast', preisePVSort, true);
setState(_apgDP + 'extra.apgPvForcastTomorrow', preisePVTommorow, true);
errechneBesteUhrzeit(preiseSortLang);
}
function sortArrayByStartTime(array, currentHour) {
// Sortiere den Array nach der Startzeit
array.sort((a, b) => {
const timeA = a[1].split(":").map(Number);
const timeB = b[1].split(":").map(Number);
// Vergleiche Stunden
if (timeA[0] != timeB[0]) {
return timeA[0] - timeB[0];
}
// Wenn Stunden gleich sind, vergleiche Minuten
return timeA[1] - timeB[1];
});
// Finde den Index des aktuellen Zeitpunkts
let startIndex = array.findIndex(item => {
const time = item[1].split(":").map(Number);
return time[0] >= currentHour || (time[0] == currentHour && time[1] >= 30);
});
// Schneide den Array ab startIndex und setze ihn an das Ende
const sortedArray = array.slice(startIndex).concat(array.slice(0, startIndex));
return sortedArray;
}
function errechneBesteUhrzeit(allePreise) {
const [niedrigsterIndex, zweitNiedrigsterIndex] = findeBenachbarteNiedrigstePreise(allePreise);
const preiseKurzArr = [];
preiseKurzArr.push(allePreise[niedrigsterIndex]);
preiseKurzArr.push(allePreise[zweitNiedrigsterIndex]);
startZeit(preiseKurzArr);
}
function findeBenachbarteNiedrigstePreise(preisArray) {
let niedrigsterPreisSumme = Number.POSITIVE_INFINITY;
let niedrigsterPreisIndex1 = -1;
let niedrigsterPreisIndex2 = -1;
for (let i = 0; i < preisArray.length - 1; i++) {
// wir bilden eine summer
const summe = preisArray[i].preis + preisArray[i + 1].preis;
// Prüfe, ob diese Summe kleiner als die bisher niedrigste ist
if (summe < niedrigsterPreisSumme) {
niedrigsterPreisSumme = summe;
niedrigsterPreisIndex1 = i;
niedrigsterPreisIndex2 = i + 1;
}
}
if (niedrigsterPreisIndex1 > niedrigsterPreisIndex2) {
let temp = niedrigsterPreisIndex1;
niedrigsterPreisIndex1 = niedrigsterPreisIndex2;
niedrigsterPreisIndex2 = temp;
}
// gebe den index raus
return [niedrigsterPreisIndex1, niedrigsterPreisIndex2];
}
function startZeit(preiseKurz) {
const apgNutzenManuell = getState(_apgDP + 'extra.apgNutzenManuell').val;
const start = preiseKurz[0].start;
const preis = preiseKurz[0].preis;
preiseKurz.splice(0, 1);
if (apgPreisUebermnehmen && !apgNutzenManuell) {
setState(_apgDP + 'extra.apgNutzenManuellHH', start, true);
setState(_apgDP + 'extra.apgBestPreis', preis, true);
}
}
function preisJetzt() {
let hh = Number(getHH());
let preis = getState(_apg + 'today.' + hh + '.total').val;
let apgLevel = getState(_apg + 'today.' + hh + '.level').val;
setState(_apgDP + 'extra.apgPreisJetzt', preis, true);
if (_apgLevelErmitteln) {
setState(_apgDP + 'extra.apgLevelJetzt', apgLevel, true);
}
hh = hh + 1;
if (hh > 23) {
hh = 0;
}
preis = getState(_apg + 'today.' + hh + '.total').val;
setState(_apgDP + 'extra.apgPreisNächsteStunde', preis, true);
if (_apgLevelErmitteln) {
apgLevel = getState(_apg + 'today.' + hh + '.level').val;
setState(_apgDP + 'extra.apgLevelNächsteStunde', apgLevel, true);
}
}
schedule('0 * * * *', function () {
holePreis();
preisJetzt();
});
Wenn ich es starte erhalte ich allerdings folgende Fehlermeldungen und es werden keine DPs unter "Objects" angelegt:

Hast du eine Idee wo ich einen Fehler eingebaut habe ?
Danke.
Beste Grüße