1.
postJsonHandler():
Con el metodo POST, esta función permite recibir informacion en formato json y la guarda en un tabla de postgresql. El body del post es así:
{
"device_id": 4,
"temperature":17,
"humidity": 23,
"occupied":1
}
2.
GetJsonHandler():
Con el metodo GET esta función permite recuperar el ultimo registro guardado en la tabla en formato json.
NOTA: Para consultar el clima usando la api OPenWeatherMap ver nota publicada AQUI
Conceptualmente el flujo de la api es así:
python script:
from flask import Flask from flask import request import psycopg2 import time import pandas as pd import pandas.io.sql as psql import pyodbc import requests import os def get_sql_insert(table, columns, values): return 'INSERT INTO ' + table + ' (' + columns + ') VALUES (' + values + ');' def get_sql_data(table): sql_query = 'select * from ' + table + ' order by creation_date desc limit 1;' conn = get_sql_conn() df = psql.read_sql(sql_query, conn) conn.close() return df def get_sql_conn(): conn = psycopg2.connect(database="demo_database", user="postgres", password="postgres", host="127.0.0.1", port="5432") return conn def get_sql_query(input_json): table = 'demo1' columns = "device_id, temperature, humidity, occupied, creation_date" values = ', '.join(str(value) for key, value in input_json.items()) return get_sql_insert(table, columns, values) def sql_commit(sql_query): try: conn = get_sql_conn() cur = conn.cursor() cur.execute(sql_query) conn.commit() except (Exception, psycopg2.DatabaseError) as error: print(error) finally: if conn is not None: conn.close() def get_input(content): input_i = { "device_id": content['device_id'], "temperature": content['temperature'], "humidity": content['humidity'], "occupied": content['occupied'], "creation_date": int(time.time()) } return input_i app = Flask(__name__) @app.route("/") def hello(): return "Flask server for Iot Demo..." @app.route('/postjson', methods = ['POST']) def postJsonHandler(): input_i = get_input(request.get_json()) sql_commit(get_sql_query(input_i)) print (input_i) return 'JSON posted' @app.route('/getjson', methods = ['GET']) def GetJsonHandler(): df = get_sql_data('demo1') return df.to_json(orient='records') if __name__ == '__main__': app.run(host='0.0.0.0', port= 5000)
Referencias:
Ejemplo de proyecto IoT
https://www.balena.io/blog/build-an-environment-and-air-quality-monitor-with-raspberry-pi/
Deteccion de Anomalia en Temperatura
https://www.kaggle.com/victorambonati/unsupervised-anomaly-detection/
Notas sobre postgresql y Python
http://www.postgresqltutorial.com/postgresql-python/insert/
Notas sobre Api con Flask
http://migueleonardortiz.com.ar/rest/como-crear-un-api-con-python-flask-y-mongodb/1952
No hay comentarios:
Publicar un comentario