Sensor de temperatura SNMP con Raspberry y Cacti
Actualizado 31-8-2015: Por problemas en la sd, he tenido que seguir los pasos, y he de apuntar que he tenido que usar la versión de raspbian «2013-09-25-wheezy-raspbian», con la ultima disponible tenia que comenzar todo de nuevo, y no apetecía.
También apuntar que las librerias DHT estan ya anticuadas, pero cumple mis necesidades.
Hoy me toca apuntarme como ha sido los pasos hasta llegar a tener lo que realmente necesitaba.
Monitorizar la temperatura y humedad en nuestro Cacti.
Intentare recopilar y traducir todos los pasos que he tenido que dar, de los cuales la mayoría han sido guiados por DJs Attempt y Adafruit
Lo primero, materiales y conexión.
Anteriormente use un DHT11, en esta ocasión he optado por un DHT22, que acababa de recibir.
Para mi proyecto no ha merecido la pena el desembolso extra pero tenia curiosidad.
1xDHT22
1xResistencia 10K
1x Raspberry Pi con raspbian wheezy corriendo y con el ssh habilitado (por comodidad xD)
Lo conectamos tal que así:
Y empezamos con la parte software:
Seguramente ya lo tengáis instalado pero mejor prevenir
sudo apt-get install git-core build-essential |
Descargamos el código desde github y entramos en el directorio
git clone git://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git cd Adafruit-Raspberry-Pi-Python-Code cd Adafruit_DHT_Driver |
Ahora vamos a probar que lea los valores desde el sensor, que esta conectado en el pin GPIO #4 (el pin 7 de la raspberry)
Escribimos
sudo ./Adafruit_DHT 2302 4 |
Donde 2302 es el tipo de sensor (DHT22)
y 4 es el ping GPIO donde esta conectado.
Nos devolverá la temperatura y humedad en una misma línea.
Hasta aquí todo bien, pero necesitamos que nos de los valores por separado y así poder guardarlos en un archivo.
Y para eso necesitamos modificar el código y compilar de nuevo. Para esto he seguido los pasos de DJs Attempt.
Modificando y compilando:
Descargar la librería BCM2835
wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.25.tar.gz tar -zxvf bcm2835-1.25.tar.gz cd bcm2835-1.25 ./configure make sudo make install |
Vamos a editar el archivo Adafruit_DHT.c que esta dentro del directorio Adafruit_DHT_Driver
sudo nano Adafruit_DHT.c |
Comentar la linea 65
1 | //printf("Using pin #%d\n", dhtpin); |
la linea 127
1 | //printf("Data (%d): 0x%x 0x%x 0x%x 0x%x 0x%x\n", j, data[0], data[1], data[2], data[3], data[4]); |
y la linea 142
1 | //printf("Temp = %.1f *C, Hum = %.1f \%\n", f, h); |
Y para grados celsius añadimos:
1 2 | printf("%.0f\n", f); printf("%.0f\n", h); |
compilamos y ejecutamos (yo he preferido cambiar el nombre por Adafruit_DHT2 y conservar el original)
gcc Adafruit_DHT.c -l bcm2835 -std=gnu99 -o Adafruit_DHT2 |
sudo ./Adafruit_DHT2 2302 4 |
Y nos devolverá la temperatura y humedad en lineas diferentes
Ahora vamos a mandar la lectura a un archivo y posteriormente separarlas para poder enviar los datos recogidos mediante snmp.
Usare mismos nombres y rutas que el blog de DJs, asi que nos movemos a:
/var/scripts
y creamos un archivo llamado getboth.sh con el siguiente contenido
#!/bin/sh sudo /home/pi/Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver/Adafruit_DHT2 2302 4 > /home/pi/both.txt while [ ! -s "/home/pi/both.txt" ] do sleep 5 sudo /home/pi/Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver/Adafruit_DHT2 2302 4 > /home/pi/both.txt done sed '1d' /home/pi/both.txt > /home/pi/humid.txt sed '2d' /home/pi/both.txt > /home/pi/temp.txt |
Esto se encargara de crearnos en el directorio /home/pi el archivo both.txt con la temperatura y humedad en lineas diferentes.
Y a su vez, nos creara archivos independientes donde uno tendrá solo la temperatura, y otro solo la humedad.
No olvidar dar permisos de ejecucion a todos los scripts: sudo chmod +x nombre
Ahora vamos a añadirlo al cron para que se ejecute cada minuto.
sudo crontab -e |
y añadimos al final
* * * * * /var/scripts/getboth.sh |
Verificamos que cree los archivos y que estos tengan datos :D
Empezamos con la parte del SNMP
No controlo tanto, del tema así que las pruebas primero las hice en local y para eso necesitamos el cliente snmp también,
sudo apt-get install snmp snmpd |
Nos dirigimos a /usr/local/bin y vamos a crear 2 scripts mas que nos permitirán enviar mediante snmp el contenido de los archivos anteriores.
Para la humedad
sudo nano humid |
y pegamos:
#!/bin/bash echo .1.3.6.1.2.1.25.1.8.1 echo gauge cat /home/pi/humid.txt |
Para la temperatura
sudo nano temp |
y pegamos:
#!/bin/bash echo .1.3.6.1.2.1.25.1.8.2 echo gauge cat /home/pi/temp.txt |
Damos permisos para poder ejecutarlos.
sudo chmod +x humid sudo chmod 755 humid sudo chmod +x temp sudo chmod 755 temp |
comprobamos que funcionen ejecutándolos a mano, yo para ello he duplicado los archivos y les he puesto su extension .sh
sudo ./humid.sh |
Y ahora nos toca editar la configuración del snmpd
sudo nano /etc/snmp/snmpd.conf |
En el he realizado los siguientes cambios:
Comentado las lineas
#agentAddress udp:127.0.0.1:161 #agentAddress udp:161,udp6:[::1]:161 |
Y añadido
agentAddress udp:161 |
Añadido
rocommunity public IPQUEPERMITOLEERLAINFORMACION |
Comentado
#rocommunity public default -V systemonly |
Y en el apartado EXTENDING THE AGENT añadido los OIDS que usare (los mismos que hemos usado en los scripts anteriores)
pass .1.3.6.1.2.1.25.1.8.2 /bin/sh /usr/local/bin/temp pass .1.3.6.1.2.1.25.1.8.1 /bin/sh /usr/local/bin/humid |
Guardamos los cambios y reiniciamos el servicio.
sudo service snmpd restart |
Comprobamos que funcione desde la propia maquina
snmpget -c public -v1 localhost .1.3.6.1.2.1.25.1.8.1 |
y
snmpget -c public -v1 localhost .1.3.6.1.2.1.25.1.8.2 |
La misma prueba la hacemos desde la maquina que tengamos añadida en el snmpd.conf y el resultado tiene que ser el mismo.
Una vez podamos ver los datos desde otra maquina, ya es cosa de configurar el cacti, que para empezar yo cree los gráficos con el template SNMP – Generic OID Template
añadiendo los OIDS, en cada gráfica.
Luego he ya le he creado un template que estoy probando, pues es el primero que he creado y no se muy bien como lo he hecho XD.
Este es el resultado:
Y con esto, espero saber volver a hacerlo, aunque voy a subir el código modificado, y los ejecutables por si acaso xD raspbsnmpTEMP
Aquí dejo el template, dentro lleva un archivo con las instrucciones, y también lo dejo escrito en este post.
Nota: He puesto comentar linea X, es muy probable que no coincidan, con buscar el texto a comentar no hay que ir buscando numero de lineas.
Nota2: He editado el código para que muestre decimales, el problema es que no lo recibo por snmp, si lo consigo, editare con los cambios.
[…] « Sensor de temperatura SNMP con Raspberry y Cacti […]