NEWS
Trigger mehrerer Werte
-
Ich möchte in etwa den Stromverbrauch unseres Durchlauferhitzers mit dem Adapter "Smartmeter" festhalten.
Das ist so natürlich nur indirekt möglich und steht auf wackeligen Füßen.Durchlauferhitzer arbeitet mit 18 |21 | 24 KW je Auswahl
Die Eingangswassertemperataur beeinflusst den Verbrauch.
Andere Verbraucher beeinflussen den Verbrauch inzwischen.Nun habe ich beobachtet, das die Phasen L2 und L3 /Smartmeter/ immer dann ansteigen, wenn Durchlauferhitzer arbeitet.
Trigger ist deshalb:
if (obj.state.val >= iTrigger && !bAktiv && getState(id_L2).val > iTrigger2 && getState(id_L3).val > iTrigger2 ) {
Aber : wenn die Werte von L2 oder L3 nur ein wenig später eingehen als "obj.state.val >= iTrigger" als wird nicht getriggert.
Kann man das so machen bzw. wie macht man es richtig ?
Hier mal mei Versuch
// 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 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; setState(idDLE_Zaehlerstand, fAlterWert + fVerbrauch); // Verbrauch ermitteln } });
LG K
-
@senior1418 sagte: mit 18 |21 | 24 KW je Auswahl
Ändert sich die Leistung auch im laufenden Betrieb?
Gibt es noch andere Verbraucher mit einer Leistungsaufnahme von mind. 16 kW?Wenn beide Fragen mit "nein" beantwortet werden, würde ich es so machen:
// Smartmeter const idPOW = 'smartmeter.0.1-0:16_7_0__255.value'; // aktuelle Leistung in Watt // Userdata .. DlE = Durclauferhitzer const idDlE_Zustand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.DL_aktiv'; // DL aktiv|true , inaktiv|false const idDLE_Zaehlerstand = '0_userdata.0.Energieverbrauch.Durchlauferhitzer.Zaehlerstand'; // aufgelaufener Verbrauch in kWh //Programm var start = Date.now(); var fAlterWert = getState(idDLE_Zaehlerstand).val; var power = 18; on(idPOW, function(dp) { let sprung = dp.state.val - dp.oldState.val; if(sprung > 16500) { power = 24; if(sprung < 22500) power = 21; if(sprung < 19500) power = 18; start = Date.now(); setState(idDlE_Zustand,true, true); } else if(sprung < -16500) { setState (idDlE_Zustand,false, true); let dauer = (Date.now() - start) / 3600000; // in Stunden let fVerbrauch = power * dauer; fAlterWert += fVerbrauch; // in kWh setState(idDLE_Zaehlerstand, Math.round(fAlterWert * 100) / 100, true); } });
Wenn man die Zählerstanddifferenz zwischen Ein- und Ausschalten des DLE verwendet, werden auch alle parallel laufenden Verbraucher mit erfasst.
-
@paul53 sagte in Trigger mehrerer Werte:
Ändert sich die Leistung auch im laufenden Betrieb?
Gibt es noch andere Verbraucher mit einer Leistungsaufnahme von mind. 16 kW?vielen Dank ! ich brauche etwas Zeit um das zu verstehen bzw. versuche das nachzustellen
-
@paul53 sagte in Trigger mehrerer Werte:
Ändert sich die Leistung auch im laufenden Betrieb?
.. sehr wahrscheinlich
Gibt es noch andere Verbraucher mit einer Leistungsaufnahme von mind. 16 kW?
in.. meinem Fall nehme ich Mindestleitung kleiner 5KW an, deshalb "iTrigger = 5000"
Wenn beide Fragen mit "nein" beantwortet werden, würde ich es so machen:
also nein !
-
@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)); } });