// Digital Twin — live virtual replica of an industrial asset (Bhopal 220kV substation). const TWIN_ASSETS = [ { id: "sub-bhopal", name: "Substation — Bhopal 220kV", type: "Power", health: 94, warn: true }, { id: "plant-vindhya", name: "NTPC Vindhyachal — Unit 3", type: "Thermal", health: 97, warn: false }, { id: "wtp-indore", name: "Water Treatment — Indore", type: "Water", health: 91, warn: false }, { id: "smartcity-nagpur", name: "Smart City Grid — Nagpur", type: "City", health: 88, warn: true }, ]; const TWIN_TELEMETRY = [ { k: "Bus Voltage", v: "218.4 kV", st: "ok", spark: [216,217,218,219,218,218,218] }, { k: "Line Current", v: "1,284 A", st: "ok", spark: [1180,1220,1250,1240,1270,1284,1284] }, { k: "Transformer Oil Temp", v: "68 °C", st: "warn", spark: [58,60,62,64,66,68,68] }, { k: "Load Factor", v: "94 %", st: "ok", spark: [82,84,88,92,89,94,94] }, { k: "Frequency", v: "49.98 Hz", st: "ok", spark: [49.9,50.0,49.98,49.99,49.97,49.98,49.98] }, { k: "Power Factor", v: "0.97", st: "ok", spark: [0.95,0.96,0.96,0.97,0.97,0.97,0.97] }, ]; const TWIN_COMPONENTS = [ { c: "Incoming Line 220kV", health: 98, next: "Sep 2026", st: "ok" }, { c: "Transformer T-118", health: 76, next: "Overdue · 18h", st: "warn" }, { c: "Busbar A", health: 96, next: "Nov 2026", st: "ok" }, { c: "Feeder CB-1/2/3", health: 93, next: "Oct 2026", st: "ok" }, { c: "Battery Storage 40MWh", health: 89, next: "Dec 2026", st: "ok" }, { c: "SCADA / RTU", health: 99, next: "—", st: "ok" }, ]; function Hotspot({ x, y, label, value, warn }) { const c = warn ? "var(--danger)" : "var(--ok)"; const bw = Math.max(label.length, value.length) * 5.6 + 16; const bx = Math.max(2, x - bw / 2); return ( {label} {value} ); } function TwinSim() { const [load, setLoad] = useState(94); const oil = Math.round(68 + (load - 94) * 0.9); const risk = oil >= 78 ? "High" : oil >= 72 ? "Elevated" : "Nominal"; const riskColor = risk === "High" ? "var(--danger)" : risk === "Elevated" ? "var(--accent-2)" : "var(--ok)"; return (

Simulate — Load Scenario

Physics-informed · what-if on the twin
Feeder load{load}%
setLoad(Number(e.target.value))} style={{ width: '100%', accentColor: load > 100 ? 'var(--danger)' : 'var(--primary)' }}/>
Predicted oil temp
= 75 ? 'var(--danger)' : 'var(--ink)' }}>{oil}°C
Failure risk
{risk}
Threshold 75°C. At {load}% load the thermal model {oil >= 75 ? 'breaches limit — shed load or start cooling.' : 'stays within safe envelope.'}
); } function TwinScreen() { const [asset, setAsset] = useState("sub-bhopal"); return (
Digital Twin SYNCED · 42ms
Real-time virtual replica · physics-informed simulation · predictive maintenance · fed by 2,148 sensors
Twin health
94%
1 component at risk
Efficiency
96.8%
+0.4% vs model
Predicted maint.
18hrs
Transformer T-118
Throughput
218MW
94% of capacity

Live Twin — 220kV Substation

Bhopal · sensor overlay · click a hotspot for detail
Streaming
{/* flow line */} {[[60, 90, 180, 90], [230, 90, 230, 160], [230, 200, 350, 200], [400, 200, 520, 130], [400, 200, 520, 260]].map((e, i) => ( ))} {/* equipment */} {[ { x: 20, y: 74, w: 60, h: 32, t: "GRID", s: "220kV" }, { x: 180, y: 66, w: 100, h: 48, t: "TRANSFORMER", s: "T-118" }, { x: 200, y: 176, w: 60, h: 26, t: "BUSBAR A", s: "" }, { x: 350, y: 180, w: 56, h: 40, t: "BREAKER", s: "CB-1" }, { x: 522, y: 108, w: 76, h: 34, t: "FEEDER 1", s: "City-N" }, { x: 522, y: 244, w: 76, h: 34, t: "FEEDER 2", s: "Ind-Zone" }, ].map((b, i) => ( {b.t} {b.s && {b.s}} ))} {/* solar inject */} SOLAR 8.4MW {/* hotspots — labels float above the equipment they annotate */}

Live Telemetry

2,148 tags
{TWIN_TELEMETRY.map((t, i) => (
{t.k} {t.v}
))}

Component Health & Maintenance

Predictive · remaining useful life
{TWIN_COMPONENTS.map((c, i) => ( ))}
ComponentHealthNext maintenanceStatus
{c.c}
= 90 ? 'var(--ok)' : c.health >= 80 ? 'var(--accent)' : 'var(--danger)' }}/>
{c.health}%
{c.next} {c.st === 'ok' ? Healthy : At risk}
Predictive maintenance alert
The twin's thermal model projects Transformer T-118 oil temperature will cross 75°C within 18–24 hours at current load. Recommend load-shed of 6% or start forced cooling.
); } window.TwinScreen = TwinScreen;