SAA
Sistema de Análise de Alarmes para Usinas Solares Dashboard interativo em Streamlit para monitoramento e análise de alarmes de equipamentos fotovoltaicos. Visualize KPIs, tendências, equipamentos críticos e teleobjetos com gráficos dinâmicos e relatórios detalhados.
Install / Use
/learn @arthurvtl/SAAREADME
Sistema de Análise de Alarmes (SAA)
Descrição
Sistema de Business Intelligence desenvolvido em Python + Streamlit para análise e monitoramento de alarmes gerados por equipamentos em usinas de geração de energia solar.
Características Principais
- Queries SQL otimizadas com índices e UNION ALL eficiente
- Código modular separado em módulos específicos
- Clean Code com funções pequenas e responsabilidade única
- Variáveis descritivas que deixam claro o propósito
- Comentários claros explicando funções, parâmetros e retornos
Estrutura do Projeto
sistema_analise_alarmes/
├── app.py # Arquivo principal Streamlit
├── config.py # Configurações (DATABASE_URL)
├── requirements.txt # Dependências
├── README.md # Este arquivo
├── database/
│ ├── __init__.py
│ ├── conexao.py # SQLAlchemy engine e session
│ ├── models.py # Modelos ORM
│ └── queries.py # Funções de consulta SQL
├── calculos/
│ ├── __init__.py
│ ├── kpis.py # Cálculo de KPIs
│ ├── agregacoes.py # Agregações
│ └── formatacao.py # Formatação de tempo
├── visualizacoes/
│ ├── __init__.py
│ ├── graficos.py # Gráficos PyEcharts
│ ├── tabelas.py # Tabelas Streamlit
│ └── cards.py # Cards de KPIs
└── utils/
├── __init__.py
└── helpers.py # Funções auxiliares
Requisitos
- Python 3.9 ou superior
- PostgreSQL 12 ou superior
- Acesso ao banco de dados
Instalação
1. Clone ou copie o projeto
cd /home/ubuntu/sistema_analise_alarmes
2. Crie um ambiente virtual (recomendado)
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# ou
venv\Scripts\activate # Windows
3. Instale as dependências
pip install -r requirements.txt
4. Configure a conexão com o banco de dados
Edite o arquivo config.py e ajuste a variável DATABASE_URL conforme necessário:
DATABASE_URL = "postgresql+psycopg2://usuario:senha@host:porta/banco"
Execução
Executar o Sistema
streamlit run app.py
O sistema estará disponível em: http://localhost:8501
Acessar de outra máquina na rede
streamlit run app.py --server.address=0.0.0.0
Funcionalidades
Página HOME
- Filtros: Ano (dropdown) e Meses (checkboxes, máx 3)
- KPIs Gerais: Total de Usinas, Total de Alarmes, Tempo Total, Tempo Médio
- Gráfico Pizza: Distribuição de Alarmes por Usina
- Gráfico Barras: Top 10 Usinas com Mais Alarmes
- Tabela Ranking: Todas as 55 usinas com botão "Analisar"
Página ANÁLISE DETALHADA
Sidebar
- Seleção de Usina (dropdown)
- Seleção de Ano (dropdown)
- Seleção de Meses (checkboxes, máx 3)
Área Principal
-
4 KPIs principais:
- Total de Alarmes
- Tempo Total Alarmado
- Tempo Médio por Alarme
- Tempo Médio de Reconhecimento
-
11 Gráficos:
- Pizza - Tempo Total por Severidade
- Barras Horizontais - Top 5 Equipamentos (toggle Quantidade/Duração)
- Barras Horizontais - Top 5 Teleobjetos (toggle Quantidade/Duração)
- Barras Horizontais - Top 5 Equipamentos Sem Comunicação
- Barras Horizontais - Tempo Médio de Reconhecimento por Severidade
- Barras Horizontais - Top 5 Usuários que Mais Reconhecem
- Barras Horizontais - Alarmes Críticos por Equipamento
- Barras Horizontais - Alarmes Críticos por Teleobjeto
- Barras Horizontais - Top 10 Alarmes Não Finalizados
- Linha - Evolução Diária (toggle Quantidade/Tempo)
- Barras - Resumo por Mês (quando multi-mês)
-
Tabela de Alarmes:
- Paginação de 50 alarmes por página
- Colunas: Data Início, Data Fim, Duração, Equipamento, Teleobjeto, Severidade, Descrição, Reconhecimento
Regras de Negócio
Limites
- Máximo de 3 meses por consulta
- Alarmes não finalizados:
clear_date IS NULL - Sem comunicação:
description ILIKE '%sem comunicação%' - Alarmes críticos:
alarm_severity_id = 1
Cálculos
- Duração:
(clear_date - date_time)ou(NOW() - date_time)se não finalizado - Evolução diária: Alarmes que iniciaram naquele dia (
date_time) - Tempo formatado: X dias, Y horas, Z minutos
Dados
- Sempre usar NOMES (não IDs) fazendo JOINs
- Tabelas dinâmicas:
alarm_{usina_id}_{ano}_{mes} - 55 usinas solares com dados de 2021 a 2025
- 1.637 tabelas dinâmicas de alarmes
Tecnologias Utilizadas
- Frontend: Streamlit
- Backend: Python 3.9+
- Banco de Dados: PostgreSQL
- ORM: SQLAlchemy
- Visualização: PyEcharts
- Manipulação de Dados: Pandas, NumPy
Estrutura do Banco de Dados
Tabelas Principais
- power_station: Cadastro de usinas
- equipment: Cadastro de equipamentos
- skid: Agrupamento de equipamentos
- tele_object: Teleobjetos (pontos de monitoramento)
- tele_object_config: Configuração de teleobjetos
- alarm_severity: Níveis de severidade
- users: Usuários do sistema
- alarm_*: Tabelas dinâmicas de alarmes (por usina/ano/mês)
Severidades (com cores)
| ID | Nome | Cor | Descrição | |----|------|-----|------------| | 1 | Crítica | #f14e4e | Vermelho | | 2 | Alta | #fdc262 | Laranja | | 3 | Média | #ffe00a | Amarelo | | 4 | Baixa | #80FFFF | Azul claro | | 5 | Não Apl. | #F0F0F0 | Cinza | | 6 | Urgente | #000000 | Preto |
Troubleshooting
Erro de Conexão com Banco de Dados
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server
Solução:
- Verifique se o PostgreSQL está rodando
- Verifique as credenciais em
config.py - Verifique se o host/porta estão corretos
