Closed Skol6 closed 9 months ago
Hallo @Skol6, danke fürs Feedback! Ich versuch mal die Fragen zu beantworten ;-)
function updateCurrentPrice(): void {
let sBeginHour: string = String(new Date().getHours());
let sEndHour: string = String(new Date().getHours() + 1);
const pad = '00';
sBeginHour = pad.substring(0, pad.length - sBeginHour.length) + sBeginHour;
sEndHour = pad.substring(0, pad.length - sEndHour.length) + sEndHour;
const range = sBeginHour + '_to_' + sEndHour;
let price: number = getState(path_todaysMarketprices + range).val;
setState(state_currentMarketPrice, price, true);
}
sBeginnHour könnte man auch in eine Schleife stecken
for (let i=0; .....) {
sBeginHour = String(i);
sEndHour: = String(i+1);
.....
}
"5 0 0,13,15 * * *"
on({ id: 'apg-info.0.marketprice.today_sorted.short', change: "ne" }, function (obj) {
setTimeout(checkCheapestToday, 2000); //2 Sekunden verzögert damit alles eingetragen ist
});
function checkCheapestToday() {
if (existsState(state_todayCheapest)) {
let state = getState(state_todayCheapest);
if (!state.val) return;
let value: any = JSON.parse(state.val);
let price: number = Number(value[1]);
let time = String(value[0]);
let theDay = 'Today';
let average = getState(state_averageToday).val;
visLog(`${theDay}s cheapest price: ${price} cent`);
log(`${theDay}s cheapest price: ${price} [${time}] on average ${average}`);
sendTelegram(`${theDay}s cheapest price: ${price} [${time}] on average ${average}`);
}
}
So viele Antworten :)
Peaktime: hab ich verstanden. Ist quasi kein feature zum Preis sondern zur allgemeinen Netzbelastung. Vermutlich hat das indirekt aber eine Auswirkung auf den Preis
"00_to_01": Würde sich das nicht einfacher auf 0,1,2,.. ändern lassen bei dir im Adapter? dann muss keiner da irgendwelche Texte zusammenbasteln. Info geht im Readme und dein Adapter ist noch relativ jung.
negative Werte: Da geb ich dir grundsätzlich Recht. Das Limit hat für mich aber noch einen anderen Sinn: z.b. unter 9Cent ist es mir relativ egal ob der Strom noch billiger ist oder nicht. UND: wenn ich Geld dafür bekomme wäre das eine andere Funktion. Alternativ noch ein Limit einführen?
Wechsel heute/morgen: passt verstanden. D.h. wenn mein Skript um 00:03 läuft, dann muss ich die Werte von morgen nehmen.
Update: Wie bekomme ich im Iobroker die Info das es von deinem Adapter eine neue Version gibt. Bei mir lief noch die erste und hab gestern durch Zufall gesehen das es bereits eine neue Version gibt.
-Beispiel: finde ich super. Speicher hab ich leider noch keinen. Ich versuche gerade meine Wärmepumpe in den günstigen Stunden höherlaufen zu lassen und in den teuren zu reduzieren. Mal sehen was das bringt.
"00_to_01": werde mir was überlegen. Mir gefällt (habs ja auch so gemacht) die Variante bei der klar ist, was der Wert bedeutet. Vielleicht biete ich beide Optionen an Update: habe mir die Auswirkungen angesehen und da wäre einiges zu tun. Da macht es aus meiner SIcht mehr Sinn einfach folgende Funktion im JavaScript bei iobroker zu verwenden
/**
* @param {number} startingHour
* @returns {string}
*/
function getRange(startingHour) {
const pad = '00';
let sBeginHour = String(startingHour);
let sEndHour = String(startingHour + 1);
sBeginHour = pad.substring(0, pad.length - sBeginHour.length) + sBeginHour;
sEndHour = pad.substring(0, pad.length - sEndHour.length) + sEndHour;
return (`${sBeginHour}_to_${sEndHour}`);
}
und dann zB einfach in der for-Schleide das i
mit getRange(i)
zu ersetzen
negative Werde: in dem Fall würde doch folgendes reichen
schedule('33 0 * * * *', function () {
let sBeginHour: string = String(new Date().getHours());
let sEndHour: string = String(new Date().getHours() + 1);
const pad = '00';
sBeginHour = pad.substring(0, pad.length - sBeginHour.length) + sBeginHour;
sEndHour = pad.substring(0, pad.length - sEndHour.length) + sEndHour;
const range = sBeginHour + '_to_' + sEndHour;
let price: number = getState(path_todaysMarketprices + range).val;
if (price < 0) {
YOUR CODE
}
})
oder smarter mit der Funktion getRange()
schedule('33 0 * * * *', function () {
let price: number = getState(path_todaysMarketprices + getRange(new Date().getHours())).val;
if (price < 0) {
YOUR CODE
}
})
heute/morgen: Cron läuft bis 00.00.30 durch, dein script läuft um 00.03.00 wenn ich es richtig verstehe. Da ist heute schon heute Aber du kannst dir im Log mal ansehen wann der Adapter gegen 00.00 Uhr läuft bzw fertig ist
Update: wenn du am Beta-Repo bist bekommst die Updates schneller angezeigt wenn dich v.a. der spezielle Adapter interessiert kannst im Github Releases watchen
Topp. Läuft alles. Das Problem mit den Preisen konnte ich über die sortierte Liste umgehen, damit gehts einfach wenn man die ID hat
`var CurrentHour, ListSortedShort, i, CurrentPrice, OffPeak;
schedule("1 * * * *", async () => {
CurrentHour = (new Date().getHours());
ListSortedShort = (function () { try { return JSON.parse((CurrentHour > 0 ? getState('apg-info.0.marketprice.today_sorted.short').val : getState('apg-info.0.marketprice.tomorrow_sorted.short').val)); } catch (e) { return {}; }})();
console.log(('APG: Liste sortiert: ' + String(ListSortedShort)));
// Prüfe die sortierte Liste
for (i = 1; i <= 24; i++) {
// Suche den Index der aktuellen Stunde
if (CurrentHour == ListSortedShort[(i - 1)]) {
break;
}
}
CurrentPrice = getAttr(getState(('apg-info.0.marketprice.today_sorted.' + String(i - 1))).val, '1');
console.log(('APG:Current Price: ' + String(CurrentPrice)));
if (CurrentPrice < 1) {
// Strompreis <1 Cent = Saubillig - alles Einschalten
console.log('APG: Current Price: NEGATIV Verbraucher Einschalten!!! ');
} else if (i <= 8) {
// Strompreis Offpeak - 8h
OffPeak = true;
console.log(('APG: OffPeak - Uhrzeit: ' + String(CurrentHour)));
} else if (i <= 16) {
// Strompreis Shoulder - 8h);
} else {
// 8 teuerste Stunden - Peak
console.log(('APG: Peak - Uhrzeit: ' + String(CurrentHour)));
}
});`
Ich hätte noch eine Idee für ein nettes Feature. Dein Preis ist ja direkt der Marktpreis. Super wäre es wenn man in Iobroker seine Aufschläge vom Stromanbieter eingeben könnte und dann hätte man seinen wirklichen Strompreis.
Feature klingt interessant Muss ich mir überlegen wie ich da ausreichend Flexibilität reinbringen mit Fee, Steuern, Netzabgabe, nochmals Steuern, Strompreisbremse etc Aber eine Überlegung wert!
Glaub beim awattar Plugin war so was drinnen - Netzgebühren würde ich mir fast schenken und nur auf den Energiepreis schauen
Fee calculation can be tested in 0.1.5-alpha.0
Console:
iob upgrade iobroker.apg-info@0.1.5-alpha.0
Oder gleich die jeweiligen dynamischen Stromanbieter dazufügen :) Für Smart Energy gibts noch keinen Adapter - deren Api liefert aber die Preise https://apis.smartenergy.at/market/v1/price
Die Alpha probiere ich am Abend aus
Hi, funktioniert hervorragend! Komm auf die gleichen Preise wie Smart Energy! Vielen Dank.
Grüße, Skol
Hallo,
erstmals vielen Dank für deinen super Adapter - Besser als die Versionen die für Tibber und Awattar geschrieben sind. Besonders gefällt mir die .short listen, da man dadurch relativ schnell die günstigsten Tarife herausfindet. Auch das JSON und der Average Wert sind wirklich coole Gimmicks!
Zu den Fragen:
Was ist mit dem Bereich "Peak-Time" geplant? bei mir kommen hier keine Daten
Wie arbeitest du denn in Iobroker mit den Listen? Mir würde nur die Startzeit als eintrag reichen und damit wären schleifen viel einfacher zu realisieren.
Wie filtere ich am besten negative Strompreise raus? Idealerweise schaltet man da ja alles ein was nur irgendwie geht (natürlich nur um das Netz zu stützen :))
zu welcher Uhrzeit wechselt dein Adapter von Heute auf Morgen? Wenn ich um 00:02 den aktuellen Preis wissen möchte - schaue ich da bereits auf Today oder noch auf Tomorrow?
Wie bekomme ich die Updates automatisch im Iobroker mit?
Hast du irgendwelche Anwendungsbeispiele was du mit dem Adapter so treibst?
Vielen Dank!