Jos vaikka jollain olis uusio-käyttöä… Jätin alle mukaan input-esimerkin (tai helppo muutaa PbH-JSON:llekin) (koodi ei varmasti optimia, mutta tuntuu ajavan asiansa
)
Nyt vihdoin jaksoin tehdä sen, mitä aikanaan PbH:lta kaipailin (eli etupeltoon katselua ja samojen hintojen priorisointia…)
Alla Then-kortilla kysytään koko 15min hinnoista, onko 110h
päässä oleva 15min jakso (minulla ei tarvetta laskea pidempiä yhtenäisiä jaksoja, vielä
) siitä seuraavalla 4h 15min jaksolla kaikista halvin 15min (paluu true/false), priorisoiden tässä ekana tulevan jos/kun samoja hintoja.
Samalla luodaan dedicate-tag:ejä (koodi ajettava kerran halutulla tagStart:lla ennen flow-tagejä), joista voi käyttää/päätellä halutessaan muutakin…
(Samalla tuli ratkaistua, miten saan skaalautuvasti/systemaattisesti/suht.helposti scriptiin ja scriptistä takaisin tuloksia ilman turhien variant ja/tai virtual device manuaalusta perustamista)
//El Price evaluation
const allArguments = args[0];
//const sepArguments = allArguments.split(';').map(value =>
// (value.startsWith('{') || value.startsWith(' {')) ? value : value.trim());
const sepArguments = allArguments.split(';').map(value =>
value.includes('{') ? value : value.trim()
);
//--------------------------------------
const tagStart = sepArguments[0].toString() + '_';
//--------------------------------------
const elJSON = JSON.parse(sepArguments[1]);
const elIncrement = parseFloat(sepArguments[2]); // zero => flat, positive => earlier value, neg. => later
const startHours = parseFloat(sepArguments[3]); // ++ hours fron now (also as ref. value)
const totalHours = parseFloat(sepArguments[4]); // observed hours
const amongLowest = parseFloat(sepArguments[5]); // to be one of lowest observed 15min periods
//--------------------------------------
//excample
// const tagStart = 'elFuture_test_';
// const elJSON = JSON.parse('{"2025-02-10T19:15Z":"15.10335","2025-02-10T19:30Z":"15.10335","2025-02-10T19:45Z":"15.10335","2025-02-10T20:00Z":"13.46683","2025-02-10T20:15Z":"13.46683","2025-02-10T20:30Z":"13.46683","2025-02-10T20:45Z":"13.46683","2025-02-10T21:00Z":"9.97416","2025-02-10T21:15Z":"9.97416","2025-02-10T21:30Z":"9.97416","2025-02-10T21:45Z":"9.97416","2025-02-10T22:00Z":"7.90341","2025-02-10T22:15Z":"7.90341","2025-02-10T22:30Z":"7.90341","2025-02-10T22:45Z":"7.90341","2025-02-10T23:00Z":"10.26407","2025-02-10T23:15Z":"10.26407","2025-02-10T23:30Z":"10.26407","2025-02-10T23:45Z":"10.26407","2025-02-11T00:00Z":"9.59013","2025-02-11T00:15Z":"9.59013","2025-02-11T00:30Z":"9.59013","2025-02-11T00:45Z":"9.59013","2025-02-11T01:00Z":"8.31505","2025-02-11T01:15Z":"8.31505","2025-02-11T01:30Z":"8.31505","2025-02-11T01:45Z":"8.31505"} ');
// const elIncrement = 1e-10;
// const startHours = 1.25;
// const totalHours = 2;
// const amongLowest = 1;
// ==>> i.e. selected here earlier cheaper, ref. price at 1h 15min from now, observe till ++2hours
try {
await tag(tagStart + 'elAct', null);
await tag(tagStart + 'elAve', null);
await tag(tagStart + 'elMin', null);
await tag(tagStart + 'elMax', null);
await tag(tagStart + 'elMinDiff', null);
await tag(tagStart + 'elMaxDiff', null);
await tag(tagStart + 'elAveShare', null);
await tag(tagStart + 'elMinShare', null);
await tag(tagStart + 'elMaxShare', null);
await tag(tagStart + 'elPosShare', null);
await tag(tagStart + 'elPosMin', null);
await tag(tagStart + 'elPosMax', null);
const startTime = new Date().getTime() + startHours *(60*60*1000);
const startTime15min = Math.floor( new Date(startTime) /(15*60*1000)) * (15*60*1000);
const startDate = new Date (startTime15min).toISOString().slice(0, -8) + "Z";
const endTime = new Date().getTime() + (startHours+totalHours-0.25) *(60*60*1000);
const endTime15min = Math.floor( new Date(endTime) /(15*60*1000)) * (15*60*1000);
const endDate = new Date (endTime15min).toISOString().slice(0, -8) + "Z";
const elJSONFiltered = Object.fromEntries(
Object.entries(elJSON).filter(([key, value]) => key >= startDate && key <= endDate)
);
let elJSONModified = {};
let index = 0;
for (let key in elJSONFiltered) {
elJSONModified[key] = parseFloat(elJSONFiltered[key]) + index * elIncrement;
index++;
}
let elSortedValues = Object.values(elJSONModified)
.map(v => parseFloat(v))
.sort((a, b) => a - b);
const elPosMin = elSortedValues.indexOf(elJSONModified[startDate]) +1;
const elMin = elSortedValues[0];
const elPosShare = ((elPosMin - 0.5 ) / elSortedValues.length)
const elSum = elSortedValues.reduce((acc, val) => acc + val, 0);
const elAve = elSum / elSortedValues.length;
const elAveShare = elJSONModified[startDate] / elAve;
const elMinShare = elJSONModified[startDate] / elMin;
const elMinDiff = elJSONModified[startDate] - elMin;
elSortedValues = Object.values(elJSONModified)
.map(v => parseFloat(v))
.sort((a, b) => b - a);
const elPosMax = elSortedValues.indexOf(parseFloat(elJSONModified[startDate])) +1;
const elMax = elSortedValues[0];
const elMaxShare = elJSONModified[startDate] / elMax;
const elMaxDiff = elJSONModified[startDate] - elMax;
// console.log(startDate, ' / ', endDate);
// console.log('Prices: ', parseFloat(parseFloat(elJSONModified[startDate]).toFixed(2)), parseFloat(elAve.toFixed(2)),parseFloat(elMin.toFixed(2)), parseFloat(elMax.toFixed(2)));
// console.log('Shares: ', parseFloat(elAveShare.toFixed(3)), parseFloat(elMinShare.toFixed(3)), parseFloat(elMaxShare.toFixed(3)), parseFloat(elPosShare.toFixed(3)));
// console.log('Pos: ', parseFloat(elPosMin), parseFloat(elPosMax));
// console.log('Diff: ', parseFloat(elMinDiff.toFixed(2)), parseFloat(elMaxDiff.toFixed(2)));
await tag(tagStart + 'elAct', parseFloat(parseFloat(elJSONModified[startDate]).toFixed(2)));
await tag(tagStart + 'elAve', parseFloat(elAve.toFixed(2)));
await tag(tagStart + 'elMin', parseFloat(elMin.toFixed(2)));
await tag(tagStart + 'elMax', parseFloat(elMax.toFixed(2)));
await tag(tagStart + 'elMinDiff', parseFloat(elMinDiff.toFixed(2)));
await tag(tagStart + 'elMaxDiff', parseFloat(elMaxDiff.toFixed(2)));
await tag(tagStart + 'elAveShare', parseFloat(elAveShare.toFixed(3)));
await tag(tagStart + 'elMinShare', parseFloat(elMinShare.toFixed(3)));
await tag(tagStart + 'elMaxShare', parseFloat(elMaxShare.toFixed(3)));
await tag(tagStart + 'elPosShare', parseFloat(elPosShare.toFixed(3)));
await tag(tagStart + 'elPosMin', parseFloat(elPosMin));
await tag(tagStart + 'elPosMax', parseFloat(elPosMax));
if(amongLowest >= elPosMin) {
return true;
} else {
return false
}
} catch (error) {
await tag(tagStart + 'ErrorText: ' + error);
throw new Error(error)
}
---- edit ----
Nyt koodi myös tulilla (korvasi flown (ja se PbH-kortin) jolla vain osa-optimi (kun näki vaan max. 35h)
eli "onko (15min päässä eli) tuleva 15min jakson sähköhinta sellainen, että on halvempi 160h aikana vs. kallein-15min-päällä-tarve-hinta (
(tarve ka 1h / vrk, mutta useampi päivä voi olla välissä ilman ongelmia…)