Files
cariflex/scripts/init_flexmeasures_db.py
Eric F ffc08d0629 Initial Cariflex project
- 40 FlexMeasures assets (10 PV, 10 Bat, 10 Chg, 10 EV)
- Geolocated on Martinique
- Documentation: architecture, deployment, concepts
- Standards: Flex Ready, S2, OpenADR, EPEX SPOT
- R&D tools: HAMLET, OPLEM, lemlab
- Map patch: Mapbox -> OpenStreetMap
2026-06-07 22:19:29 -04:00

80 lines
3.7 KiB
Python

#!/usr/bin/env python3
"""Cariflex - Initialise les actifs FlexMeasures dans la base de donnees."""
import subprocess
def run_sql(query):
result = subprocess.run([
"docker", "exec", "flexmeasures-db", "psql", "-U", "flexmeasures", "-d", "flexmeasures",
"-t", "-c", query
], capture_output=True, text=True)
return result.stdout.strip()
# 1. Create asset types
print("=== Creating asset types ===")
asset_types = [
("Panneau Photovoltaique", "Installation de production d'energie solaire"),
("Batterie de Stockage", "Systeme de stockage d'energie par batterie"),
("Borne de Recharge VE", "Station de recharge pour vehicules electriques"),
("Vehicule Electrique", "Vehicule electrique avec capacite vehicle-to-grid"),
]
for name, desc in asset_types:
run_sql("INSERT INTO generic_asset_type (name, description) SELECT '{}', '{}' WHERE NOT EXISTS (SELECT 1 FROM generic_asset_type WHERE name = '{}');".format(name, desc, name))
types = run_sql("SELECT id, name FROM generic_asset_type;")
print(types)
# Get type IDs from DB
type_map = {}
for line in types.split('\n'):
parts = [p.strip() for p in line.split('|')]
if len(parts) == 2:
type_map[parts[1]] = int(parts[0])
pv_type = type_map.get('Panneau Photovoltaique', 1)
bat_type = type_map.get('Batterie de Stockage', 2)
chg_type = type_map.get('Borne de Recharge VE', 3)
ev_type = type_map.get('Vehicule Electrique', 4)
print("Type IDs: PV={}, Bat={}, Charger={}, EV={}".format(pv_type, bat_type, chg_type, ev_type))
# 2. Create 10 assets of each type
print("\n=== Creating assets ===")
base_lat = 14.6091
base_lon = -61.2155
configs = [
('PV', pv_type, 'kW', 'capacity', 5),
('Bat', bat_type, 'kWh', 'capacity', 100),
('Chg', chg_type, 'kW', 'max_power', 22),
('EV', ev_type, 'kWh', 'capacity', 75),
]
for prefix, type_id, unit, attr_key, attr_val in configs:
for i in range(1, 11):
name = "{}_{:02d}".format(prefix, i)
lat = base_lat + (i * 0.01)
lon = base_lon + (i * 0.01)
sensor = "{}_{:02d}_power".format(prefix.lower(), i)
# Create asset
run_sql("""INSERT INTO generic_asset (name, latitude, longitude, generic_asset_type_id, account_id, attributes, flex_context, flex_model, sensors_to_show, sensors_to_show_as_kpis)
SELECT '{}', {}, {}, {}, 1, '{{"{}": {}}}'::jsonb, '{{}}'::jsonb, '{{}}'::jsonb, '[]'::jsonb, '[]'::jsonb
WHERE NOT EXISTS (SELECT 1 FROM generic_asset WHERE name = '{}');""".format(name, lat, lon, type_id, attr_key, attr_val, name))
# Get asset ID
aid = run_sql("SELECT id FROM generic_asset WHERE name = '{}';".format(name))
if aid:
# Create sensor
run_sql("""INSERT INTO sensor (name, unit, timezone, event_resolution, knowledge_horizon_fnc, knowledge_horizon_par, generic_asset_id, attributes)
SELECT '{}', '{}', 'America/Martinique', '00:05:00', 'x_days_ago_at_y_oclock', '{{"x": 1, "y": 13, "z": "America/Martinique"}}'::json, {}, '{{}}'::jsonb
WHERE NOT EXISTS (SELECT 1 FROM sensor WHERE name = '{}');""".format(sensor, unit, aid, sensor))
print(" {} (ID:{}) -> sensor {}".format(name, aid, sensor))
else:
print(" {} already exists".format(name))
print("\n=== Summary ===")
for prefix, type_id, unit, _, _ in configs:
n_assets = run_sql("SELECT COUNT(*) FROM generic_asset WHERE generic_asset_type_id = {};".format(type_id))
n_sensors = run_sql("SELECT COUNT(*) FROM sensor WHERE generic_asset_id IN (SELECT id FROM generic_asset WHERE generic_asset_type_id = {});".format(type_id))
print(" {}: {} assets, {} sensors".format(prefix, n_assets, n_sensors))