NEWS
InfluxDB Adapter und Photovoltaik-Leistung
-
Hallo,
ich habe mal eine Frage zu dem Speichern der Werte, die von meiner PV Anlage kommen - diese müssen via "Timer" alle 100ms syncrhon gelesen werden, damit der Skalierungsfaktor zu dem Wert passt. Dies geschieht via Javascript.Leider werden somit jede Sekunde Werte in die influxDB geschrieben - dies würde ich gerne auf 10 Sekunden ändern, da es hier nur um die aktuelle Produktion geht.
Hier sieht man, wie die Werte Richtung influxDB "fliegen".
Ich dachte, ich käme mit "log changes minimal delta" weiter - aber der Adapter schreibt munter die Werte weiter.
Hat hier jemand einen Tipp?
Vielen Dank!
-
@skb sagte: müssen via "Timer" alle 100ms syncrhon gelesen werden, damit der Skalierungsfaktor zu dem Wert passt. Dies geschieht via Javascript.
?? Bitte erläutern. Skript?
@skb sagte in InfluxDB Adapter und Photovoltaik-Leistung:
dies würde ich gerne auf 10 Sekunden ändern
Datenpunkt, der alle 10 s mit dem Mittelwert der letzten 10 s geschrieben wird.
-
@paul53
Das Skript sieht so aus:// Aktuelle Leistung der Anlage createState('Solar.Wechselrichter.PVLeistungAktuell', { name: 'Aktuelle Leistung der Anlage in W', unit: 'W', min: 0, type: 'number', role: 'value.energy' }, function () { on('modbus.0.holdingRegisters.40083_I_AC_Leistung'/*AC-Leistungswert*/, function (obj) { var timeout = setTimeout(function () { clearTimeout(timeout); var factorState = getState('modbus.0.holdingRegisters.40084_I_AC_Leistung_SF'/*AC-Leistung Skalierungsfaktor*/); convertValue(obj.state.val, factorState ? factorState.val : 0, 'PVLeistungAktuell'); }, 100); }); var factorState = getState('modbus.0.holdingRegisters.40084_I_AC_Leistung_SF'/*AC-Leistung Skalierungsfaktor*/); var valueState = getState('modbus.0.holdingRegisters.40083_I_AC_Leistung'/*AC-Leistungswert*/); convertValue(valueState ? valueState.val : null, factorState ? factorState.val : 0, 'PVLeistungAktuell'); });
Und nun?
-
@skb sagte in: Das Skript sieht so aus:
Es fehlt die Funktion convertValue().
Außerdem wird nicht alle 100 ms eingelesen, sondern 100 ms nach dem Trigger die Konvertierung durchgeführt.
Ist der Wert von "AC-Leistung Skalierungsfaktor" konstant oder variabel? -
@paul53 Danke für die Rückmeldung. Natürlich wird der Wert nicht alle 100ms neu gelesen, sondern neu berechnet.
Hier nochmal die komplette Funktion:
// Funktion, um Werte mit Skalierung zu berechnen function convertValue(value, factor, destination) { if (value === null) return; if (factor === null) factor = 0; let num = value * Math.pow(10, factor); setState('Solar.Wechselrichter.' + destination, Number(num.toFixed(2)), true); } // Aktuelle Leistung der Anlage createState('Solar.Wechselrichter.PVLeistungAktuell', { name: 'Aktuelle Leistung der Anlage in W', unit: 'W', min: 0, type: 'number', role: 'value.energy' }, function () { on('modbus.0.holdingRegisters.40083_I_AC_Leistung'/*AC-Leistungswert*/, function (obj) { var timeout = setTimeout(function () { clearTimeout(timeout); var factorState = getState('modbus.0.holdingRegisters.40084_I_AC_Leistung_SF'/*AC-Leistung Skalierungsfaktor*/); convertValue(obj.state.val, factorState ? factorState.val : 0, 'PVLeistungAktuell'); }, 100); }); var factorState = getState('modbus.0.holdingRegisters.40084_I_AC_Leistung_SF'/*AC-Leistung Skalierungsfaktor*/); var valueState = getState('modbus.0.holdingRegisters.40083_I_AC_Leistung'/*AC-Leistungswert*/); convertValue(valueState ? valueState.val : null, factorState ? factorState.val : 0, 'PVLeistungAktuell'); });
@paul53 said in InfluxDB Adapter und Photovoltaik-Leistung:
Ist der Wert von "AC-Leistung Skalierungsfaktor" konstant oder variabel?
Der Skalierungsfaktor pro Wert ist immer gleich. Ich verwende die Funktion aber für mehrere Skalierungen. Daher unterscheidet er sich. Bei der Leistung ist er "-1" - bei der Temperatur "-2".
Das Skript hatte ich hier im Forum gefunden und etwas modifiziert.
-
@skb Vorschlag für ein Skript, das nur alle 10 s den Mittelwert in einen Datenpunkt schreibt:
const idAC_Leistung = 'modbus.0.holdingRegisters.40083_I_AC_Leistung'; const idSF = 'modbus.0.holdingRegisters.40084_I_AC_Leistung_SF'; // Exponent const idPV_Leistung = '0_userdata.0.Solar.Wechselrichter.PVLeistung'; createState(idPV_Leistung, 0, { name: 'Aktuelle Leistung der Anlage in W', unit: 'W', min: 0, type: 'number', read: true, write: false, role: 'value.energy' }); const factor = Math.pow(10, getState(idSF).val); var arr = []; on({id: idAC_Leistung}, function(dp) { arr.push(dp.state.val); }); schedule('*/10 * * * * *', function() { if(arr.length) { let sum = 0; for(let i = 0; i < arr.length; i++) { sum += arr[i]; } setState(idPV_Leistung, Math.round(10 * factor * sum / arr.length) / 10, true); arr.length = 0; } });
-
@paul53 Dake für den Vorschlag.
Gibt es nicht die Möglichkeit, bei influx "einfach" den Wert nur alle 10 Sekunden schreiben zu lassen bzw. bei Änderung von meh als 10W bspw?
Danke!