SCADA & Industrial Automation Specialist – PLC, Modbus TCP, Python. I design, build, and operate industrial control systems that run 24/7 in real production.
For the past 8 years I've been Head of Systems & Communications at a municipal water utility in Argentina. I built the city's water telemetry and control system there from scratch, and I still operate it today: 19 pumping stations under remote manual and automatic control (driven by schedule and by tank level), storage cisterns on ultrasonic level sensors, Schneider M221 PLCs programmed with EcoStruxure over Modbus TCP. The SCADA layer on top is my own code end to end: server and backend built on Python, Linux and Docker, plus the web frontend. Operators run their shift from a mobile PWA on top of that, every day. Grafana and Prometheus sit alongside for infrastructure observability across servers, network and DVRs. Nothing vendor-supplied underneath it; the dashboard isn't a skin over someone else's stack. I'm currently pursuing a university degree in Cyber Defense, focused on OT/ICS security.
The production system belongs to the utility and stays private, as it should. So I rebuilt its core architecture from scratch as a sanitized, fictional, fully working demo you can run with one command.
The demo is deliberately a minimal skeleton. The production system it mirrors goes considerably further: a full operator web application with user management and per-role permissions; thresholds, schedules and alert rules an operator changes without a redeploy; report types for consumption, pump runtime and starts, and incidents, all exportable; per-station electrical telemetry (motor current and voltage) both live and historical; an audit log of every command issued; years of accumulated data that people query daily. The register-range design also keeps growth cheap: commissioning a new station is a config entry, not a project.
| Repo | What it demonstrates |
|---|---|
| modbus-collector | The core. A Modbus TCP server for stations behind cellular CGNAT that connect in, which inverts the classic poll-the-field pattern. Identity by register range, time series, control engine, alerting, REST/WS API, Prometheus metrics. |
| pump-station-simulator | The field side: a realistic PLC simulator built on a physical model (tank, pump, electrical faults), with scenario-driven fault injection, reconnect/backoff and reverse-watchdog behavior. One codebase, N stations. |
| pump-fleet-dashboard | What the operator actually uses: an installable PWA covering fleet overview, pump commands with honest pending→confirmed feedback, live levels and the overnight event log. |
| industrial-monitoring-stack | The engineering view. Prometheus, Grafana and Alertmanager, pre-provisioned for OT workloads, where silence is the signal. |
Run the whole simulated utility (collector + 3 stations + Grafana + operator dashboard):
git clone https://github.com/dscioli/modbus-collector
git clone https://github.com/dscioli/pump-station-simulator
git clone https://github.com/dscioli/industrial-monitoring-stack
git clone https://github.com/dscioli/pump-fleet-dashboard
cd modbus-collector && docker compose -f docker-compose.demo.yml up --build -dWritten-first, async-friendly (GMT-3, full overlap with US business hours). I scope in detail before quoting and document decisions as I go. Code ships commented. Handovers are complete. The READMEs in the repos above are a fair sample of the documentation you'd get.
