Webapp¶
Esse projeto consiste num site completo para armazenamento e visualização de dados relativos às estações meteorológicas modulares, desenvolvido usando as tecnologias open-source Python (linguagem) + Flask (framework).
Versão atual: 0.1 alpha
Repositório:
https://github.com/nelsojost/cta-emm-web
Ver README.md para instruções de instalação e uso.
Design do Banco de Dados relacional¶
(SVG) Criado com a ferramenta open-source Dia e inspirado em UML (isto é, não segue a rigor).
OBS: A tabela User ainda não está incorporada, pois autenticação de usuário será deixada para versão 0.2.
O design foi pensado com intuito de permitir ao usuário cadastrar e gerenciar individualmente os sensores da sua estação. Uma placa (classe Board) -- pode ter N sensores cadastrados para ela, e cada sensor (classe Sensor) pode ter N pontos armazenados (classe SensorData). A natureza dos valores guardados para cada sensor está armazenada em dois campos do registro Sensor que utilizam os seguintes valores pré-definidos:- PHYSICAL_QUANTITIES: A grandeza física que esse sensor utiliza;
- DATA_FORMAT: O formato interno dos dados, necessário para conversão e manipulação dos mesmos em etapas posteriores do projeto;
Esses valores estão pré-definidos através de ENUMS, um conceito de C/C++, mas que em Python trata-se é basicamente uma tupla/lista com valores default.
Na web app o banco de dados é criado e acessado através de SQL Alchemy , onde as tabelas são definidas como classes de Python. Assim, o diagrama acima pode ser visto como um conjunto de classes onde os atributos definem campos de dados e suas inter-relações. Essa tecnologia permite uma separação entre a lógica relacional do banco de dados - em alto nível, utilizando sintaxe Python ao invés de SQL - e o database backend, que pode ser SQLite, MySQL, PostgresSQL, etc. Para desenvolvimento da versão 0.1 o backend utilizado foi SQLite.
Web site overview¶
A versão 0.1 tem como foco ser minimalista, objetivando simplesmente apresentar os dados ao usuário, assim como formulários para edição dos registros de placas (estações) e sensores. A seguir seguem os principais endereços disponíveis.
/ (index)¶
/board/<int:id>¶
/board/manage/<int:id>¶
API overview¶
Uma API (Application Programming Interface) consiste em um mecanismo de comunicação entre usuário e aplicação onde este pode enviar comandos ao programa e obter saídas específicas -- e que não consistem em páginas HTML. Nessa web app, a API consiste em uma série de endereços (que iniciam com /api) especializados em operações com o banco de dados. A utilidade prioritária dessa API é o envio de dados dos sensores físicos ao servidor web através de métodos POST.
A seguir estão apresentadas as principais operações suportadas pela versão atual:
/api/board/post/sensordata/<int:board_id>¶
Espera um atributo JSON na request (mime type: 'application/json'), contendo dados dos sensores da placa de ID igual a board_id
, no formato:
1 {'datetime': str,
2 'sensors': {'<nickname_1>': 'value_1',
3 '<nickname_2>': 'value_2',
4 ...,
5 '<nickname_N>': 'value_N'}
6 }
OBS: Naturalmente, quebras de linha e identação são opcionais.
- Exemplo de postagem de dados via
curl
(ferramenta comum na linha de comando do Linux):1 $ curl -i -H 'content-type: application/json' -X POST -d '{"datetime": "20130226224346", "sensors": {"DHT22_TEMP": 26.4} }' http://localhost:5000/api/post/sensordata/1
- Exemplo de postagem de dados via Python, utilizando a excelente biblioteca
requests
:1 >>> import requests 2 >>> URL = 'http://localhost:5000/api/post/sensordata/1' 3 >>> sensor_data = {"datetime": "20130226224346", "sensors": {"DHT22_TEMP": 26.4} } 4 >>> requests.post(URL, json=sensor_data)
OBS: http://localhost:5000/
é o endereço root padrão para desenvolvimento em Flask. No servidor de produção deve ser utilizado o IP da máquina ou um domínio registrado (se disponível).