Trabajando con Python Popular Monitoring con Raspberry Pi

Al intentar conectar mi sensor de temperatura DS18B20 a mi invernadero inteligente , descubrí que Internet no tiene instrucciones completas para conectar este sensor a través del lenguaje de programación Python. Lo uso desde que trabajo con la plataforma Raspberry Pi. Decidí solucionar este problema. Resulta que trabajar con TCP no es tan difícil, pero debe comprender lo que estamos haciendo y por qué. Un baile de dos horas con una pandereta claramente me molestó. Así que aquí, además de la parte del software en sí, quiero contar todo el algoritmo de principio a fin. Creo que otros sensores funcionan de manera similar, por lo que un artículo grande será el mismo para todos. Espero que si quieres conectar tu sensor, no necesites una pandereta :) Y así, comencemos, te pido Habrokat.

Chamanismo con sensor


Para nosotros, necesitamos conectar el sensor en sí. Trabajaré con el sensor de temperatura DS18B20. Artículos completos sobre este tema, no los duplicaremos. Puedes leer sobre la conexión aquí . Entonces necesitamos obtener datos del sensor. Haremos lo mismo que se indica en el artículo anterior. Hay un gran ejemplo de Python del que soy fanático.

import os tfile=open("/sys/bus/w1/devices/28-000000d7970b/w1_slave") ttext=tfile.read() tfile.close() temp=ttext.split("\n")[1].split(" ")[9] temperature=float(temp[2:])/1000 print temperature 

No olvide reemplazar los datos con su sensor.

Como podemos ver, la temperatura toma la variable de temperatura (quién lo hubiera pensado), que necesitaremos más.

Conjurar con monitoreo


Bueno, primero debes registrar narodmon.ru , aquellos que aún no lo han hecho. El servicio API nos ofrece transmitir datos a través de TCP. Entonces hagámoslo. Se nos pide que transmitamos el texto en el siguiente formato:

 #MAC[#NAME][#LAT][#LNG][#ELE]\n #mac1#value1[#time1][#name1]\n ... #macN#valueN[#timeN][#nameN]\n ## 

Pero, de hecho, necesitamos pasar solo tres parámetros: el MAC del dispositivo, el nombre del sensor y su valor. El resto no es necesario, y realmente no lo necesitamos.

En la primera línea, necesitamos pasar el enrejado, MAC y el carácter de avance de línea \ n.
En la segunda línea y las siguientes, transferimos nuevamente la cuadrícula, el nombre del sensor, nuevamente la cuadrícula y las lecturas del sensor. Terminamos esto con el carácter de salto de línea \ n.
En la última línea, debe pasar dos cuadrículas para completar el paquete.

Como resultado, el formato sigue siendo el siguiente:

 #MAC\n #mac1#value1\n #macN#valueN\n ## 

Escribir un programa de Python


Escribiremos el programa en Python 2. El algoritmo será así. Recibimos datos del sensor y los escribimos en la variable de temperatura. Luego formamos el paquete y lo enviamos al Servidor de Monitoreo de Personas. Ejecutaremos el script cada 10 minutos (el intervalo mínimo permitido para enviar lecturas es de 5 minutos) a través de cron.

El envío se realiza de la siguiente manera (ejemplo en el sitio de monitoreo):

Enviar código de script
 #!/usr/bin/env python2 # -*- coding: utf-8 -*- # by Roman Vishnevsky aka.x0x01 @ gmail.com import socket # MAC  .   ! DEVICE_MAC = '0123456789012' #  ,    01 (02)  mac  SENSOR_ID_1 = DEVICE_MAC + '01' SENSOR_ID_2 = DEVICE_MAC + '02' #  ,  float/integer sensor_value_1 = 20 sensor_value_2 = -20.25 #   sock = socket.socket() #   try: #    sock.connect(('narodmon.ru', 8283)) #       sock.send("#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1)) #       # sock.send("#{}\n#{}#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, sensor_value_1, SENSOR_ID_2, sensor_value_2)) #   data = sock.recv(1024) sock.close() print data except socket.error, e: print('ERROR! Exception {}'.format(e)) 


Estamos conectados al servidor narodmon.ru:8283

Como resultado, obtenemos el siguiente script:

Código del guión terminado
 #!/usr/bin/env python2 # -*- coding: utf-8 -*- import socket import os import fnmatch # MAC  .   ! DEVICE_MAC = 'FF:FF:FF:FF:FF:FF' #  SENSOR_ID_1 = 'T1' SENSOR_ID_2 = 'T2' #   temperature = [] IDs = [] for filename in os.listdir("/sys/bus/w1/devices"): if fnmatch.fnmatch(filename, '28-031652ddbdff'): with open("/sys/bus/w1/devices/" + filename + "/w1_slave") as fileobj: lines = fileobj.readlines() if lines[0].find("YES"): pok = lines[1].find('=') temperature.append(float(lines[1][pok+1:pok+7])/1000) IDs.append(filename) else: logger.error("Error reading sensor with ID: %s" % (filename)) temperature2 = [] for filename in os.listdir("/sys/bus/w1/devices"): if fnmatch.fnmatch(filename, '28-011563e8d2ff'): with open("/sys/bus/w1/devices/" + filename + "/w1_slave") as fileobj: lines = fileobj.readlines() if lines[0].find("YES"): pok = lines[1].find('=') temperature2.append(float(lines[1][pok+1:pok+7])/1000) IDs.append(filename) else: logger.error("Error reading sensor with ID: %s" % (filename)) sock = socket.socket() # try: sock.connect(('narodmon.ru', 8283)) # ,        sock.send("#{}\n#{}#{}\n#{}#{}\n##".format(DEVICE_MAC, SENSOR_ID_1, str(temperature)[1:-1], SENSOR_ID_2, str(temperature2)[1:-1])) #  data=sock.recv(1024) sock.close() print data except socket.error, e: print('ERROR! Exception {}'.format(e)) print str(temperature)[1:-1] print str(temperature2)[1:-1] 


Así es como se ve el envío de datos desde dos sensores. Si le da al sensor un nombre que comience con T, entonces el servidor mismo determinará que es un sensor de temperatura.

Ahora necesitamos agregar el sensor a cron. Escribimos: crontab -e y agregamos la siguiente línea allí:

 */10 * * * * sudo python /home/pi/narod.py 

Estamos esperando que se ejecute el script.

Ahora vamos aquí narodmon.ru/ip y vemos si los datos fueron transmitidos. Si todo está en orden, haga clic en el botón "Agregar dispositivo" en la página principal del menú y especifique el MAC. Ahora podemos personalizar todo a gusto (nombre, tipo, ubicación, etc.). Puede hacer público el sensor un día después del inicio de la transmisión del testimonio.

Eso es todo Le deseo buena suerte al conectar sensores. Hágalo más a menudo, porque es muy conveniente desde su casa ver la temperatura de antemano en el lugar donde va.

Nos vemos de nuevo :)

Source: https://habr.com/ru/post/es401313/


All Articles