Plataforma web para monitoramento de sensores ambientais integrados com Fiware. O sistema coleta, processa e visualiza dados de temperatura, umidade e nível de água através de dispositivos ESP32, oferecendo dashboards em tempo real, históricos detalhados e geolocalização interativa de todos os sensores.
| Gabriel Couto Ribeiro | ||
|---|---|---|
| Gabriel Kato Peres | ||
| João Vitor de Matos |
- Integração Fiware: Integração com Orion Context Broker para recebimento e consulta de dados de sensores
- Listagem de Dispositivos: Exibição de dispositivos com status operacional, últimas leituras e ações rápidas
- Detecção Automática: Busca e cadastro automático de novos dispositivos no Fiware
- Gráficos Interativos: Visualização de histórico de leituras com Chart.js
- Mapa Interativo: Localização de dispositivos em mapa com indicadores de status
- Geolocalização Editável: Atualização de coordenadas de dispositivos sincronizadas com Fiware
- Status Operacional: Indicadores em tempo real (Online/Offline)
- Administração: Interface de gerenciamento completo via Django Admin
- Design Responsivo: Interface moderna e adaptativa com TailwindCSS
Escolha um dos métodos abaixo para instalar e executar a aplicação:
Instalação local com Python
- Python 3.12 ou superior
- pip ou conda
- Sistema operacional: Linux, macOS ou Windows
-
Clone o repositório
git clone https://github.com/rouri404/site-gs-fiap.git cd site-gs-fiap -
Configure o ambiente virtual
python -m venv venv source venv/bin/activate # Linux/macOS # ou no Windows: # venv\Scripts\activate
-
Instale as dependências
pip install -r requirements.txt
-
Execute as migrações do banco de dados
python gs_fiap_monitor/manage.py migrate
-
Colete os arquivos estáticos
python gs_fiap_monitor/manage.py collectstatic
-
Crie um usuário administrativo (opcional)
python gs_fiap_monitor/manage.py createsuperuser
-
Inicie o servidor de desenvolvimento
python gs_fiap_monitor/manage.py runserver
-
Acesse a aplicação
- Interface principal: http://localhost:8000/sensores/
- Painel administrativo: http://localhost:8000/admin/
Docker via hub.docker.com
- Docker instalado
- Sistema operacional: Linux, macOS ou Windows
-
Puxe a imagem do DockerHub
docker pull gabricoto/gs-fiap-monitor:latest
-
Execute o container
docker run -p 8000:8000 gabricoto/gs-fiap-monitor:latest
-
Acesse a aplicação
- Interface principal: http://localhost:8000/sensores/
- Painel administrativo: http://localhost:8000/admin/
Dica: Esta é a forma mais rápida para começar sem fazer build local.
Docker local
- Docker e Docker Compose instalados
- Sistema operacional: Linux, macOS ou Windows
-
Clone o repositório
git clone https://github.com/rouri404/site-gs-fiap.git cd site-gs-fiap -
Configure variáveis de ambiente (opcional)
Crie um arquivo
.envna raiz do projeto para configurações personalizadas:DEBUG=False SECRET_KEY=sua-chave-secreta-aqui ALLOWED_HOSTS=localhost,127.0.0.1,seu-dominio.com
-
Inicie os containers
docker-compose up -d
-
Execute as migrações do banco de dados
python gs_fiap_monitor/manage.py migrate
-
Colete os arquivos estáticos
docker-compose exec web python gs_fiap_monitor/manage.py collectstatic --noinput -
Crie um usuário administrativo (opcional)
docker-compose exec web python gs_fiap_monitor/manage.py createsuperuser -
Acesse a aplicação
- Interface principal: http://localhost:8000/sensores/
- Painel administrativo: http://localhost:8000/admin/
O sistema integra-se com Fiware através do Orion Context Broker para gerenciamento de dados IoT. A comunicação ocorre em dois fluxos:
- Notificações em Tempo Real: Fiware envia notificações ao endpoint
/sensores/fiware_notification/ - Consultas sob Demanda: O sistema consulta dados atuais ao acessar detalhes de dispositivos
Seu Orion Context Broker deve atender aos seguintes requisitos:
- Estar acessível pela rede da aplicação Django
- Possuir subcriptions NGSI v2 configuradas para enviar notificações à URL:
http://<DJANGO_HOST>:<PORTA>/sensores/fiware_notification/
As notificações devem seguir o padrão abaixo:
{
"subscriptionId": "id_da_sua_inscricao",
"data": [
{
"id": "urn:ngsi-ld:SensorDevice:001",
"type": "SensorDevice",
"temperature": {
"value": 23.5,
"type": "Number",
"metadata": {"unitCode": {"value": "CEL"}}
},
"humidity": {
"value": 60,
"type": "Number",
"metadata": {"unitCode": {"value": "P1"}}
},
"waterLevel": {
"value": 45,
"type": "Number",
"metadata": {"unitCode": {"value": "P1"}}
},
"TimeInstant": {
"value": "2025-06-01T12:00:00.000Z",
"type": "DateTime"
}
}
]
}Campos importantes:
TimeInstantoutimestamp: Define o horário da leituraunitCodenos metadados: Especifica a unidade de medidaid: Identificador único que deve corresponder ao ID cadastrado no sistema
O sistema possui funcionalidade de detecção automática de dispositivos registrados no Fiware. Acesse a listagem de dispositivos e utilize a opção "Detectar Novos Dispositivos".
Para adicionar dispositivos manualmente:
- Acesse http://localhost:8000/admin/
- Navegue até Dispositivos e clique em Adicionar Dispositivo
- Preencha os campos obrigatórios:
- ID Fiware: Identificador exato do dispositivo no Orion Context Broker (ex:
urn:ngsi-ld:SensorDevice:001) - Nome do Dispositivo: Designação do sensor
- Latitude/Longitude: Coordenadas para o mapa interativo
- Ativo: Marque para habilitar o dispositivo
- ID Fiware: Identificador exato do dispositivo no Orion Context Broker (ex:
- Salve o formulário
Para automação em scripts ou testes:
python gs_fiap_monitor/manage.py shellExemplo de script para criar ou atualizar um dispositivo:
from sensores.models import Dispositivo
# Criar ou atualizar um dispositivo
obj, criado = Dispositivo.objects.update_or_create(
id_dispositivo_fiware='urn:ngsi-ld:SensorDevice:001',
defaults={
'nome_dispositivo': 'Sensor de Temperatura Alpha',
'localizacao_latitude': -23.5880,
'localizacao_longitude': -46.6590,
'descricao': 'Sensor de temperatura e umidade',
'ativo': True
}
)
status = "CRIADO" if criado else "ATUALIZADO"
print(f"Dispositivo '{obj.nome_dispositivo}' {status}")Para adicionar múltiplos dispositivos, repita a operação update_or_create() com diferentes IDs.
Para facilitar testes e desenvolvimento, o sistema oferece scripts para popular o banco com dados fictícios. Os comandos abaixo criam 5 leituras retroativas para cada tipo de sensor, permitindo visualizar gráficos e históricos sem depender de dados reais do Fiware.
- Dispositivo com ID
urn:ngsi-ld:SensorDevice:001já cadastrado no sistema - Se não existir, os comandos criarão automaticamente
python gs_fiap_monitor/manage.py shell -c "from sensores.models import Dispositivo, TipoSensor, LeituraSensor; from django.utils import timezone; from datetime import timedelta; device_id='urn:ngsi-ld:SensorDevice:001'; disp,_=Dispositivo.objects.get_or_create(id_dispositivo_fiware=device_id, defaults={'nome_dispositivo': 'Sensor de Teste 001'}); tipo,_=TipoSensor.objects.get_or_create(nome='temperature',defaults={'unidade_medida':'CEL','descricao':'Sensor de temperatura'}); [LeituraSensor.objects.create(dispositivo=disp,tipo_sensor=tipo,valor=20+i,timestamp_leitura=timezone.now()-timedelta(hours=i)) for i in range(5)]; print('✓ 5 leituras de Temperatura criadas')"python gs_fiap_monitor/manage.py shell -c "from sensores.models import Dispositivo, TipoSensor, LeituraSensor; from django.utils import timezone; from datetime import timedelta; device_id='urn:ngsi-ld:SensorDevice:001'; disp,_=Dispositivo.objects.get_or_create(id_dispositivo_fiware=device_id, defaults={'nome_dispositivo': 'Sensor de Teste 001'}); tipo,_=TipoSensor.objects.get_or_create(nome='humidity',defaults={'unidade_medida':'P1','descricao':'Sensor de umidade'}); [LeituraSensor.objects.create(dispositivo=disp,tipo_sensor=tipo,valor=50+i*2,timestamp_leitura=timezone.now()-timedelta(hours=i)) for i in range(5)]; print('✓ 5 leituras de Umidade criadas')"python gs_fiap_monitor/manage.py shell -c "from sensores.models import Dispositivo, TipoSensor, LeituraSensor; from django.utils import timezone; from datetime import timedelta; device_id='urn:ngsi-ld:SensorDevice:001'; disp,_=Dispositivo.objects.get_or_create(id_dispositivo_fiware=device_id, defaults={'nome_dispositivo': 'Sensor de Teste 001'}); tipo,_=TipoSensor.objects.get_or_create(nome='waterLevel',defaults={'unidade_medida':'P1','descricao':'Sensor de nível de água'}); [LeituraSensor.objects.create(dispositivo=disp,tipo_sensor=tipo,valor=30+i*5,timestamp_leitura=timezone.now()-timedelta(hours=i)) for i in range(5)]; print('✓ 5 leituras de Nível de Água criadas')"Resultado esperado: Cada comando criará 5 leituras com timestamps retroativos (últimas 5 horas), permitindo visualizar gráficos e analisar comportamentos em períodos diferentes.
Estrutura de Dados
Dispositivo: Representa um sensor físico com identificação única no Fiware, localização geográfica e metadata.
TipoSensor: Especifica o tipo de medição (temperatura, umidade, nível) com unidade de medida.
LeituraSensor: Armazena o histórico de medições com timestamps de leitura e recebimento.
Stack Tecnológico
| Componente | Versão | Propósito |
|---|---|---|
| Django | 5.2.1 | Framework web backend |
| Django REST Framework | 3.16.0 | API REST |
| Chart.js | (CDN) | Visualização de gráficos |
| Leaflet.js | (CDN) | Mapas interativos |
| TailwindCSS | - | Estilização e responsividade |
| Fiware Orion | - | Context Broker IoT |
| WhiteNoise | - | Servimento de arquivos estáticos |
| Prophet | 1.1.7 | Previsões (em planejamento) |
| Scikit-learn | 1.6.1 | Machine Learning (em planejamento) |
Configuração de Arquivos Estáticos
Este projeto utiliza WhiteNoise para servir arquivos estáticos em ambiente de produção (quando DEBUG = False). A configuração está incluída em gs_fiap_monitor/settings.py.
O WhiteNoise gerencia arquivos estáticos (CSS, JavaScript, imagens) e não necessita de um servidor web separado para esse fim.
Configurações:
MIDDLEWARE: WhiteNoise está integrado ao middleware do DjangoSTATICFILES_STORAGE: Utiliza compressão e cache-busting- Dependências:
whitenoiseebrotlipy(incluídas emrequirements.txt)
Comando essencial:
python gs_fiap_monitor/manage.py collectstaticExecute este comando sempre que alterar arquivos estáticos ou ao deployer a aplicação para garantir que todos os arquivos sejam coletados no diretório STATIC_ROOT.
Limpeza de Dados do Banco (Desenvolvimento)
Para limpar dados durante testes, mantendo a estrutura do banco:
- Pare o servidor
- Execute:
python gs_fiap_monitor/manage.py flush
- Confirme com
yesquando solicitado - (Opcional) Recrie um usuário administrativo se necessário