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.

Lista de dispositivos
Figure 1. Lista de dispositivos

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.

Alias
Figure 2. Agregación de 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"]

Dockerfile HTTP

FROM python:3.10.0a6-alpine3.13

RUN apk update && apk add py3-pip && pip3 install requests

COPY entrypoint-http.py .

CMD [ "python3" , "entrypoint-http.py"]

Dockerfile COAP

FROM python:3.10.0a6-alpine3.13

RUN apk update && apk add py3-pip && pip3 install requests && apk add npm && npm install coap-cli -g

COPY python-coap.py .

CMD [ "python3" , "python-coap.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

Docker-compose HTTP

version: '2.2'

services:
  tb-http:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    image: http-openweather

    env_file:
      - ../.env
    environment:
      - HOST_NAME=192.168.27.51
      - ACCESS_TOKEN=lalg1SuKEK1lDhBjobLB
      - PORT=9090
      - TIME=5

Docker-compose COAP

version: '2.2'

services:
  tb-coap:
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    image: coap-openweather

    env_file:
      - ../.env
    environment:
      - HOST_NAME=192.168.27.51
      - ACCESS_TOKEN=xV1bBks73vXiMXURkmC6
      - TIME=5

Visualización de los datos

Los datos enviados por los contenedores Docker, se presentan en un Dashboard:

Visualización del Dashboard
Figure 3. Dashboard con valores reales Openweather

Puede descargar el Dashboard desde el siguiente enlace: Datareal_ThingsBoard.json