NEWS
Result-Funktion von InfluxDB-Adapter richtig nutzen
-
Hallo,
ich habe mir folgendes Skript erstellt um meine Stromerzeugung der PV aus den aktuellen Ertragswerten alles 30sek zu speichern und daraus den stündlichen Ertrag in kwh zu speichern. Hier das skript... 3mal weil ich die 3 Himmelsrichtungen extra ausgewertet haben möchte.
//Die Ost-Süd-West- Leistungen von der letzen Stunde zusammenrechnen und abspeichern schedule("*/60 * * * *", function () { //alle 60Min das Skript starten // die Werte von Osten abfragen und abspeichern. var end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); var Stundenertrag = 0; var Time_to_next_value_in_ms = 0; var x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-OST', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_OST: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-OST_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); // die Werte von Süden abfragen und abspeichern. var end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); var Stundenertrag = 0; var Time_to_next_value_in_ms = 0; var x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-SÜD', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_SUED: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-SÜD_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); // die Werte von WEST abfragen und abspeichern. var end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); var Stundenertrag = 0; var Time_to_next_value_in_ms = 0; var x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-WEST', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_WEST: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-WEST_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); });code_text
Grunssätzlich funktioniert das Ganze, aber mir ist aufgefallen, dass die Werte von WEST und SÜD immer zu hoch sind. Bei der Prüfung warum das so ist, habe ich mir ausgeben lassen wie viele Punkte in den Schleifen jeweils addiert werden. Das sieht im Log so aus:
2023-05-09 13:00:00.224 - info: javascript.0 (1414) script.js.PV-Anlage.MTBG38_OSW-Leistung_stündlich_berechnen: Stundenertrag_WEST: 3837gelesene Einträge: 180 2023-05-09 13:00:00.246 - info: javascript.0 (1414) script.js.PV-Anlage.MTBG38_OSW-Leistung_stündlich_berechnen: Stundenertrag_SUED: 9968gelesene Einträge: 319 2023-05-09 13:00:00.256 - info: javascript.0 (1414) script.js.PV-Anlage.MTBG38_OSW-Leistung_stündlich_berechnen: Stundenertrag_OST: 14840gelesene Einträge: 499
Wie man sieht werden die Durchläufe immer höher, und ich habe die Vermutung, dass sich das "Objekt" result nicht zwischen den Aufrufen löscht, sondern dass die Einträge von SÜD bzw WEST dann hinten drangeschrieben werden, und somit das Ergebnis bei WEST und SÜD immer zu hoch ist.
Gibt es eine Möglichkeit das "Objekt" result von getHistory zwischen den Aufrufen zu löschen, bzw rückzusetzen, damit beim nächsten Aufruf nur die Daten von WEST bzw SÜD berechnet werden?
Ich hoffe ich habs soweit verständlich beschrieben und freue mich auf euer Input.
vG Etze
PS: Ich bin leider kein JS Profi und habe mir den Code so zusammengebastelt, bitte als nicht konforme Skriptdetails zu entschuldigen. Bin für alle Verbesserungen offen...:-)
-
@etzeste13 Mich wunderte, warum du keine Fehlermeldung bekommen hast. Ändere mal die
var
->let
, dann bekommst du die eventuell auch.
Man darf die Variablenend
,Stundenertrag
,Time_to_next_value_in_ms
,x_s
nicht öfter definieren.
Du hast sie 3x definiert.
Du kannst es so versuchenschedule("*/60 * * * *", function () { //alle 60Min das Skript starten // die Werte von Osten abfragen und abspeichern. let end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); let Stundenertrag = 0; let Time_to_next_value_in_ms = 0; let x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-OST', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_OST: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-OST_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); // die Werte von Süden abfragen und abspeichern. end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); Stundenertrag = 0; Time_to_next_value_in_ms = 0; x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-SÜD', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_SUED: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-SÜD_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); // die Werte von WEST abfragen und abspeichern. end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); Stundenertrag = 0; Time_to_next_value_in_ms = 0; x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-WEST', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_WEST: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-WEST_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); });
-
VAR erlaubt die Redeclaration von Variablen. Bei bleibt der Wert erhalten.
https://www.w3schools.com/js/js_variables.asp
Re-Declaring JavaScript Variables If you re-declare a JavaScript variable declared with var, it will not lose its value. The variable carName will still have the value "Volvo" after the execution of these statements: Example var carName = "Volvo"; var carName;
Man wäre also gut beraten var zu vergessen und die aktuellen Declaartionen let und const zu verwenden.
-
@mcm57
@MCUbesten Dank für die Inputs. Ich habe das Script entsprechend geändert und werden morgen früh sobald die Sonne wieder scheint berichten.
vG Etze
-
@mcm57
@McUlesHallo, also ich habe das Scrict entsprechend geändert und getestet, aber es gibt noch immer das gleiche verhalten, dass es scheint das sich die durchläufe bzw Ergebnisse aus den 3 Abfragen aus der InfluxDB aufsummieren...
hier der eintrag aus dem LOG.... da kann man sehr gut erkenne, dass sich OST und SÜD auf das WEST Ergebniss aufaddieren.
2023-05-10 16:00:00.223 - info: javascript.0 (1416) script.js.PV-Anlage.MTBG38_OSW-Leistung_stündlich_berechnen: Stundenertrag_SUED: 2408, gelesene Einträge: 133 2023-05-10 16:00:00.245 - info: javascript.0 (1416) script.js.PV-Anlage.MTBG38_OSW-Leistung_stündlich_berechnen: Stundenertrag_OST: 3982, gelesene Einträge: 310 2023-05-10 16:00:00.256 - info: javascript.0 (1416) script.js.PV-Anlage.MTBG38_OSW-Leistung_stündlich_berechnen: Stundenertrag_WEST: 6699, gelesene Einträge: 444
habt Ihr hier noch eine Idee, wie ich das "Objekt" result reseten kann vor der nächsten Abfrage?
-
@etzeste13 Wie hast du das Script verändert, zeig mal.
-
Hi, sry für die späte Antwort, ich kam leider nicht eher dazu hier weiterzumachen...
Hier das geänderte Script.//Die Ost-Süd-West- Leistungen von der letzen Stunde zusammenrechnen und abspeichern schedule("*/60 * * * *", function () { // die Werte von Osten abfragen und abspeichern. let end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); let Stundenertrag = 0; let Time_to_next_value_in_ms = 0; let x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-OST', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_OST: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-OST_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); // die Werte von Süden abfragen und abspeichern. end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); Stundenertrag = 0; Time_to_next_value_in_ms = 0; x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-SÜD', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_SUED: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-SÜD_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); // die Werte von WEST abfragen und abspeichern. end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); Stundenertrag = 0; Time_to_next_value_in_ms = 0; x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-WEST', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_WEST: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-WEST_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); });
-
@etzeste13 Ich würde die sendTo ineinander verschachteln.
/Die Ost-Süd-West- Leistungen von der letzen Stunde zusammenrechnen und abspeichern schedule("*/60 * * * *", function () { // die Werte von Osten abfragen und abspeichern. let end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); let Stundenertrag = 0; let Time_to_next_value_in_ms = 0; let x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-OST', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_OST: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-OST_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben // die Werte von Süden abfragen und abspeichern. end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); Stundenertrag = 0; Time_to_next_value_in_ms = 0; x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-SÜD', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_SUED: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-SÜD_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben // die Werte von WEST abfragen und abspeichern. end = new Date().getTime(); // definiert aktuellen Zeitpunkt. //console.log(end); Stundenertrag = 0; Time_to_next_value_in_ms = 0; x_s = 0; sendTo('influxdb.0', 'getHistory', { // ist der Aufruf der Datenbank-Fuktion get History vom Influx.DB Adapter 0 id: '0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-WEST', // Datenpunkt der ausgelesen wird options: { // die optionen anhand deren ausgelesen werden soll start: end - 3600000, // Startpunkt ist aktuelle Zeitpunkt - 1Stunde in ms end: end, // auslesen bis jetzt in ms count: 180, //bis zu 180 Werte auslesen, da generell alle 30sek geschrieben wird aggregate: 'none' // or 'none' to get raw values // aggregate: none definiert die eigentlichen Werte ausgegeben werden sollen } }, function (result) { for (var i = 0; i < result.result.length; i++) { //console.log(result.result[i].ts) //timestamp des Ergebnisses der Nr[i] ausgeben if (i == 0) { // im ersten Durchlauf muss mann die 30sec manuell angeben, da sonst bei der berechnung [i-1] ein Fehler auftritt Time_to_next_value_in_ms = 30000; } else { Time_to_next_value_in_ms = result.result[i].ts - result.result[i-1].ts; } //console.log(Time_to_next_value_in_ms); Stundenertrag = Stundenertrag + result.result[i].val / (3600000 / Time_to_next_value_in_ms); //die 3.600.000ms / die MS zum Vorgängerwert addiert, ergeben die W/h x_s = x_s + 1; // x_s nur zur Kontrolle, damit ich sehe wie viele Werte addiert wurden } Stundenertrag = Math.round(Stundenertrag); //Ergebnis auf ganze Zahl runden console.log('Stundenertrag_WEST: ' + Stundenertrag + ', gelesene Einträge: ' + x_s); // PV-Ertrag der letzten Stunde + die Anzahl der Datenpunkte ins LOG schreiben setState("0_userdata.0.PV_Anlagen.MTBG-38_1.Leistung-WEST_letzte_Stunde", Stundenertrag, true); //PV-Ertrag der letzten Stunde in Datenpunkt schreiben }); }); }); });
-
@mcu
wie soll ich das machen? ich muss ja die einzelnen Datenpunkte einzeln aus der influxDB holen... oder nicht ? -
@etzeste13 Ich habe es doch schon gemacht.
Damit wird der nächste sendTo-Befehl erst ausgelöst, wenn die Daten vom 1. da sind, usw.. -
@MCU bitte entschuldige die vlt. blöde Frage, aber ich finde den Unterschied im Code einfach nicht.... kannst du mir kurz schreiben was du geändert hast.... Scheint als ob ich den Wald vor lauter Bäumen nicht finde...
-
@etzeste13
Also es sind 3 sendToVorher:
sendTo{ } sendTo{ } sendTo{ }
Nachher:
sendTo{ sendTo{ sendTo{ } } }
-
@mcu
Alles klar, jetzt hab ichs... danke dir. Ich werde es morgen testen, wenn wieder die Sonne scheint.... bzw. es hell wird, von Sonne aktuell keine Spur... -
vielen Dank für deinen Input... jetzt funktioniert es wie es gedacht war.
Kannst du mir vielleicht noch den Grund erklären warum das jetzt funktioniert?vG Etze
-
@etzeste13
Vorher
wurden die sendTo Funktionen direkt nacheinander ausgelöst. Es wurde nicht darauf gewartet, bis die Daten verarbeitet wurden.Nachher
wurden die Funktionen immer erst dann aufgerufen, wenn die Daten aus der vorherigen Funktion, auch wirklich verarbeitet gewesen sind.