@paul53 sagte in Trigger mehrerer Werte:
Wenn man die Zählerstanddifferenz zwischen Ein- und Ausschalten des DLE verwendet, werden auch alle parallel laufenden Verbraucher mit erfasst.
ja klar, das ist so, deshalb Variante --- der durchschnittliche Verbrauch vorher Trigger wird ermittelt und anschließend abgezogen.
// Smartmeter
let idPOW = 'smartmeter.0.1-0:16_7_0__255.value'; // aktuelle Leistung in Watt
let id_Zaehlerstand = 'smartmeter.0.1-0:1_8_0__255.value'; // aufgelaufener gesamt-Zählerstand in kWh
let id_L2 = 'smartmeter.0.1-0:51_7_0__255.value'; // Stromstärke Phase 2 in A
let id_L3 = 'smartmeter.0.1-0:71_7_0__255.value'; // Stromstärke Phase 3 in A
// Userdata .. DlE = Durclauferhitzer
let idDlE_Zustand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.DL_aktiv'; // DL aktiv|true , inaktiv|false
let idDLE_Zaehlerstand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.Zaehlerstand'; // aufgelaufener Verbrauch in kWh
//Trigger
const iTrigger = 5000; // Schwellwert ab der aktiver Durchlauferhitzer vermutet wird.
const iTrigger2 = 5; // Schwellwert in A bei L2 && L3 bei aktivem Durchlauferhitzer
//Programm
let fZaehlerStart;
var fVerbrauch; // Verbrauch während Trigger
var fAlterWert;
var bAktiv; // true = Verbrauch wird aufgezeichnet, DLE in Betrieb
var aGrundverbrauch = []; // 0-29 des Grundverbrauches
var aTimeGrundverbrauch = []; // array 0-29 des Zeitabstand Grundverbrauchswerte
var iAvgGrundverbrauch; // Mittelwert der letzten Werte Watt
// ************************************************************************
// Mittelwert Grundverbrauch
// Parameter myArray [Zeitstempel,Verbrauch]
function ArrayMittel(myArray) {
var i = 0, sum = 0, ArrayLen = myArray.length;
// Verbrauch summieren
while (i < ArrayLen) {
sum = sum + myArray[i++][1];
}
// Zeitspanne ermitteln
var t = (myArray[myArray.length-1][0] - myArray[0][0]) / 1000; // Sekunden
// Rückgabe KWh
return (sum / 1000 / ArrayLen) / 3600 * t;
}
on({ id: idPOW, change: "ne" }, function (obj) {
//if (obj.state.val >= iTrigger && !bAktiv) {
if (obj.state.val >= iTrigger && !bAktiv && getState(id_L2).val > iTrigger2 && getState(id_L3).val > iTrigger2 ) {
bAktiv = true;
setState (idDlE_Zustand,true);
fZaehlerStart = getState(id_Zaehlerstand).val; //gesamt-Zählerstand notieren
}
else if (obj.state.val < iTrigger && bAktiv) {
bAktiv = false;
setState (idDlE_Zustand,false);
fVerbrauch = getState(id_Zaehlerstand).val - fZaehlerStart; // Verbrauch ermitteln
fAlterWert = getState (idDLE_Zaehlerstand).val;
// negative Werte durch Abzug von Grundverbrauch vermeiden
if (fAlterWert + fVerbrauch - iAvgGrundverbrauch >= 0) {
setState(idDLE_Zaehlerstand, fAlterWert + fVerbrauch); // Verbrauch abzüglich Grundeverbrauch ermitteln
}
}
else if (!bAktiv) { // den Mittelwert der letzten 30 Werte vor Inbetriebnahme des Durchlauferhitzers ermitteln
// laufend ....
aGrundverbrauch.push( [new Date().getTime() , obj.state.val] );
// nur die letzten 30 Werte merken, Rest trashen ..
if (aGrundverbrauch.length > 30) {
aGrundverbrauch.shift();
}
// Mittelwert aus den letzten 30 Werten bilden
iAvgGrundverbrauch = ArrayMittel(aGrundverbrauch);
console.log("aGrundverbrauch: " + JSON.stringify(aGrundverbrauch));
}
});