267 lines
14 KiB
Bash
267 lines
14 KiB
Bash
#!/bin/bash
|
|
# Cariflex - FlexMeasures EMS Configuration Script
|
|
# This script configures FlexMeasures as a full EMS with:
|
|
# - Forecasting (PV, Load, Prices)
|
|
# - Scheduling (Batteries, EVs)
|
|
# - Ingestion (Sensors, Assets, Beliefs)
|
|
|
|
set -e
|
|
|
|
FM_EMAIL="admin@digitribe.fr"
|
|
FM_PASSWORD="Digi...n"
|
|
FM_HOST="https://cariflex.digitribe.fr"
|
|
|
|
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
|
echo "║ CARIFLEX - FlexMeasures EMS Configuration ║"
|
|
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 1. INITIAL STRUCTURE
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
echo " 1. INITIAL STRUCTURE"
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
|
|
echo " → Creating initial structure (account, roles, data sources)..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 60 .venv/bin/flexmeasures add initial-structure 2>&1 | tail -5
|
|
" 2>&1
|
|
|
|
echo ""
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 2. ASSETS AND SENSORS (if not already created)
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
echo " 2. ASSETS AND SENSORS"
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
|
|
# Check if assets already exist
|
|
ASSET_COUNT=$(docker exec flexmeasures-db psql -U flexmeasures -d flexmeasures -t -c "
|
|
SELECT COUNT(*) FROM generic_asset;
|
|
" 2>/dev/null | xargs)
|
|
|
|
echo " → Current asset count: $ASSET_COUNT"
|
|
|
|
if [ "$ASSET_COUNT" -lt 40 ]; then
|
|
echo " → Creating assets and sensors..."
|
|
|
|
# Create PV assets (10)
|
|
for i in $(seq 1 10); do
|
|
echo " Creating PV_0$i..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 30 .venv/bin/flexmeasures add asset \
|
|
--name 'PV_0$i' \
|
|
--type 'solar' \
|
|
--capacity 5 \
|
|
--unit 'kW' \
|
|
--latitude 14.6$(printf '%02d' $((i * 10))) \
|
|
--longitude -61.2$(printf '%02d' $((i * 5))) \
|
|
2>&1 | tail -3
|
|
" 2>/dev/null
|
|
done
|
|
|
|
# Create Battery assets (10)
|
|
for i in $(seq 1 10); do
|
|
echo " Creating Bat_0$i..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 30 .venv/bin/flexmeasures add asset \
|
|
--name 'Bat_0$i' \
|
|
--type 'battery' \
|
|
--capacity 100 \
|
|
--unit 'kWh' \
|
|
--latitude 14.5$(printf '%02d' $((i * 10))) \
|
|
--longitude -61.1$(printf '%02d' $((i * 5))) \
|
|
2>&1 | tail -3
|
|
" 2>/dev/null
|
|
done
|
|
|
|
# Create EV Charger assets (10)
|
|
for i in $(seq 1 10); do
|
|
echo " Creating Chg_0$i..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 30 .venv/bin/flexmeasures add asset \
|
|
--name 'Chg_0$i' \
|
|
--type 'ev_charger' \
|
|
--capacity 22 \
|
|
--unit 'kW' \
|
|
--latitude 14.6$(printf '%02d' $((i * 8))) \
|
|
--longitude -61.0$(printf '%02d' $((i * 3))) \
|
|
2>&1 | tail -3
|
|
" 2>/dev/null
|
|
done
|
|
|
|
# Create EV assets (10)
|
|
for i in $(seq 1 10); do
|
|
echo " Creating EV_0$i..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 30 .venv/bin/flexmeasures add asset \
|
|
--name 'EV_0$i' \
|
|
--type 'ev' \
|
|
--capacity 75 \
|
|
--unit 'kWh' \
|
|
--latitude 14.5$(printf '%02d' $((i * 7))) \
|
|
--longitude -61.2$(printf '%02d' $((i * 4))) \
|
|
2>&1 | tail -3
|
|
" 2>/dev/null
|
|
done
|
|
else
|
|
echo " → Assets already exist, skipping..."
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 3. FORECASTING
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
echo " 3. FORECASTING"
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
|
|
echo " → Generating forecasts for PV sensors (41-50)..."
|
|
for sensor in $(seq 41 50); do
|
|
echo " Forecasting sensor $sensor..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 120 .venv/bin/flexmeasures add forecasts \
|
|
--sensor $sensor \
|
|
--to-date \$(date -u -d '+24 hours' +'%Y-%m-%dT%H:%M:%S+00:00') \
|
|
2>&1 | grep -E 'Successfully|Error|SAVED' | head -1
|
|
" 2>/dev/null
|
|
done
|
|
|
|
echo " → Generating forecasts for Battery sensors (51-60)..."
|
|
for sensor in $(seq 51 60); do
|
|
echo " Forecasting sensor $sensor..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 120 .venv/bin/flexmeasures add forecasts \
|
|
--sensor $sensor \
|
|
--to-date \$(date -u -d '+24 hours' +'%Y-%m-%dT%H:%M:%S+00:00') \
|
|
2>&1 | grep -E 'Successfully|Error|SAVED' | head -1
|
|
" 2>/dev/null
|
|
done
|
|
|
|
echo " → Generating forecasts for EV Charger sensors (61-70)..."
|
|
for sensor in $(seq 61 70); do
|
|
echo " Forecasting sensor $sensor..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 120 .venv/bin/flexmeasures add forecasts \
|
|
--sensor $sensor \
|
|
--to-date \$(date -u -d '+24 hours' +'%Y-%m-%dT%H:%M:%S+00:00') \
|
|
2>&1 | grep -E 'Successfully|Error|SAVED' | head -1
|
|
" 2>/dev/null
|
|
done
|
|
|
|
echo " → Generating forecasts for EV sensors (71-80)..."
|
|
for sensor in $(seq 71 80); do
|
|
echo " Forecasting sensor $sensor..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 120 .venv/bin/flexmeasures add forecasts \
|
|
--sensor $sensor \
|
|
--to-date \$(date -u -d '+24 hours' +'%Y-%m-%dT%H:%M:%S+00:00') \
|
|
2>&1 | grep -E 'Successfully|Error|SAVED' | head -1
|
|
" 2>/dev/null
|
|
done
|
|
|
|
echo ""
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 4. SCHEDULING
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
echo " 4. SCHEDULING"
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
|
|
echo " → Creating schedules for Battery sensors (51-60)..."
|
|
for sensor in $(seq 51 60); do
|
|
echo " Scheduling sensor $sensor..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 60 .venv/bin/flexmeasures add schedule \
|
|
--sensor $sensor \
|
|
--start \$(date -u +'%Y-%m-%dT%H:%M:%S+00:00') \
|
|
--duration PT24H \
|
|
--resolution PT5M \
|
|
--soc-at-start 0.5 \
|
|
2>&1 | grep -E 'Successfully|Error|schedule' | head -1
|
|
" 2>/dev/null
|
|
done
|
|
|
|
echo " → Creating schedules for EV sensors (71-80)..."
|
|
for sensor in $(seq 71 80); do
|
|
echo " Scheduling sensor $sensor..."
|
|
docker exec flexmeasures-server bash -c "
|
|
cd /app && timeout 60 .venv/bin/flexmeasures add schedule \
|
|
--sensor $sensor \
|
|
--start \$(date -u +'%Y-%m-%dT%H:%M:%S+00:00') \
|
|
--duration PT24H \
|
|
--resolution PT5M \
|
|
--soc-at-start 0.4 \
|
|
2>&1 | grep -E 'Successfully|Error|schedule' | head -1
|
|
" 2>/dev/null
|
|
done
|
|
|
|
echo ""
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 5. INGESTION STATUS
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
echo " 5. INGESTION STATUS"
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
|
|
echo " → Checking sensor data status..."
|
|
docker exec flexmeasures-db psql -U flexmeasures -d flexmeasures -c "
|
|
SELECT
|
|
s.name as sensor,
|
|
s.unit,
|
|
COUNT(t.id) as data_points,
|
|
MAX(t.event_start) as latest_data
|
|
FROM sensor s
|
|
LEFT JOIN timed_belief t ON t.sensor_id = s.id
|
|
WHERE s.id BETWEEN 41 AND 80
|
|
GROUP BY s.name, s.unit
|
|
ORDER BY s.id;
|
|
" 2>/dev/null
|
|
|
|
echo ""
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# 6. SUMMARY
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
echo " 6. EMS CONFIGURATION SUMMARY"
|
|
echo "═══════════════════════════════════════════════════════════════════════════════"
|
|
|
|
echo ""
|
|
echo " Assets:"
|
|
docker exec flexmeasures-db psql -U flexmeasures -d flexmeasures -c "
|
|
SELECT gt.name as type, COUNT(*) as count
|
|
FROM generic_asset g
|
|
JOIN generic_asset_type gt ON g.generic_asset_type_id = gt.id
|
|
GROUP BY gt.name;
|
|
" 2>/dev/null
|
|
|
|
echo ""
|
|
echo " Sensors:"
|
|
docker exec flexmeasures-db psql -U flexmeasures -d flexmeasures -c "
|
|
SELECT COUNT(*) as total_sensors FROM sensor;
|
|
" 2>/dev/null
|
|
|
|
echo ""
|
|
echo " Data Points (Beliefs):"
|
|
docker exec flexmeasures-db psql -U flexmeasures -d flexmeasures -c "
|
|
SELECT COUNT(*) as total_beliefs FROM timed_belief;
|
|
" 2>/dev/null
|
|
|
|
echo ""
|
|
echo " Forecasts:"
|
|
docker exec flexmeasures-db psql -U flexmeasures -d flexmeasures -c "
|
|
SELECT COUNT(*) as forecasts FROM timed_belief
|
|
WHERE source_id IN (SELECT id FROM data_source WHERE name LIKE '%forecast%');
|
|
" 2>/dev/null
|
|
|
|
echo ""
|
|
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
|
echo "║ EMS Configuration Complete! ║"
|
|
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|