CREATE TABLE md_log ( id INTEGER PRIMARY KEY, timestamp DATETIME, demand_kw REAL, peak_flag BOOLEAN ); CREATE TABLE md_config ( param TEXT PRIMARY KEY, value REAL ); -- e.g., ('limit_kw', 150.0), ('warning_pct', 80.0), ('window_min', 15)
kVA = (kW) / Power Factor OR directly measure kVA = (V × I × sqrt(3))/1000 for 3‑phase Minimal table schema (SQLite example):
def demand_control(self, demand_kw, limit_kw): if demand_kw >= limit_kw: self.shed_level(2) # shed all non‑critical loads elif demand_kw >= limit_kw * 0.95: self.shed_level(1) # shed first stage loads elif demand_kw < limit_kw * 0.85: self.restore_level(1) if demand_kw < limit_kw * 0.70: self.restore_level(2) maximum demand electrical
Demand = (kWh_last_15min) / 0.25 To avoid storing raw energy every second, break window into N sub‑intervals.
# Update peak if demand_kw > self.peak_demand_kw: self.peak_demand_kw = demand_kw self.peak_timestamp = now_timestamp CREATE TABLE md_log ( id INTEGER PRIMARY KEY,
For kVA demand (common for utilities), measure voltage and current, then:
| Priority | Load Type | Action at demand > limit | |----------|-----------|--------------------------| | 1 (low) | Water heater | Shed first | | 2 | HVAC – stage 2 | Shed second | | 3 (high) | Lighting, critical | Never shed | | Signal | Source | Use | |--------|--------|-----| | Energy pulses (kWh) | Utility meter / CT + energy IC | Calculate delta per sub‑interval | | Voltage, Current | Power quality meter | Compute kVA if PF varies | | Relay outputs | PLC / MCU | Load shedding control | | Real‑time clock | RTC / NTP | Timestamp peaks | peak_flag BOOLEAN )
"timestamp": "2026-04-14T10:15:00Z", "demand_kw": 134.7, "limit_kw": 150.0, "demand_percent": 89.8, "peak_kw": 148.2, "peak_timestamp": "2026-04-13T18:30:00Z", "warning_level": "none", "shedding_active": false