Tabla de contenido:

Monitoreo casero de bricolaje con RaspberryPi y Cloud4Rpi: 5 pasos
Monitoreo casero de bricolaje con RaspberryPi y Cloud4Rpi: 5 pasos

Video: Monitoreo casero de bricolaje con RaspberryPi y Cloud4Rpi: 5 pasos

Video: Monitoreo casero de bricolaje con RaspberryPi y Cloud4Rpi: 5 pasos
Video: TODO ESTO PUEDES HACER CON UNA RASPBERRY PI 😈💻 2024, Noviembre
Anonim
Monitoreo casero de bricolaje con RaspberryPi y Cloud4Rpi
Monitoreo casero de bricolaje con RaspberryPi y Cloud4Rpi

Un fin de semana de invierno fui a mi casa de campo y descubrí que allí hacía mucho frío. Algo había sucedido con la electricidad y el disyuntor RCD lo había apagado, y la calefacción también se apagó. Tuve suerte de llegar allí, de lo contrario en varios días todo se habría congelado, lo cual es muy malo para las tuberías y los radiadores.

Tenía varias Raspberry Pi y un sensor térmico, así que pensé: ¿por qué no hago un dispositivo de monitoreo simple? Las instrucciones a continuación asumen que tiene una Raspberry Pi con Raspbian y una conexión de red configurada. En mi caso, es Raspberry Pi B + con Raspbian (2018–06–27-raspbian-stretch-lite).

Paso 1: monitoreo de temperatura

Monitoreo de temperatura
Monitoreo de temperatura
Monitoreo de temperatura
Monitoreo de temperatura

¿Cómo conectar un sensor de temperatura DS18B20? Solo busca en Google cómo hacer esto y verás muchas imágenes como esta:

En mi caso tenía cables negros, amarillos y rojos. El negro es tierra, va al pin de tierra, el rojo es potencia - va al pin 3.3v y el amarillo es datos - debe ir al pin GPIO4, con una resistencia de 4.7 kOm conectada entre datos y energía. en paralelo (son digitales y tienen diferentes direcciones), solo necesita una resistencia. Después de conectar su sensor, debe habilitar 1Wire en raspi-config:

sudo raspi-config

Vaya a 5 opciones de interfaz, habilite P7 1-Wire y reinicie.

Luego puede probar si puede ver el sensor:

sudo modprobe w1-gpiosudo modprobe w1-thermls / sys / bus / w1 / devices /

Debería ver algo como esto:

pi @ vcontrol: ~ $ ls / sys / bus / w1 / devices / 28–00044eae2dff w1_bus_master1

28–00044eae2dff es nuestro sensor de temperatura.

El hardware está listo. Ahora necesito configurar la parte de monitoreo. Necesito algo que me muestre los datos y me notifique si el dispositivo está desconectado por un tiempo o no hay energía, o la temperatura es baja. Obviamente, esto no puede ser raspberry pi en sí, debería haber algún servidor o servicio en Internet que monitoree mi dispositivo.

Puedo crear un servidor simple, conseguir un alojamiento y configurar todo, pero sinceramente, no quiero. Afortunadamente, alguien ya pensó en esto y creó cloud4rpi.io, un panel de control en la nube para su dispositivo.

Paso 2: Configurar Cloud4Rpi.io

Configuración de Cloud4Rpi.io
Configuración de Cloud4Rpi.io

Cloud4Rpi proporciona un servicio que permite que su dispositivo envíe y reciba datos utilizando protocolos MQTT o HTTP. Tienen una biblioteca cliente para Python, así que usaré Python.

Los ejemplos de Python que vienen con el servicio Cloud4Rpi ya contienen código para el sensor de temperatura DS18B20.

Así que fui a https://cloud4rpi.io, creé una cuenta y agregué un nuevo dispositivo allí. La página del dispositivo tiene un token, una cadena que identifica el dispositivo y que debe especificarse en el programa que envía los datos.

Para empezar, siempre es una buena idea actualizar un administrador de paquetes y actualizar los paquetes (nota: puede llevar horas si no ha actualizado durante un tiempo):

sudo apt-get update && sudo apt-get upgrade

Luego, instale git, Python y su administrador de paquetes Pip:

sudo apt-get install git python python-pip

Luego, instale la biblioteca Python de cloud4rpi:

sudo pip instalar cloud4rpi

Finalmente, estoy listo para escribir mi programa de control. Empiezo con el ejemplo disponible en

clon de git https://github.com/cloud4rpi/cloud4rpi-raspberrypi… cloud4rpicd cloud4rpi

El archivo principal del programa es control.py; necesito modificarlo según mis necesidades. Primero, edite el programa y pegue un token:

sudo nano control.py

Busque una línea DEVICE_TOKEN = '…'] y especifique un token de dispositivo allí. Después de eso, simplemente puedo ejecutar el programa: funciona e informa una temperatura en la variable RoomTemp:

sudo python control.py

Funciona y reporta una temperatura en la variable RoomTemp.

Tenga en cuenta que descubre todos los sensores onewire ds18b20

ds_sensors = ds18b20. DS18B20.find_all ()

y usa el primer sensor encontrado:

RoomTemp ': {' type ':' numeric ',' bind ': ds_sensors [0] if ds_sensors else None}

Ok, eso fue fácil, porque el programa de muestra tiene todo lo que se requiere para trabajar con el sensor ds18b20 en Raspberry Pi. Ahora necesito encontrar la manera de informar el estado de la energía.

Paso 3: Monitoreo de UPS

Monitoreo de UPS
Monitoreo de UPS

Lo siguiente que quiero monitorear es el estado del UPS, por lo que si hay un corte de energía, lo sabré antes de que todo se desconecte.

Tengo un SAI de APC con control USB, así que busqué en Google rápidamente y descubrí que necesitaba apcupsd. https://www.anites.com/2013/09/monitoring-ups.html … Intenté varias veces instalarlo a través de apt-get, y no me funcionaba por varias razones. Le mostraré cómo instalarlo desde las fuentes.

wget https://sourceforge.net/projects/apcupsd/files/ap…tar xvf apcupsd-3.14.14.tar.gz cd apcupsd-3.14.14./configure --enable-usb sudo make sudo make install

Luego edito apcupsd.conf para conectarme a mi UPS a través de usb.

sudo nano /etc/apcupsd/apcupsd.conf# #UPSCABLE smart UPSCABLE usb # #UPSTYPE apcsmart #DEVICE / dev / ttyS0 UPSTYPE usb DEVICE

Ahora puedo conectar el cable USB de UPS a RaspberryPi y probar si se encuentra UPS.

sudo apctest

No debería darle ningún mensaje de error.

Ahora se debe iniciar el servicio apcupsd:

sudo systemctl start apcupsd

Para silenciar el estado del UPS, puedo usar un comando de estado:

sudo /etc/init.d/apcupsd estado

Y daría como resultado algo como esto:

APC: 001, 035, 0855FECHA: 2018-10-14 16:55:30 +0300 HOSTNAME: vcontrol VERSIÓN: 3.14.14 (31 de mayo de 2016) debian UPSNAME: vcontrol CABLE: Cable USB CONTROLADOR: USB UPS Driver UPSMODE: Stand Alone HORA DE INICIO: 2018-10-14 16:54:28 +0300 MODELO: Back-UPS XS 650CI ESTADO: LÍNEA EN LÍNEA V: 238.0 Voltios PCT DE CARGA: 0.0 Por ciento BCHARGE: 100.0 Por ciento TIEMPO DE EJECUCIÓN: 293.3 Minutos MBATTCHG: 5 Por ciento MINTIMEL: 3 Minutos TIEMPO MÁXIMO: 0 Segundos SENTIDO: Medio LOTRANS: 140.0 Voltios HITRANS: 300.0 Voltios ALARMDEL: 30 Segundos BATTV: 14.2 Voltios LASTXFER: Sin transferencias desde el encendido NUMXFERS: 0 TONBATT: 0 Segundos CUMONBATT: 0 Segundos XOFFBATT: NATT / AXNOX STATFLAG: 300014IAL: 2014-06-10 NOMINV: 230 Voltios NOMBATTV: 12.0 Voltios NOMPOWER: 390 Watts FIRMWARE: 892. R3. I USB FW: R3 END APC: 2018-10-14 16:55:38 +0300

Necesito un estado, que es la línea "ESTADO:".

La biblioteca de Cloud4rpi contiene un módulo "rpy.py" que devuelve los parámetros del sistema Raspberry Pi, como el nombre de host o la temperatura de la CPU. Dado que todos esos parámetros son el resultado de ejecutar algunos comandos y analizar la salida, también contiene una práctica función "parse_output" que hace exactamente lo que necesito. Así es como puedo obtener el estado de mi UPS:

def ups_status (): result = rpi.parse_output (r'STATUS / s +: / s + (S +) ', [' /etc/init.d/apcupsd ',' status ']) if result: return result else: return 'DESCONOCIDO'

Para enviar este estado a cloud4rpi, necesito declarar una variable UPSStatus y vincularla a mi función ups_status: Ahora puedo ejecutar mi programa:

variables = {'RoomTemp': {'type': 'numeric', 'bind': ds_sensors [0]}, 'UPSStatus': {'type': 'string', 'bind': ups_status}}

Y puedo ver inmediatamente mi variable en la página del dispositivo cloud4rpi.

Paso 4: preparación para la "producción"

Preparándose para la "producción"
Preparándose para la "producción"

Todo está funcionando y ahora necesito preparar mi dispositivo para el modo desatendido.

Para empezar, voy a ajustar los intervalos de tiempo. El intervalo de encuesta define la frecuencia con la que el programa verifica la temperatura y el estado del UPS; configúrelo en un segundo.

Los resultados se envían a la nube cada 5 minutos y la información de diagnóstico, cada hora.

# ConstantsDATA_SENDING_INTERVAL = 300 # seg DIAG_SENDING_INTERVAL = 3600 # seg POLL_INTERVAL = 1 # seg

Cuando cambia el estado de UPS, no quiero que mi dispositivo espere 5 minutos y envío datos de inmediato. Así que modifiqué ligeramente el bucle principal y se ve así:

data_timer = 0diag_timer = 0 prevUPS = 'ONLINE' while True: newUPS = ups_status () if (data_timer <= 0) o (newUPS! = prevUPS): device.publish_data () data_timer = DATA_SENDING_INTERVAL prevUPS = newUPS si diag_timer <= 0 device.publish_diag () diag_timer = DIAG_SENDING_INTERVAL sleep (POLL_INTERVAL) diag_timer - = POLL_INTERVAL data_timer - = POLL_INTERVAL

Prueba: ejecutar script:

sudo python control.py

Y puedo ver el estado de UPS en la página de mi dispositivo.

Si apago el UPS, el estado cambia en un par de segundos, entonces todo está funcionando. Ahora necesito iniciar apcupsd y mi control.py en el inicio del sistema. El servicio Apcupsd es antiguo y para iniciarlo en raspbian moderno, debería modificar el archivo /etc/init.d/apcupsd, agregando estas líneas en algún lugar en la parte superior:

### BEGIN INIT INFO # Proporciona: apcupsd # Required-Start: $ all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: # Breve descripción: APC UPS daemon… ### END INIT INFO #

Luego habilite el servicio:

sudo systemctl habilitar apcupsd

Luego inicie el servicio:

sudo systemctl start apcupsd

Ahora apcupsd se iniciará en el inicio del sistema.

Para instalar control.py como servicio, utilicé el script service_install.sh proporcionado:

sudo bash service_install.sh ~ / cloud4rpi / control.py

Ahora se inicia el servicio y debe sobrevivir a un reinicio.

Paso 5: Configuración de un panel de control

Configuración de un panel de control
Configuración de un panel de control

Cloud4rpi me permite configurar un panel de control para mi dispositivo. Puede agregar "widgets" y vincularlos a variables de dispositivo.

Mi dispositivo proporciona dos variables de solo lectura: RoomTemp y UPSStatus:

variables = {'RoomTemp': {'type': 'numeric', 'bind': ds_sensors [0]}, 'UPSStatus': {'type': 'string', 'bind': ups_status}}

Agregué 3 widgets: Number para RoomTemp, Text para UPSStatus y un gráfico para RoomTemp.

Puedo configurar alertas, por lo que recibo un correo electrónico cuando la temperatura está fuera del rango especificado, el UPS se desconectó o el dispositivo en sí no envía datos cuando debería. Ahora puedo estar seguro de que mi casa de campo está bien y puedo ser notificado cuando algo anda mal, así puedo llamar a los vecinos y pedirles que comprueben lo que está pasando. Aquí está el código real del control.py.

Recomendado: