From 1272cdfc8137b80063df2cdd63164b5e44dd85a3 Mon Sep 17 00:00:00 2001 From: Alexis Fourmaux Date: Wed, 13 May 2026 15:24:43 +0200 Subject: [PATCH] feat: add script to simulate gas consumption and insert data in db --- server/backend/insert_dummy_data.py | 97 +++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 server/backend/insert_dummy_data.py diff --git a/server/backend/insert_dummy_data.py b/server/backend/insert_dummy_data.py new file mode 100644 index 0000000..8bdd516 --- /dev/null +++ b/server/backend/insert_dummy_data.py @@ -0,0 +1,97 @@ +""" +Pour ajouter les données et exécuter le script, créer le conteneur : +docker run --rm --network server_database simugaz/backend:latest insert_data.py +""" + +from datetime import datetime, timedelta +from random import random +from typing import NamedTuple +from zoneinfo import ZoneInfo + +import psycopg2 + +INITIAL_CONSUMPTION = 1854.32 +AVERAGE_DAILY_CONSUMPTION = 2.66 +PULSE_RESOLUTION = 0.010 +DB_URI = "postgresql://simugaz:simugaz@db/simugaz" + +GRDF_MONTHLY_COEFF = [ + 2.21, # Janvier + 2.05, # Février + 1.62, # Mars + 0.97, # Avril + 0.55, # Mai + 0.22, # Juin + 0.15, # Juillet + 0.17, # Août + 0.38, # Septembre + 0.85, # Octobre + 1.52, # Novembre + 2.11, # Décembre +] + + +class PulseReading(NamedTuple): + device_id: str + date: datetime + value: int + + +def simulate_gas_pulses( + device_id: str, + initial_consumption: float, + start_date: datetime, + end_date: datetime, + granularity_seconds: int = 3600, +) -> list[PulseReading]: + results: list[PulseReading] = [] + consumption_m3 = initial_consumption + current_date = start_date + + while current_date < end_date: + daily_base = ( + AVERAGE_DAILY_CONSUMPTION * GRDF_MONTHLY_COEFF[current_date.month - 1] + ) + daily_variation = 1.0 + 0.30 * (random() - 0.5) + + increment_m3 = daily_base * granularity_seconds / 86400.0 * daily_variation + consumption_m3 += increment_m3 + + pulses = int(consumption_m3 / PULSE_RESOLUTION) + new_reading = PulseReading(device_id=device_id, date=current_date, value=pulses) + results.append(new_reading) + + current_date += timedelta(seconds=granularity_seconds) + + return results + + +def write_to_db(points: list[PulseReading]) -> None: + with psycopg2.connect(DB_URI) as conn: + with conn.cursor() as cur: + cur.executemany( + """ + INSERT INTO reading (device_id, date, pulses) + VALUES (%s, %s, %s) + ON CONFLICT DO NOTHING + """, + points, + ) + conn.commit() + print(f"[DB] {len(points)} lignes insérées") + + +if __name__ == "__main__": + TZ = ZoneInfo("Europe/Paris") + start = datetime(2025, 1, 1, 0, 0, 0, tzinfo=TZ) + end = datetime.now(tz=TZ) + + points = simulate_gas_pulses( + device_id="60124673-1999-414d-a3c5-723bd6d82a13", + initial_consumption=INITIAL_CONSUMPTION, + start_date=start, + end_date=end, + granularity_seconds=3600, + ) + + write_to_db(points)