Build a production-grade SCADA web application for real-time monitoring and remote control of a small electrical distribution network.
🛠 Simulator — Quick Start
Download:
scada_simulator_1.zip
docker-compose up --build
docker-compose --profile monitor up
mosquitto_pub -h localhost -t "scada/commands/switch/CH-01" \
-m '{"command": "open", "operator": "candidate"}' -q 1
mosquitto_pub -h localhost -t "scada/commands/fault/inject" \
-m '{"feeder_id":"AL-02","fault_type":"short_circuit","segment":2,"duration":30}' -q 1
📡 Telemetry every 1s — voltage, current, active/reactive power, PF, frequency
⚡ Realistic daily load curve — (peak at 6 PM, valley at 3 AM) with instrumentation noise
⚠️ Random auto faults every 30–120 seconds (short circuit, high impedance, open circuit)
⚠️ Automatic alarms for overvoltage, undervoltage, overcurrent, and fault current
⚠️ Command response for opening/closing switches with audit logs
🌐 WebSocket on port 9001 for web HMIs via mqtt.js
🛠 How to test the simulator
With docker-compose up running, open a second terminal in the same folder.
docker exec -it scada-broker mosquitto_sub -h localhost -t "scada/#" -v
You will see a stream like this every second:
scada/telemetry/MED-01 {"measurement_id": "MED-01", "voltage_v": 7929.1, "current_a": 78.25, ...}
scada/telemetry/MED-02 {"measurement_id": "MED-02", "voltage_v": 7872.4, "current_a": 20.45, ...}
...
docker exec -it scada-broker mosquitto_pub \
-h localhost \
-t "scada/commands/switch/CH-01" \
-m '{"command": "open", "operator": "test.operator"}' \
-q 1
Expected effect:
- Meters MED-02, MED-03, and MED-04 will publish "energized": false and all values drop to zero.
docker exec -it scada-broker mosquitto_pub \
-h localhost \
-t "scada/commands/switch/CH-01" \
-m '{"command": "close", "operator": "test.operator"}' \
-q 1
docker exec -it scada-broker mosquitto_pub \
-h localhost \
-t "scada/commands/fault/inject" \
-m '{"feeder_id": "AL-02", "fault_type": "short_circuit", "segment": 2, "duration": 30}' \
-q 1
Expected effect:
- scada/alarm/fault publishes a CRITICAL event
- MED-06 and MED-07 show very high current and "fault_current": true
- After 30 seconds, the fault is automatically cleared
docker exec -it scada-broker mosquitto_sub \
-h localhost -t "scada/network/snapshot" -C 1
{
"switches": {"CH-01": "closed", "CH-02": "closed", ...},
"energized_feeders": ["AL-01", "AL-02", "AL-03"],
"active_faults": {}
}
docker exec -it scada-broker mosquitto_sub \
-h localhost -t "scada/telemetry/MED-05" -v
docker exec -it scada-broker mosquitto_sub \
-h localhost -t "scada/telemetry/MED-05" -v