NEWS
Berechnung Netzeinspeisung / if NL < 0 dann NE = PV – HV
-
Hallo Leute, ich habe keine Ahnung von javascript, trotzdem habe ich versucht eine Berechnung für die Netzeinspeisung abzubilden:
Wenn Netzleistung kleiner 0 dann Netzeinspeisung = PV-Leistung – Hausverbrauch
Es soll also zuerst geprüft werden ob die Netzleistung einen negativen Wert zeigt und dann soll gerechnet werden, wenn Netzleistung positiv, dann sollen die Werte ignoriert werden.Komme unten bei der Berechnung nicht weiter, wie bekomme ich den Hausverbrauch noch rein, könnt ihr bitte helfen?
// Objekt erstellen createState('PV_Anlage.Netzeinspeisung',0, { name: 'PV-Anlage: Netzeinspeisung', desc: 'Netzeinspeisung = PV-Leistung – Hausverbrauch', read: true, write: true, type: 'number', unit: 'kWh' }); var idPVLeistung = 'modbus.0.holdingRegisters.40068_PV_Leistung', idHausverbrauch = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung', idNetzleistung = 'modbus.0.holdingRegisters.40074_Netz_Leistung', idNetzeinspeisung = 'PV_Anlage.Netzeinspeisung'; // Berechnung mit aktuellen Daten, wenn Netzleistung <0 on({ id: idNetzleistung, change: 'ne', valLt: 0 }, function (data) { var pvleistung = getState(idPVLeistung).val, netzeinspeisung; // zu errechnen netzeinspeisung = data.newState.val - hausverbrauch; setState(idNetzeinspeisung, netzeinspeisung); }); -
Meinst du das:
on({ id: idNetzleistung, change: 'ne', valLt: 0 }, function (data) { setState(idNetzeinspeisung, getState(idPVLeistung).val - getState(idHausverbrauch).val); });EDIT: wobei ich das so lösen würde, damit Netzeinspeisung auch 0 wird.
var nNetzeinspeisung = 1; on({ id: idNetzleistung, change: 'ne', }, function (data) { if (data.state.val < 0 ) { nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val; setState(idNetzeinspeisung, nNetzeinspeisung); else if( nNetzeinspeisung != 0) { nNetzeinspeisung = 0; setState(idNetzeinspeisung, nNetzeinspeisung); }); -
Danke für deine Unterstützung, leider läuft das Script nicht, kannst du bitte nochmal prüfen:
//Objekt erstellen createState('PV_Anlage.Netzeinspeisung',0, { name: 'PV-Anlage: Netzeinspeisung', desc: 'Netzeinspeisung = PV-Leistung – Hausverbrauch', read: true, write: true, type: 'number', unit: 'kWh' }); var idPVLeistung = 'modbus.0.holdingRegisters.40068_PV_Leistung', idHausverbrauch = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung', idNetzleistung = 'modbus.0.holdingRegisters.40074_Netz_Leistung', idNetzeinspeisung = 'PV_Anlage.Netzeinspeisung'; // Berechnung mit aktuellen Daten, wenn Netzleistung <0 var nNetzeinspeisung = 1; on({ id: idNetzleistung, change: 'ne', }, function (data) { if (data.state.val < 0 ) { nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val; setState(idNetzeinspeisung, nNetzeinspeisung); // else if( nNetzeinspeisung != 0) { // nNetzeinspeisung = 0; // setState(idNetzeinspeisung, nNetzeinspeisung); });Meldung ist: javascript.0 (6481) script.js.common.Netzeinspeisung compile failed: at script.js.common.Netzeinspeisung:51
Zeile 46 - 50 habe ich auskommentiert, da ich dich Fragen wollte welche Auswirkungen das hat, bzw was da gemacht wird.
Letzte Frage: Was wird in Zeile 30 gemacht? -
Danke für deine Unterstützung, leider läuft das Script nicht, kannst du bitte nochmal prüfen:
//Objekt erstellen createState('PV_Anlage.Netzeinspeisung',0, { name: 'PV-Anlage: Netzeinspeisung', desc: 'Netzeinspeisung = PV-Leistung – Hausverbrauch', read: true, write: true, type: 'number', unit: 'kWh' }); var idPVLeistung = 'modbus.0.holdingRegisters.40068_PV_Leistung', idHausverbrauch = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung', idNetzleistung = 'modbus.0.holdingRegisters.40074_Netz_Leistung', idNetzeinspeisung = 'PV_Anlage.Netzeinspeisung'; // Berechnung mit aktuellen Daten, wenn Netzleistung <0 var nNetzeinspeisung = 1; on({ id: idNetzleistung, change: 'ne', }, function (data) { if (data.state.val < 0 ) { nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val; setState(idNetzeinspeisung, nNetzeinspeisung); // else if( nNetzeinspeisung != 0) { // nNetzeinspeisung = 0; // setState(idNetzeinspeisung, nNetzeinspeisung); });Meldung ist: javascript.0 (6481) script.js.common.Netzeinspeisung compile failed: at script.js.common.Netzeinspeisung:51
Zeile 46 - 50 habe ich auskommentiert, da ich dich Fragen wollte welche Auswirkungen das hat, bzw was da gemacht wird.
Letzte Frage: Was wird in Zeile 30 gemacht? -
@paul53 Danke, sind 2 schließende klammern
var nNetzeinspeisung = 1; on({ id: idNetzleistung, change: 'ne', }, function (data) { if (data.state.val < 0 ) { nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val; setState(idNetzeinspeisung, nNetzeinspeisung); } else if( nNetzeinspeisung != 0) { nNetzeinspeisung = 0; setState(idNetzeinspeisung, nNetzeinspeisung); } });In 46-50 wird idNetzeinspeisung auf 0 gesetzt. In deinem vorigen Script war das nie 0.
In 30 wird dafür gesorgt das beim ersten Durchlauf nach Scriptstart idNetzeinspeisung auf jeden Fall gesetzt wird. Und das die Kontrollvariable global ist und ihren Wert nicht verliert. -
Das Script läuft nun. Vielen, vielen Dank an euch!!!
Ich habe noch die Ladung des Speichers bei der Berechnung abgezogen, dann passt auch das Ergebnis.
Frage: Warum muss ich die idNetzeinspeisung auf 0 setzen bzw. was passiert mit der Berechnung wenn ich das nicht mache?//Objekt erstellen createState('PV_Anlage.Netzeinspeisung',0, { name: 'PV-Anlage: Netzeinspeisung', desc: 'Netzeinspeisung = PV-Leistung – Hausverbrauch - Akku', read: true, write: true, type: 'number', unit: 'W' }); var idPVLeistung = 'modbus.0.holdingRegisters.40068_PV_Leistung', idHausverbrauch = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung', idNetzleistung = 'modbus.0.holdingRegisters.40074_Netz_Leistung', idAkku = 'modbus.0.holdingRegisters.40070_Batterie_Leistung', idNetzeinspeisung = 'PV_Anlage.Netzeinspeisung'; // Berechnung mit aktuellen Daten, wenn Netzleistung <0 var nNetzeinspeisung = 1; on({ id: idNetzleistung, change: 'ne', }, function (data) { if (data.state.val < 0 ) { nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val - getState(idAkku).val; setState(idNetzeinspeisung, nNetzeinspeisung); } // else if( nNetzeinspeisung != 0) { // nNetzeinspeisung = 0; // setState(idNetzeinspeisung, nNetzeinspeisung); }); -
@highline
In deinem ursprünglichen Script hast du 0 und positive Werte von idNetzleistung ausgeschlossen. Ich bin deshalb davon ausgegangen ,das es dort positive Werte oder 0 gibt. Um idNetzeinspeisung nicht in einem undefinierten Zustand zu haben, setzt meine Script den Wert in dem Fall auf 0 und ignoriert alle weiteren Werte größer gleich 0 -
@highline
In deinem ursprünglichen Script hast du 0 und positive Werte von idNetzleistung ausgeschlossen. Ich bin deshalb davon ausgegangen ,das es dort positive Werte oder 0 gibt. Um idNetzeinspeisung nicht in einem undefinierten Zustand zu haben, setzt meine Script den Wert in dem Fall auf 0 und ignoriert alle weiteren Werte größer gleich 0 -
Nope.
if (data.state.val < 0 ) {behandele übergebene Werte unterhalb von 0
nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val - getState(idAkku).val;Setzte die Variable mit dem berechneten Wert
} else if( nNetzeinspeisung != 0) {Bedingung 1. war unwahr und der zuletzt gesetzte Wert war nicht 0
nNetzeinspeisung = 0;setzte Variable auf 0
setState(idNetzeinspeisung, nNetzeinspeisung);setzte State auf Wert der Variable.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden