Files
EOS/nodered_simulation_data_interval_ready.json

23 lines
6.5 KiB
JSON

[
{
"id": "2f258cb68a2ff471",
"type": "function",
"z": "e8cb99e55189e3aa",
"name": "simulation_data_interval_ready",
"func": "// JSON-Daten aus dem Payload (für das Beispiel, ersetzen mit deinen Daten)\nlet data = msg.payload.result;\n\n// Ermittlung der maximalen Länge der Arrays\nlet maxLength = Math.max(data.Netzeinspeisung_Wh_pro_Stunde.length, data.Netzbezug_Wh_pro_Stunde.length, data.akku_soc_pro_stunde.length, data.Last_Wh_pro_Stunde.length);\n\n// Startzeitpunkt ab der jetzigen Stunde in der lokalen Zeitzone\nconst intervalSeconds = Number(\n msg.optimization_interval_seconds ??\n flow.get(\"eos_optimization_interval_seconds\") ??\n 900\n);\nif (![900, 3600].includes(intervalSeconds)) {\n node.error(`Unsupported EOS interval: ${intervalSeconds} seconds`, msg);\n return null;\n}\nconst intervalMinutes = intervalSeconds / 60;\nconst intervalMs = intervalSeconds * 1000;\n\n// Align to the same local slot as EOS (:00/:15/:30/:45 at 900 seconds).\nlet now = msg.eos_start_datetime ? new Date(msg.eos_start_datetime) : new Date();\nif (Number.isNaN(now.getTime())) {\n node.error(\"Invalid msg.eos_start_datetime\", msg);\n return null;\n}\nnow.setMinutes(Math.floor(now.getMinutes() / intervalMinutes) * intervalMinutes, 0, 0);\n\n// Initialisierung des SQL-Statements\nlet sqlStatements = \"\";\n\n// Schleife über die Anzahl der Stunden\nfor (let i = 0; i < maxLength; i++) {\n // Berechnung des Zeitstempels für jede Stunde in der lokalen Zeit\n let localTimestamp = new Date(now.getTime() + i * intervalMs);\n //let todayMidnight = new Date(now.getFullYear(), now.getMonth(), now.getDate()); // 0:00 Uhr heute\n\n // Optional: Falls du i nutzen möchtest, um Stunden hinzuzufügen:\n //let localTimestamp = new Date(todayMidnight.getTime() + i * intervalMs);\n\n\n // Manuelle Formatierung in das MariaDB-Format YYYY-MM-DD HH:MM:SS\n let year = localTimestamp.getFullYear();\n let month = ('0' + (localTimestamp.getMonth() + 1)).slice(-2);\n let day = ('0' + localTimestamp.getDate()).slice(-2);\n let hours = ('0' + localTimestamp.getHours()).slice(-2);\n let minutes = ('0' + localTimestamp.getMinutes()).slice(-2);\n let seconds = ('0' + localTimestamp.getSeconds()).slice(-2);\n\n // Formatierung für MariaDB\n let timestamp = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n // Prüfen, ob es für diese Stunde überhaupt Daten gibt\n let hasData = false;\n let hourSqlStatements = \"\";\n //node.warn(String(i) + \" - \"+String(data.Last_Wh_pro_Stunde[i]) + \" \"+ String(data.Netzeinspeisung_Wh_pro_Stunde[i]) + \" \"+ String(data.Netzbezug_Wh_pro_Stunde[i]))\n // Einfügen der Netzeinspeisung, wenn der Wert nicht null oder undefined ist\n if (i < data.Netzeinspeisung_Wh_pro_Stunde.length && data.Netzeinspeisung_Wh_pro_Stunde[i] != null ) {\n hourSqlStatements += `INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('Netzeinspeisung_Wh_pro_Stunde', ROUND(${data.Netzeinspeisung_Wh_pro_Stunde[i]},8), '${timestamp}');\\n`;\n hasData = true;\n }\n if (i < data.Electricity_price.length && data.Electricity_price[i] != null) {\n hourSqlStatements += `INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('Electricity_price', ROUND(${data.Electricity_price[i]},8), '${timestamp}');\\n`;\n hasData = true;\n }\n\n // Einfügen des Netzbezugs, wenn der Wert nicht null oder undefined ist\n if (i < data.Netzbezug_Wh_pro_Stunde.length && data.Netzbezug_Wh_pro_Stunde[i] != null ) {\n hourSqlStatements += `INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('Netzbezug_Wh_pro_Stunde', ROUND(${data.Netzbezug_Wh_pro_Stunde[i]},8), '${timestamp}');\\n`;\n hasData = true;\n }\n\n // Einfügen des Akkustands (SoC), wenn der Wert nicht null oder undefined ist nicht bei hasData berücksichtigen!\n if (i < data.akku_soc_pro_stunde.length && data.akku_soc_pro_stunde[i] != null ) {\n hourSqlStatements += `INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('akku_soc_pro_stunde', ROUND(${data.akku_soc_pro_stunde[i]},8), '${timestamp}');\\n`;\n //hasData = true;\n }\n\n // Einfügen der Last, wenn der Wert nicht null oder undefined ist\n if (i < data.Last_Wh_pro_Stunde.length && data.Last_Wh_pro_Stunde[i] != null ) {\n hourSqlStatements += `INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('last_pro_stunde', ROUND(${data.Last_Wh_pro_Stunde[i]},8), '${timestamp}');\\n`;\n //node.warn(`INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('last_pro_stunde', ROUND(${data.Last_Wh_pro_Stunde[i]},8), '${timestamp}');`);\n hasData = true;\n }\n \n // --- Neu: DV-relevante Werte ---\n if (i < data.Einnahmen_Euro_pro_Stunde.length && data.Einnahmen_Euro_pro_Stunde[i] != null) {\n hourSqlStatements += `INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('Einnahmen_Euro_pro_Stunde', ROUND(${data.Einnahmen_Euro_pro_Stunde[i]},8), '${timestamp}');\\n`;\n }\n if (i < data.Kosten_Euro_pro_Stunde.length && data.Kosten_Euro_pro_Stunde[i] != null) {\n hourSqlStatements += `INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('Kosten_Euro_pro_Stunde', ROUND(${data.Kosten_Euro_pro_Stunde[i]},8), '${timestamp}');\\n`;\n }\n if (i < data.Verluste_Pro_Stunde.length && data.Verluste_Pro_Stunde[i] != null) {\n hourSqlStatements += `INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('Verluste_Pro_Stunde', ROUND(${data.Verluste_Pro_Stunde[i]},8), '${timestamp}');\\n`;\n }\n if (i < data.Feed_in_tariff.length && data.Feed_in_tariff[i] != null) {\n hourSqlStatements += `INSERT INTO eos_simulation_data (topic, data, timestamp) VALUES ('Feed_in_tariff', ROUND(${data.Feed_in_tariff[i]},10), '${timestamp}');\\n`;\n }\n\n // Nur wenn für diese Stunde Daten vorhanden sind, die Anweisungen generieren\n if (hasData) {\n \n sqlStatements += `DELETE FROM eos_simulation_data WHERE timestamp = '${timestamp}';\\n`;\n sqlStatements += hourSqlStatements;\n \n }\n}\n\n// Das generierte SQL-Statement in msg.topic einfügen\nmsg.topic = sqlStatements;\nmsg.payload = sqlStatements;\nreturn msg;\n",
"outputs": 1,
"timeout": 0,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1100,
"y": 220,
"wires": [
[
"b67e8f2dfd038358"
]
]
}
]