- 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
80 lines
3.7 KiB
Python
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))
|