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).

screenshot-webapp.png (60.9 kB) Nelso G. Jost, 21/04/2015 19:33

board-view.png (30.6 kB) Nelso G. Jost, 29/04/2015 02:49

index-select.png (11.5 kB) Nelso G. Jost, 29/04/2015 02:49

board-view.png (30.6 kB) Nelso G. Jost, 29/04/2015 02:49

board-manage.png (35.2 kB) Nelso G. Jost, 29/04/2015 02:49

db_schema.png (84.1 kB) Nelso G. Jost, 29/04/2015 02:49

db_schema.svg (11.1 kB) Nelso G. Jost, 13/05/2015 00:56