- 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
102 lines
3.7 KiB
Python
102 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Relocate all assets to known land locations on Martinique."""
|
|
import subprocess
|
|
|
|
def run_sql(query):
|
|
subprocess.run([
|
|
"docker", "exec", "flexmeasures-db", "psql", "-U", "flexmeasures", "-d", "flexmeasures",
|
|
"-c", query
|
|
], capture_output=True, text=True)
|
|
|
|
# Real locations on Martinique (verified land positions)
|
|
# Format: (lat, lon, name)
|
|
LOCATIONS = [
|
|
# Fort-de-France area (center)
|
|
(14.6091, -61.2155, "Fort-de-France"),
|
|
(14.6150, -61.2080, "Fort-de-France Nord"),
|
|
(14.6050, -61.2200, "Fort-de-France Sud"),
|
|
(14.6200, -61.2000, "Fort-de-France Est"),
|
|
(14.5950, -61.2100, "Fort-de-France Ouest"),
|
|
# Le Lamentin (west, industrial)
|
|
(14.6100, -61.0100, "Le Lamentin"),
|
|
(14.6150, -61.0050, "Aeroport Lamentin"),
|
|
(14.6050, -61.0200, "Lamentin Zone Industrielle"),
|
|
(14.6080, -61.0150, "Lamentin Centre"),
|
|
# Schoelcher (north-west)
|
|
(14.6200, -61.1000, "Schoelcher"),
|
|
(14.6250, -61.0900, "Schoelcher Nord"),
|
|
# Saint-Joseph (south)
|
|
(14.4800, -61.0400, "Saint-Joseph"),
|
|
(14.4900, -61.0350, "Saint-Joseph Nord"),
|
|
(14.4700, -61.0450, "Saint-Joseph Sud"),
|
|
# Le Marin (south-east)
|
|
(14.4700, -60.8700, "Le Marin"),
|
|
(14.4650, -60.8800, "Le Marin Ouest"),
|
|
# Sainte-Anne (south-east coast)
|
|
(14.4400, -60.8500, "Sainte-Anne"),
|
|
(14.4350, -60.8600, "Sainte-Anne Nord"),
|
|
# Le Vauclin (south-east tip)
|
|
(14.5500, -60.8400, "Le Vauclin"),
|
|
(14.5450, -60.8500, "Le Vauclin Nord"),
|
|
# Le Diamant (south-west)
|
|
(14.4800, -61.0200, "Le Diamant"),
|
|
(14.4850, -61.0150, "Le Diamant Nord"),
|
|
# Les Trois-Ilets (south-west)
|
|
(14.5000, -61.0800, "Les Trois-Ilets"),
|
|
(14.4950, -61.0900, "Les Trois-Ilets Est"),
|
|
# Rivière-Salée (south)
|
|
(14.4900, -60.9700, "Riviere-Salee"),
|
|
(14.4850, -60.9650, "Riviere-Salee Nord"),
|
|
# Le François (east coast)
|
|
(14.6600, -60.9000, "Le Francois"),
|
|
(14.6650, -60.8950, "Le Francois Nord"),
|
|
# Sainte-Marie (north-east)
|
|
(14.7800, -60.9800, "Sainte-Marie"),
|
|
(14.7850, -60.9750, "Sainte-Marie Nord"),
|
|
# Le Lorrain (north)
|
|
(14.7200, -60.9300, "Le Lorrain"),
|
|
(14.7250, -60.9250, "Le Lorrain Sud"),
|
|
# Le Robert (east)
|
|
(14.6800, -60.9400, "Le Robert"),
|
|
(14.6850, -60.9350, "Le Robert Nord"),
|
|
# Basse-Pointe (north-west)
|
|
(14.7200, -61.1200, "Basse-Pointe"),
|
|
# Grand'Rivière (north-west tip)
|
|
(14.7500, -61.1500, "Grand-Riviere"),
|
|
# Macouba (north-west)
|
|
(14.7000, -61.1300, "Macouba"),
|
|
# Ajoupa-Bouillon (north)
|
|
(14.7500, -61.1000, "Ajoupa-Bouillon"),
|
|
# Morne-Rouge (north)
|
|
(14.7000, -61.1000, "Morne-Rouge"),
|
|
# L'Ajoupa (north-west)
|
|
(14.7300, -61.1100, "L'Ajoupa"),
|
|
# Bellefontaine (north)
|
|
(14.7300, -61.1500, "Bellefontaine"),
|
|
]
|
|
|
|
# Get all assets
|
|
result = subprocess.run([
|
|
"docker", "exec", "flexmeasures-db", "psql", "-U", "flexmeasures", "-d", "flexmeasures",
|
|
"-t", "-c", """
|
|
SELECT g.id, g.name, gt.name as type_name
|
|
FROM generic_asset g
|
|
JOIN generic_asset_type gt ON g.generic_asset_type_id = gt.id
|
|
ORDER BY gt.id, g.name;
|
|
"""
|
|
], capture_output=True, text=True)
|
|
|
|
assets = []
|
|
for line in result.stdout.strip().split('\n'):
|
|
parts = [p.strip() for p in line.split('|')]
|
|
if len(parts) == 3:
|
|
assets.append((int(parts[0]), parts[1], parts[2]))
|
|
|
|
# Assign locations (spread across types)
|
|
for i, (aid, name, atype) in enumerate(assets):
|
|
lat, lon, loc_name = LOCATIONS[i % len(LOCATIONS)]
|
|
run_sql("UPDATE generic_asset SET latitude = {}, longitude = {} WHERE id = {};".format(lat, lon, aid))
|
|
print(" {} -> {:.4f}, {:.4f} ({})".format(name, lat, lon, loc_name))
|
|
|
|
print("\n✅ All assets relocated to verified land locations on Martinique")
|