You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.9 KiB
98 lines
2.9 KiB
import os
|
|
import mysql.connector
|
|
from dotenv import load_dotenv
|
|
from datetime import datetime
|
|
|
|
load_dotenv(dotenv_path="../.env")
|
|
|
|
db_config = {
|
|
"host": os.getenv("MYSQL_HOST"),
|
|
"port": int(os.getenv("MYSQL_PORT")),
|
|
"user": os.getenv("MYSQL_USER"),
|
|
"password": os.getenv("MYSQL_PASSWORD"),
|
|
"database": os.getenv("MYSQL_DATABASE"),
|
|
}
|
|
|
|
|
|
def parse_datetime_safe(dt_string):
|
|
try:
|
|
return datetime.fromisoformat(dt_string.replace("Z", "").replace("+00:00", ""))
|
|
except Exception:
|
|
return None
|
|
|
|
|
|
def parse_float_safe(value):
|
|
try:
|
|
return float(value)
|
|
except Exception:
|
|
return None
|
|
|
|
|
|
def init_db():
|
|
"""Creëer ruwe datatabel met unieke forecast_time."""
|
|
conn = mysql.connector.connect(**db_config)
|
|
cursor = conn.cursor()
|
|
cursor.execute("""
|
|
CREATE TABLE IF NOT EXISTS solar_raw_data (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
forecast_time DATETIME NOT NULL UNIQUE,
|
|
valid_to DATETIME,
|
|
capacity FLOAT,
|
|
volume FLOAT,
|
|
percentage FLOAT,
|
|
emission FLOAT,
|
|
emission_factor FLOAT,
|
|
last_update DATETIME
|
|
)
|
|
""")
|
|
conn.commit()
|
|
cursor.close()
|
|
conn.close()
|
|
|
|
|
|
def insert_forecast_records(records):
|
|
"""Voegt ruwe forecast records toe, met veilige parsing en validatie."""
|
|
conn = mysql.connector.connect(**db_config)
|
|
cursor = conn.cursor()
|
|
|
|
# Haal reeds bekende timestamps op
|
|
cursor.execute("SELECT forecast_time FROM solar_raw_data")
|
|
existing_timestamps = set(row[0] for row in cursor.fetchall())
|
|
|
|
new_rows = 0
|
|
for record in records:
|
|
forecast_time = parse_datetime_safe(record.get("validfrom", ""))
|
|
if not forecast_time or forecast_time in existing_timestamps:
|
|
continue
|
|
|
|
try:
|
|
cursor.execute("""
|
|
INSERT INTO solar_raw_data (
|
|
forecast_time,
|
|
valid_to,
|
|
capacity,
|
|
volume,
|
|
percentage,
|
|
emission,
|
|
emission_factor,
|
|
last_update
|
|
) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
|
|
""", (
|
|
forecast_time,
|
|
parse_datetime_safe(record.get("validto")),
|
|
parse_float_safe(record.get("capacity")),
|
|
parse_float_safe(record.get("volume")),
|
|
parse_float_safe(record.get("percentage")),
|
|
parse_float_safe(record.get("emission")),
|
|
parse_float_safe(record.get("emissionfactor")),
|
|
parse_datetime_safe(record.get("lastupdate"))
|
|
))
|
|
new_rows += 1
|
|
except Exception as e:
|
|
print(f"❌ Fout bij record: {e}\nRecord: {record}")
|
|
|
|
conn.commit()
|
|
cursor.close()
|
|
conn.close()
|
|
print(f"✅ {new_rows} nieuwe records opgeslagen.")
|