# Este proyecto es la base para la actividad Practica del modulo 2
"""
Esta primera seccion es unicamente con fines de facilitar la conexion
con uBeac
"""
# Importar librerias
import urequests
import network
import time
import json
# Conexion al servicio Wi-Fi Virtual de Wokwi para tener acceso a Internet
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
# Sincronizar hora Argentina
import ntptime
import time
import utime
ntptime.host = "2.ar.pool.ntp.org"
ntptime.settime()
# Clase para usar con Gateway SingleDevice.SingleSensor https://www.ubeac.io/docs/GatewayList.html#_2-software-gateways
class ConexionConUbeac:
def __init__(self, url, uid, tipo, prefijo, unidad):
self.url = url
self.uid = uid
self.tipo = tipo
self.prefijo = prefijo
self.unidad = unidad
def tiempo_actual(self):
local_time = time.localtime()
year, month, day, hour, minute, second = local_time[:6]
unix_timestamp = utime.mktime((year, month, day, hour, minute, second, 0, 0))
return unix_timestamp
def enviar_valor(self, valor):
header = {#Define los parámetros operativos de la solicitud HTTP, como la autenticación, el tipo de contenido(Content-Type), la longitud del contenido(Content-Type, Content-Length), etc.
"Content-Type": "application/json"#Puede usarlo fácilmente para enviar solicitudes HTTP(s) a uBeac. Para hacer eso, puede agregar un sensor único de puerta de enlace genérica uBeac (o cualquier otra puerta de enlace), en su panel y poner su URL en Postman. Puede elegir el método de solicitud GET, POST, PUT o PATCH, establecer "Tipo de contenido(Content-Type)" en los encabezados de solicitud como "aplicación/json".
}
data = {
"mac": self.uid,#Esto muestra la mac del dispositivo o la dirección única. También puedes usar "id", "uid", "name", "title" and "ip" en lugar de eso.
"type": self.tipo,#Este es un código que muestra el tipo de sensor. Cada sensor tiene un número de tipo y un nombre. necesita poner el número de tipo para indicar el tipo de sensor. Para obtener más información sobre los tipos de sensores, puede consultar la lista "SensorType".
"ts": self.tiempo_actual(),#This shows the time that sensor sends data. This could be dateTime or timeStamp value. If you want to send timestamp , you need to use "ts" o "timestamp" y si desea enviar fecha y hora, debe usar "dt", "date", "datetime", "time" en lugar de eso. Si usa ambos, el primero será reemplazado por el segundo.
"unit": self.unidad,#Este es un código que muestra la unidad de datos que se debe considerar en el panel de uBeac. Por ejemplo, si envía datos de temperatura, puede ser un número relacionado con grados centígrados o Fahrenheit. Para saber más sobre las unidades de sensor, puede consultar la "unit list".
"prefix": self.prefijo,#Este es un código que muestra la escala de datos. Por ejemplo, para enviar datos de proximidad, la unidad puede ser metro y los prefijos pueden ser mili, centi, kilo, hecto, etc. Por lo tanto, debe seleccionar el prefijo adecuado de la "prefix list".
"data": valor #Esto muestra los valores enviados desde el sensor. El sensor puede enviar un solo valor como temperatura o valores múltiples como datos de GPS que contienen 2 o 3 campos. Ambos se aceptan como se indica a continuación; también puede usar "item", "items", "value", "values" en lugar de "data".
}
response = urequests.post( #cuando un dispositivo envía una solicitud POST al servidor de uBeac (es decir, envía el último valor de un sensor), el servidor envía una respuesta con el estado de la solicitud (código de respuesta) y un cuerpo, que sería el resultado del proceso.
self.url,#configure la URL en hub.ubeac.io y configure el puerto en 1883 o 8883, luego presione el botón crear conexión. En la siguiente ventana en la parte de publicación, ingrese su dirección única como Tema y coloque el json a continuación como datos de temperatura.
json=data,#Guarda los datos para enviar en formato json
headers=header#Guarda los parametros operativos para la respuesta.
)
# Imprimo el contenido de la respuesta, deberia verlo en la consola justo antes de los mensajes
print(response.__dict__) #el atributo __dict__ almacena los atributos de un objeto en otras palabras te permite acceder a los atributos del objeto.
# Imprime el resultado de el envio de datos
if response.status_code == 200:#Si la solicitud es correcta, el servidor generalmente devolverá una respuesta con código 200, junto con el archivo que se solicita "cuerpo(body)".
print(f'{self.uid} subio {valor}')
else:
print(f'ERROR de {self.uid} al subir {valor}: {response.status_code}')
response.close()
"""
* URL_HTTP_GATEWAY con la URL del gateway que extrae de uBeac
* NOMBRE_SENSOR_TEMPERATURA con el nombre del sensor de temperatura que usted le quiera dar
* NOMBRE_SENSOR_HUMEDAD con el nombre del sensor de humedad que usted le quiera dar
"""
#Direccion HTTP del Gateway uBeac Single Sensor
URL_HTTP_GATEWAY = 'http://modelocomunicacioniot.hub.ubeac.io/iotsensores/'
#Van a ser los nombres con los que van a aparecer los dispositivos en Ubeac
# <Unidad sensor>:<Inicial nombre><Apellido>
NOMBRE_SENSOR_TEMPERATURA = 'Temperatura:tp'
NOMBRE_SENSOR_HUMEDAD = 'Humedad:tp'
"""
Esta seccion la puede modificar unicamente si cambia/añade/quita
un sensor en el circuito,
de lo contrario NO MODIFICAR
"""
# Ejemplo de como enviar datos a un gateway Ubeac con la url anterior
ubeac_temperatura = ConexionConUbeac(URL_HTTP_GATEWAY,
NOMBRE_SENSOR_TEMPERATURA,
4, # Tipo Temperature https://www.ubeac.io/docs/SensorTypes.html
0, # Sin prefijo de unidad https://www.ubeac.io/docs/UnitPrefixes.html
2) # Grados centigrados como unidad https://www.ubeac.io/docs/SensorUnits.html
ubeac_humedad = ConexionConUbeac(URL_HTTP_GATEWAY,
NOMBRE_SENSOR_HUMEDAD,
5, # Tipo Humidity https://www.ubeac.io/docs/SensorTypes.html
0, # Sin prefijo de unidad https://www.ubeac.io/docs/UnitPrefixes.html
20) # % Porcentaje como unidad https://www.ubeac.io/docs/SensorUnits.html
import dht
from machine import Pin
"""
>>>>>> A partir de aqui modifique el código ---------------------------------------------------------------------------
# Implemente un bucle infinito con un "while" que envie datos a uBeac
# temperatura solo si esta en un rango entre 0 y 100 grados
# humedad solo si esta en un rango entre 20 y 80 %
"""
# Indicamos que el sensor esta conectado al Pin 15 de la placa
sensor = dht.DHT22(Pin(15))
while True:
# Indicamos al sensor que haga una medicion
sensor.measure()
# Obtenemos el valor de temperatura desde el sensor
temperatura = sensor.temperature()
# Enviamos el valor de temperatura a uBeac
if temperatura > 25:
ubeac_temperatura.enviar_valor(temperatura)
# Obtenemos el valor de humedad desde el sensor
humedad = sensor.humidity()
# Enviamos el valor de humedad a uBeac
if humedad > 50:
ubeac_humedad.enviar_valor(humedad)