nochmal eine neue Version mit einem gleitenden Durchschnitt
// Konfiguration
var threshold = -1100; // Schwellenwert für den Stromüberschuss
var averageTimeMinutes = 30; // Zeitraum für den Durchschnitt in Minuten
var powerOnTimeoutMinutes = 30; // Timeout für das Einschalten in Minuten, X Minuten bleibt das Gerät definitiv an.
var powerOffTimeoutMinutes = 5; // Timeout für das Ausschalten in Minuten, X Minuten bleibt das Gerät definitiv aus.
var devicePowerConsumption = 400; // Leistungsaufnahme des Gerätes in Watt
var debugMode = false; // Debug-Modus ein-/ausschalten
var entpreller = 0;
var istAn = false;
var averagePower = [];
on({ id: [].concat(['sonoff.0.Hichi_Stromzähler. _16_7_0']), change: 'ne' }, async (obj) => {
var value = obj.state.val;
var timestamp = obj.state.ts;
var deltaTime = 0;
if (averagePower.length > 0) {
var lastTimestamp = averagePower[averagePower.length - 1].timestamp;
deltaTime = (timestamp - lastTimestamp) / (1000 * 60);
}
var powerChange = 0;
if (averagePower.length > 0) {
var lastValue = averagePower[averagePower.length - 1].value;
powerChange = value - lastValue;
}
var powerChangeRate = deltaTime > 0 ? powerChange / deltaTime : 0;
averagePower.push({ value: value, timestamp: timestamp });
if (averagePower.length > averageTimeMinutes) {
averagePower.shift();
}
var sumPowerChange = averagePower.reduce((acc, curr, index, array) => {
if (index < array.length - 1) {
return acc + (curr.value - array[index + 1].value);
} else {
return acc;
}
}, 0);
var average = Math.round(sumPowerChange / averagePower.length);
// Debug-Protokollierung für den aktuellen Wert des Stromzählers
if (debugMode) {
console.log("Aktueller Wert des Stromzählers: " + value);
}
// Debug-Protokollierung für den Durchschnitt
if (debugMode) {
console.log("Durchschnitt über " + averageTimeMinutes + " Minuten: " + average);
}
if (entpreller == 0 && istAn == false && average < (threshold + devicePowerConsumption) && compareTime('10:00', '19:00', 'between', null)) {
entpreller = 1;
setState('sonoff.0.Gosund_16A_3.POWER', true);
istAn = true;
console.log('PV Steckdose ein! Stromüberschuss vorhanden.');
sendTo("telegram.0", "send", {
text: 'PV Steckdose ein! Stromüberschuss vorhanden.'
});
setTimeout(() => {
entpreller = 0;
}, powerOnTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
}
if (entpreller == 0 && istAn == true && average > (threshold - devicePowerConsumption)) {
entpreller = 1;
setState('sonoff.0.Gosund_16A_3.POWER', false);
istAn = false;
console.log('PV Steckdose aus! Kein Stromüberschuss vorhanden.');
sendTo("telegram.0", "send", {
text: 'PV Steckdose aus! Kein Stromüberschuss vorhanden.'
});
setTimeout(() => {
entpreller = 0;
}, powerOffTimeoutMinutes * 60000); // Umwandlung von Minuten in Millisekunden
}
});