Demo data real - OpenWeather
Creación de dispositivos IOT
Para las pruebas de la plataforma IoT usando thingsboard, vamos a seguir los pasos dados anteriormente para crear un dispositivo para cada protocolo (HTTP, MQTT y CoAP). Seguidamente debemos agregar estos dispositivos en forma de entidades al dashboard.
Se han creado los dispositivos http_device, mqtt_device y coap_device para obtener data usando los protocolos HTTP, MQTT y CoAP, respectivamente. Agregamos los dispositivos al dashboard, con su respectivo alias.
Despliegue de contenedores Docker para el envío de datos
Una vez creado los dispositivos en Thingsboard y haberlos agregado al dashboard. Se despliegan contenedores Docker para el envio de data, con el objetivo que la plataforma pueda reconocerla y presentarla visualmente. Para ello, desde otra máquina virtual se realiza el despliegue de tres Dockers que van a enviar data de forma continua usando los protocolos HTTP, MQTT y COAP.
Se crean tres directorios en donde estarán los archivos necesarios para el despliegue de cada uno de los contenedores Docker.
* coap-real:
-python-coap.py
-Dockerfile
-docker-compose.yml
* http-real:
-entrypoint-http.py
-Dockerfile
-docker-compose.yml
* mqtt-real:
-python-mqtt.py
-Dockerfile
-docker-compose.yml
Script en Python
El script permite obtener los datos metereológicos de temperatura, humedad y presión atmosférica, mediante el consumo de la API Openweather. Una vez obtenido los valores correspondiente a la ciudad de Lima, estos son enviados mediante los protocolo MQTT,HTTP y COAP a la plataforma Thingsboard. Para poder obtener los datos del servicio Openweather es neceario contar con un API-KEY. Este API-KEY se obtiene registradose en el sitio web oficial de Openweather
Script MQTT
from tb_device_mqtt import TBDeviceMqttClient, TBPublishInfo
import requests, time, json
import os
#VARIABLES A USAR
HOST_NAME = os.environ['HOST_NAME'] # IP DEL SERVIDOR
ACCESS_TOKEN = os.environ['ACCESS_TOKEN'] # TOKEN DEL DISPOSITIVO A ENVIAR LA DATA
API_KEY = os.environ['API_KEY'] # API KEY DE OPENWEATHERMAP
# Parametros a enviar, los inicializamos en 0
temperatura = 0
presion = 0
humedad = 0
# EN CASO SE ASIGNE VALOR A PORT Y TIME, SE CARGA LOS DATOS, SINO USAN LOS VALORES POR DEFECTO
try:
PORT = os.environ['PORT']
except:
PORT = '1883' # PUERTO MQTT DE ESCUCHA, OPCIONAL
try:
TIME = os.environ['TIME']
except:
TIME = '5' # TIEMPO PARA ENVIAR DATA, OPCIONAL
while True:
#DATA OBTENIDA DESDE OPENWEATHERMAP
url = 'http://api.openweathermap.org/data/2.5/weather?q=Lima,pe&APPID='+API_KEY
r = requests.get(url)
if r.status_code == 200:
data = json.loads(r.text)
temperatura, presion, humedad = data['main']['temp']-273.15, data['main']['pressure'], data['main']['humidity']
telemetry = {"temperature": temperatura, 'pressure': presion, 'humidity' : humedad}
client = TBDeviceMqttClient(HOST_NAME,ACCESS_TOKEN, port=int(PORT))
# CONECTARSE A THINGSBOARD
client.connect()
# ENVIAR DATA Y COMPROBAR EL ESTATUS (QoS = 1 by default)
result = client.send_telemetry(telemetry)
# get es una llamada de bloqueo que espera el estado de entrega
success = result.get() == TBPublishInfo.TB_ERR_SUCCESS
# DESCONECTARSE DE THINGSBOARD
client.disconnect()
# DETENER POR $TIME SEGUNDOS EL SISTEMA
time.sleep(int(TIME))
Script HTTP
import requests, time, json
import os
#VARIABLES A USAR
HOST_NAME = os.environ['HOST_NAME'] # IP DEL SERVIDOR
ACCESS_TOKEN = os.environ['ACCESS_TOKEN'] # TOKEN DEL DISPOSITIVO A ENVIAR LA DATA
API_KEY = os.environ['API_KEY'] # API KEY DE OPENWEATHERMAP
# Parametros a enviar, los inicializamos en 0
temperatura = 0
presion = 0
humedad = 0
# EN CASO SE ASIGNE VALOR A PORT Y TIME, SE CARGA LOS DATOS, SINO USAN LOS VALORES POR DEFECTO
try:
PORT = os.environ['PORT']
except:
TIME = '5'
try:
TIME = os.environ['TIME']
except:
PORT = '8080'
while True:
# DATA OBTENIDA DESDE OPENWEATHERMAP
url = 'http://api.openweathermap.org/data/2.5/weather?q=Lima,pe&APPID='+API_KEY
r = requests.get(url)
if r.status_code == 200:
data = json.loads(r.text)
temperatura, presion, humedad = data['main']['temp']-273.15, data['main']['pressure'], data['main']['humidity']
#ENVIO DE DATA A THINGSBOARD
url = 'http://{}:{}/api/v1/{}/telemetry'.format(HOST_NAME, PORT, ACCESS_TOKEN)
payload = {'temperature': temperatura, 'pressure': presion, 'humidity': humedad}
headers = {'content-type': 'application/json'}
response = requests.post(url, data=json.dumps(payload), headers=headers)
http_version = response.raw.version
for k,v in response.request.headers.items():
print(k, v)
# MOSTRAR VERSION DE HTTP
print("")
if http_version == 10:
print("HTTP/1.0 "+str(response.status_code))
elif http_version == 11:
print("HTTP/1.1 "+str(response.status_code))
for k,v in response.headers.items():
print(k,v)
print("\n")
# DETENER POR $TIME SEGUNDOS EL SISTEMA
time.sleep(int(TIME))
Script COAP
import requests, time, json
import os
#VARIABLES A USAR
HOST_NAME = os.environ['HOST_NAME'] # IP DEL SERVIDOR
ACCESS_TOKEN = os.environ['ACCESS_TOKEN'] # TOKEN DEL DISPOSITIVO A ENVIAR LA DATA
API_KEY = os.environ['API_KEY'] # API KEY DE OPENWEATHERMAP
# Parametros a enviar, los inicializamos en 0
temperatura = 0
presion = 0
humedad = 0
# EN CASO SE ASIGNE VALOR A PORT Y TIME, SE CARGA LOS DATOS, SINO USAN LOS VALORES POR DEFECTO
try:
PORT = os.environ['PORT']
except:
PORT = '5683'
try:
TIME = os.environ['TIME']
except:
TIME = '5' # TIEMPO PARA ENVIAR DATA, OPCIONAL
# BUCLE INFINITO PARA ENVIAR DATOS
while True:
url = 'http://api.openweathermap.org/data/2.5/weather?q=Lima,pe&APPID='+API_KEY # URL DE OPENWEATHER MAP DE DONDE OBTENER DATA EN TIEMPO REAL
r = requests.get(url)
if r.status_code == 200:
data = json.loads(r.text)
temperatura, presion, humedad = data['main']['temp']-273.15, data['main']['pressure'], data['main']['humidity']
# ENVIAR DATA A TRAVES DE PROTOCOLO COAP
command = "echo -n \"{'temperature':"+str(temperatura)+", 'pressure':"+str(presion)+", 'humidity':"+str(humedad)+"}\" | coap post coap://"+HOST_NAME+":"+PORT+"/api/v1/"+ACCESS_TOKEN+"/telemetry"
os.system(command)
# DETENER POR $TIME SEGUNDOS EL SISTEMA
time.sleep(int(TIME))
Dockerfile
Este archivo contiene las instrucciones que se ejecutan al crear una imagen en Docker. Para nuestro caso, vamos a indicarle cual es el sistema operativo del contenedor, los paquetes necesarios para la ejecución de los scripts mostrados y su ejecución.
Dockerfile MQTT
FROM python:3.10.0a6-alpine3.13
RUN apk update && apk add py3-pip && pip3 install tb-mqtt-client requests
COPY python-mqtt.py .
CMD [ "python3" , "python-mqtt.py"]
Docker-compose.yml
Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker de varios contenedores. Esta herramienta usa el formato de serialización YAML para configurar los servicios del contenedor. Luego, con un solo comando, crea e inicia todos los servicios desde su configuración. En esta sección, vamos a crear tres docker-compose.yml, uno para cada protocolo. En ellos, se especifica la creación de una imagen usando el Dockerfile y la implementación de un contenedor en base a esa imagen. Este contenedor es el que enviará la data de manera constante al servidor Thingsboard. Adicionalmente en los archivos con extensión (YML) se definen los parametros (Valores Base, valores delta, HOST_NAME , ACCESS_TOKEN, tiempo en segundos , número de puerto) requeridos por los scripts.
Docker-compose MQTT
version: '2.2'
services:
tb-mqtt:
restart: always
build:
context: .
dockerfile: Dockerfile
image: mqtt-openweather
env_file:
- ../.env
environment:
- HOST_NAME=192.168.27.51
- ACCESS_TOKEN=qvJ8KUsAxwOEF8xp6mCn
- PORT=2883
Visualización de los datos
Los datos enviados por los contenedores Docker, se presentan en un Dashboard:
Puede descargar el Dashboard desde el siguiente enlace: Datareal_ThingsBoard.json