# tjmhmdaarif/windsense-ai architecture

> Architecture diagram of the GitHub repository tjmhmdaarif/windsense-ai, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/tjmhmdaarif/windsense-ai
- Repository: https://github.com/tjmhmdaarif/windsense-ai

## Overview

WindSense AI is a Streamlit wind-farm monitoring and alarm-analysis application. Operators enter through authentication and reach a realtime dashboard, where alarm classification and anomaly analysis support prioritization, root-cause investigation, and production/downtime analytics. The README documents these dashboard capabilities, but sampled source does not establish all their internal wiring; the graph therefore keeps unsampled dashboard functions under the page rather than inventing a processing pipeline.

Main entry points: [`pages/1_Realtime.py`](https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py) (Realtime dashboard), [`app.py`](https://github.com/tjmhmdaarif/windsense-ai/blob/main/app.py) (Streamlit entry), [`pages/login.py`](https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/login.py) (Login and signup), [`utils/anomaly_detector.py`](https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/anomaly_detector.py) (Anomaly detection)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_application["Application flow"]
  node_app["Streamlit entry<br/>[app.py]"]
  node_login["Login and signup<br/>[login.py]"]
  node_dashboard["Realtime dashboard<br/>[1_Realtime.py]"]
  node_simulator["OPC UA simulator<br/>[opcua_simulator.py]"]
end

subgraph group_analysis["Alarm intelligence"]
  node_classifier["Alarm classification<br/>[1_Realtime.py]"]
  node_model["Trained classifier model"]
  node_trainer["Model training<br/>[model_trainer.py]"]
  node_anomaly["Anomaly detection"]
  node_prioritization["Alarm prioritization<br/>[1_Realtime.py]"]
  node_investigation["Root-cause analysis<br/>[1_Realtime.py]"]
  node_analytics["Fleet and loss analytics<br/>[1_Realtime.py]"]
end

subgraph group_operations["Operations workflow"]
  node_workflow["Acknowledgment workflow<br/>[1_Realtime.py]"]
  node_email["Email notifications<br/>[email_queue.py]"]
  node_sms["SMS notifications<br/>[sms_sender.py]"]
end

subgraph group_state["Data and state"]
  node_scada["SCADA and alarm data"]
  node_anomalylog["Anomaly review log<br/>[anomaly_log.json]"]
  node_database[("Operational records<br/>[database.py]")]
end

node_operator(("Wind-farm operator"))
node_emailservice(("Email service"))
node_smsservice(("SMS provider"))

node_operator -->|"opens"| node_app
node_app -->|"routes unauthenticated"| node_login
node_app -->|"routes authenticated"| node_dashboard
node_login -->|"redirects authenticated"| node_dashboard
node_scada -->|"supplies historical data"| node_dashboard
node_simulator -.->|"simulates live readings"| node_dashboard
node_dashboard -->|"classifies alarms"| node_classifier
node_classifier -->|"loads model"| node_model
node_trainer -.->|"trains and saves"| node_model
node_dashboard -->|"analyzes alarms"| node_anomaly
node_anomaly -->|"writes review entries"| node_anomalylog
node_dashboard -->|"prioritizes alarms"| node_prioritization
node_dashboard -->|"supports investigation"| node_investigation
node_dashboard -->|"presents analytics"| node_analytics
node_dashboard -->|"handles acknowledgments"| node_workflow
node_workflow -->|"records alarm actions"| node_database
node_dashboard -->|"dispatches email notices"| node_email
node_dashboard -->|"dispatches SMS notices"| node_sms
node_email -.->|"sends email"| node_emailservice
node_sms -.->|"sends SMS"| node_smsservice

click node_app "https://github.com/tjmhmdaarif/windsense-ai/blob/main/app.py"
click node_login "https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/login.py"
click node_dashboard "https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py"
click node_scada "https://github.com/tjmhmdaarif/windsense-ai/tree/main/data"
click node_simulator "https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/opcua_simulator.py"
click node_classifier "https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py"
click node_model "https://github.com/tjmhmdaarif/windsense-ai/blob/main/models/windsense_rf_model.pkl.gz"
click node_trainer "https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/model_trainer.py"
click node_anomaly "https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/anomaly_detector.py"
click node_anomalylog "https://github.com/tjmhmdaarif/windsense-ai/blob/main/data/anomaly_log.json"
click node_prioritization "https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py"
click node_investigation "https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py"
click node_analytics "https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py"
click node_workflow "https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py"
click node_database "https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/database.py"
click node_email "https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/email_queue.py"
click node_sms "https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/sms_sender.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_login,node_dashboard,node_simulator toneBlue
class node_classifier,node_model,node_trainer,node_anomaly,node_prioritization,node_investigation,node_analytics toneAmber
class node_workflow,node_email,node_sms toneMint
class node_scada,node_anomalylog,node_database toneRose
class node_operator,node_emailservice,node_smsservice toneIndigo
```

## Components

### Application flow

- [Streamlit entry](https://github.com/tjmhmdaarif/windsense-ai/blob/main/app.py): `app.py`
- [Login and signup](https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/login.py): `pages/login.py`
- [Realtime dashboard](https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py): `pages/1_Realtime.py`
- [OPC UA simulator](https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/opcua_simulator.py): `utils/opcua_simulator.py`

### Alarm intelligence

- [Alarm classification](https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py): `pages/1_Realtime.py`
- [Trained classifier model](https://github.com/tjmhmdaarif/windsense-ai/blob/main/models/windsense_rf_model.pkl.gz): `models/windsense_rf_model.pkl.gz`
- [Model training](https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/model_trainer.py): `utils/model_trainer.py`
- [Anomaly detection](https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/anomaly_detector.py): `utils/anomaly_detector.py`
- [Alarm prioritization](https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py): `pages/1_Realtime.py`
- [Root-cause analysis](https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py): `pages/1_Realtime.py`
- [Fleet and loss analytics](https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py): `pages/1_Realtime.py`

### Operations workflow

- [Acknowledgment workflow](https://github.com/tjmhmdaarif/windsense-ai/blob/main/pages/1_Realtime.py): `pages/1_Realtime.py`
- [Email notifications](https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/email_queue.py): `utils/email_queue.py`
- [SMS notifications](https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/sms_sender.py): `utils/sms_sender.py`

### Data and state

- [SCADA and alarm data](https://github.com/tjmhmdaarif/windsense-ai/tree/main/data): `data`
- [Anomaly review log](https://github.com/tjmhmdaarif/windsense-ai/blob/main/data/anomaly_log.json): `data/anomaly_log.json`
- [Operational records](https://github.com/tjmhmdaarif/windsense-ai/blob/main/utils/database.py): `utils/database.py`

### Other components

- **Wind-farm operator**
- **Email service**
- **SMS provider**

## Connections

- Wind-farm operator → Streamlit entry: opens
- Streamlit entry → Login and signup: routes unauthenticated
- Streamlit entry → Realtime dashboard: routes authenticated
- Login and signup → Realtime dashboard: redirects authenticated
- SCADA and alarm data → Realtime dashboard: supplies historical data
- OPC UA simulator → Realtime dashboard: simulates live readings
- Realtime dashboard → Alarm classification: classifies alarms
- Alarm classification → Trained classifier model: loads model
- Model training → Trained classifier model: trains and saves
- Realtime dashboard → Anomaly detection: analyzes alarms
- Anomaly detection → Anomaly review log: writes review entries
- Realtime dashboard → Alarm prioritization: prioritizes alarms
- Realtime dashboard → Root-cause analysis: supports investigation
- Realtime dashboard → Fleet and loss analytics: presents analytics
- Realtime dashboard → Acknowledgment workflow: handles acknowledgments
- Acknowledgment workflow → Operational records: records alarm actions
- Realtime dashboard → Email notifications: dispatches email notices
- Realtime dashboard → SMS notifications: dispatches SMS notices
- Email notifications → Email service: sends email
- SMS notifications → SMS provider: sends SMS
