Infrastructure Domain
The Infrastructure Domain models the physical and logical topology of the electrical network, from energy communities down to individual circuits.
Entity Hierarchy
Entity Relationship Diagram
Core Entities
escos (Energy Service Companies)
Top-level organizational entity managing energy communities.
Key Fields:
id- UUID primary keycode- Unique code (e.g., "WLCE", "HMCE")name- Full name (e.g., "Water Lilies Community Energy")created_at- Registration timestamp
Usage:
-- Get all sites for an ESCO
SELECT s.name, s.location, COUNT(p.id) as property_count
FROM flows.escos e
JOIN flows.sites_new s ON s.esco = e.id
LEFT JOIN flows.properties p ON p.site = s.id
WHERE e.code = 'WLCE'
GROUP BY s.name, s.location;
sites_new
Physical locations containing multiple properties.
Key Fields:
id- UUID primary keyname- Site nameesco- Parent ESCO UUIDlocation- Geographic locationcapacity_kw- Total electrical capacity
Examples:
- Water Lilies Bristol (33 homes)
- Hazelmead Bridport (54 homes)
- Trent Basin Nottingham
properties
Individual units within a site (houses, flats, commercial units).
Key Fields:
id- UUID primary keyplot- Unique plot/unit numbersite- Parent site UUIDaddress- Full postal addresstype- Property type (residential, commercial)created_at- Creation timestamp
Usage:
-- Get property with meter details
SELECT
p.plot,
p.address,
mr.serial as meter_serial,
ms.balance
FROM flows.properties p
JOIN flows.properties_service_head psh ON psh.property = p.id
JOIN flows.service_head_meter shm ON shm.service_head = psh.service_head
JOIN flows.meter_registry mr ON mr.id = shm.meter
JOIN flows.meter_shadows ms ON ms.id = mr.id
WHERE p.plot = 'WL-01';
service_head_registry
Electrical connection points (cutouts) that connect properties to the network.
Key Fields:
id- UUID primary keyname- Unique identifierphase- Phase number (1, 2, or 3)type-customer_ownedornetwork_ownedfeeder- Parent feeder UUIDcreated_at- Installation date
Relationship Rules:
- One service head can supply multiple properties (shared supply)
- One property can have multiple service heads (multiple supplies)
- Service heads connect to meters via service_head_meter
service_head_meter
Junction table linking service heads to meters.
Key Fields:
service_head- Service head UUIDmeter- Meter UUIDcreated_at- Connection date
feeder_registry
Electrical feeders supplying service heads.
Key Fields:
id- UUID primary keyname- Feeder identifiersubstation- Parent substation namerating_amps- Current rating
circuits
Logical grouping of electrical loads by type.
Key Fields:
id- UUID primary keytype- Circuit type enum:power- Standard electrical loadsheat- Heat pumps and heatingsolar- Solar generation
site- Parent site UUIDname- Circuit descriptionrating_amps- Circuit breaker rating
Usage:
-- Get circuit consumption by type for a site
SELECT
c.type,
c.name,
SUM(ci.total_import_kwh) as daily_kwh
FROM flows.circuits c
LEFT JOIN flows.circuit_interval_daily ci ON ci.circuit_id = c.id
WHERE c.site = '{{site_id}}'
AND ci.day = CURRENT_DATE - 1
GROUP BY c.type, c.name
ORDER BY c.type, daily_kwh DESC;
circuit_register
Maps registers to circuits for consumption aggregation.
Key Fields:
circuit- Circuit UUIDregister- Register UUID
Topology Examples
Simple Property Setup
ESCO (WLCE)
└── Site (Water Lilies)
└── Property (WL-01)
└── Service Head (SH-WL-01)
└── Meter (EML2137580826)
├── Register A (day rate) → Power Circuit
└── Register B (night rate) → Heat Circuit
Shared Service Head
Service Head (SH-SHARED-01)
├── Property (WL-01)
├── Property (WL-02)
└── Meter (EML2137580833)
└── Register (SINGLE) → Power Circuit
Multiple Meters per Property
Property (WL-10)
├── Service Head 1 (SH-WL-10-1)
│ └── Supply Meter (EML2137580826)
│ └── Register → Power Circuit
└── Service Head 2 (SH-WL-10-2)
└── Solar Meter (EML2137580827)
└── Register → Solar Circuit
Common Queries
1. Full Property Hierarchy
WITH property_hierarchy AS (
SELECT
e.name as esco_name,
s.name as site_name,
p.plot,
p.address,
sh.name as service_head,
mr.serial as meter_serial,
mr.name as meter_name
FROM flows.escos e
JOIN flows.sites_new s ON s.esco = e.id
JOIN flows.properties p ON p.site = s.id
LEFT JOIN flows.properties_service_head psh ON psh.property = p.id
LEFT JOIN flows.service_head_registry sh ON sh.id = psh.service_head
LEFT JOIN flows.service_head_meter shm ON shm.service_head = sh.id
LEFT JOIN flows.meter_registry mr ON mr.id = shm.meter
)
SELECT * FROM property_hierarchy
WHERE esco_name = 'Water Lilies Community Energy'
ORDER BY site_name, plot;
2. Site Infrastructure Summary
SELECT
s.name as site,
COUNT(DISTINCT p.id) as properties,
COUNT(DISTINCT sh.id) as service_heads,
COUNT(DISTINCT m.id) as meters,
COUNT(DISTINCT CASE WHEN c.type = 'power' THEN c.id END) as power_circuits,
COUNT(DISTINCT CASE WHEN c.type = 'heat' THEN c.id END) as heat_circuits,
COUNT(DISTINCT CASE WHEN c.type = 'solar' THEN c.id END) as solar_circuits
FROM flows.sites_new s
LEFT JOIN flows.properties p ON p.site = s.id
LEFT JOIN flows.properties_service_head psh ON psh.property = p.id
LEFT JOIN flows.service_head_registry sh ON sh.id = psh.service_head
LEFT JOIN flows.service_head_meter shm ON shm.service_head = sh.id
LEFT JOIN flows.meter_registry m ON m.id = shm.meter
LEFT JOIN flows.circuits c ON c.site = s.id
GROUP BY s.name;
3. Meters Without Properties
-- Find orphaned meters
SELECT
mr.serial,
mr.name,
e.name as esco
FROM flows.meter_registry mr
JOIN flows.escos e ON mr.esco = e.id
LEFT JOIN flows.service_head_meter shm ON shm.meter = mr.id
LEFT JOIN flows.properties_service_head psh ON psh.service_head = shm.service_head
WHERE psh.property IS NULL
AND mr.mode = 'active';
4. Circuit Load Analysis
-- Peak load by circuit type
WITH circuit_peaks AS (
SELECT
c.type,
c.name,
MAX(ci.total_import_kwh * 2) as peak_kw -- Convert half-hourly to kW
FROM flows.circuits c
JOIN flows.circuit_interval_hh ci ON ci.circuit_id = c.id
WHERE ci.timestamp >= NOW() - INTERVAL '7 days'
GROUP BY c.type, c.name
)
SELECT
type,
COUNT(*) as circuit_count,
AVG(peak_kw) as avg_peak_kw,
MAX(peak_kw) as max_peak_kw,
SUM(peak_kw) as total_peak_kw
FROM circuit_peaks
GROUP BY type;
Design Patterns
Flexible Topology
- Many-to-many relationships allow complex real-world scenarios
- Service heads decouple meters from properties
- Circuits provide logical grouping independent of physical topology
Hierarchical Organization
- Clear ownership chain: ESCO → Site → Property
- Electrical topology: Feeder → Service Head → Meter
- Consumption aggregation: Register → Circuit → Site
Future-Proofing
- UUIDs allow distributed ID generation
- Junction tables enable relationship changes
- Type enums support new circuit/property types
Best Practices
- Always maintain topology integrity - Ensure meters are properly linked through service heads
- Use circuits for aggregation - Don't aggregate registers directly
- Track installation dates - Important for commissioning and warranty
- Validate phase assignments - Critical for load balancing
- Document shared supplies - Important for billing allocation
Integration Points
With Meter Domain
- meter_registry links via service_head_meter
- ESCO ownership tracked on meters
With Data Collection
- Circuits aggregate register data
- Site-level consumption rolls up from circuits
With Billing
- Property ownership determines billing responsibility
- Shared supplies require allocation rules