Dia 17 de Setembro compramos um aquário usado! Compramos pelo Facebook Marketplace, um meio bem bacana de achar muita coisa barata. Montamos o aquário que já veio com quase tudo e estamos ciclando ele antes de colocar qualquer peixe, é meio chato mas vale a pena. Aqui explica bem detalhadamente como se cicla um aquário: Ciclagem.
Para a boa saúde dos peixes uma temperatura constante da água é necessária, mas como monitorar isso sem ficar toda hora indo no aquário fazer a leitura do termômetro? Foi pensando nisso que montei esse projeto simples e barato.
O sensor que eu escolhi é um dos mais comuns e já vem em uma capsula a prova de água:
DS18B20
A ligação desse sensor com o Raspberry Pi foi feita da seguinte forma:
Com isso basta configurar algumas coisas no Rapberry para fazer a leitura do sensor.
Iremos adicionar suporte ao OneWire para fazer a leitura da temperatura.
Adicione a seguinte linha ao arquivo /boot/config.txt
dtoverlay=w1-gpio
E reinicie o Raspberry Pi Zero:
Para se certificar que o sensor foi corretamente reconhecido vá para a pasta /sys/bus/w1/devices/ e confirme que a pasta 28-XXXXX foi criada:
$ cd /sys/bus/w1/devices/
$ ls
28-02079245a4ec w1_bus_master1
Para fazer a leitura da tempeturatura veja o conteudo do arquivo w1_slave dentro da pasta /sys/bus/w1/devices/:
pi@FishTank:/sys/bus/w1/devices $ cd 28-02079245a4ec
pi@FishTank:/sys/bus/w1/devices/28-02079245a4ec $ cat w1_slave
bd 01 55 05 7f 7e 81 66 42 : crc=42 YES
bd 01 55 05 7f 7e 81 66 42 t=27812
Neste momento a temperatura da água é de 27.812 Celsius.
Eu estou usando esse script em Python (/home/pi/temp_snmp.py) para fazer a leitura em Celsius:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import glob
import time
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
def read_temp():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
temp_c = round(temp_c, 2)
# temp_f = temp_c * 9.0 / 5.0 + 32.0
return temp_c
# return temp_f
temp = read_temp()
print temp
Existem diversos sensores de temperatura no mercado, crie um script simples que retorne a temperatura atual.
Para criar a OID (eu esou usando Domotz Pro para me alertar se a temperatura for alta ou baixa demais) instale os pacotes snmp e snmpd:
$sudo apt-get install snmp snmpd
Adicione ao final do arquivo /etc/snmp/snmpd.conf o seguinte:
pass .1.3.6.1.2.1.25.1.7.1 /bin/sh /home/pi/temp_snmp.sh -g
Então crie o script /home/pi/temp_snmp.sh com o seguinte conteúdo:
#!/bin/bash
if [ "$1" = "-g" ]
then
echo .1.3.6.1.2.1.25.1.7.1
echo integer #set the OID as INTEGER
python -u /home/pi/temp_snmp.py
fi
exit 0
Agora pare o serviço snmpd e execute-o com o usuário atual (se algo der errado verifique o arquivo de log errlog.txt):
$sudo service snmpd stop
$snmpd -Lf errlog.txt
E confirme se tudo estiver funcionando como esperado:
$ snmpget -v2c -c public 127.0.0.1 .1.3.6.1.2.1.25.1.7.1
iso.3.6.1.2.1.25.1.7.1 = INTEGER: 28
Como você pode ver, toda vez que eu fizer a leitura do OID .1.3.6.1.2.1.25.1.7.1 ele executará o script e me retornará a leitura do sensor.
Então eu configurei meu Agente Domotz para fazer a leitura da OID e me alertar se ficar muito alto ou baixo:
Dessa forma eu sempre recebe alertas via email ou via push.
Para entender melhor a sintaxe usada no arquivo snmpd.conf consulte a man page (man snmpd.conf).
Se tiver alguma dúvida ou sugestão deixe-a nos comentários.