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 Raspberry 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: 

$ init 6

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 temperatura veja o conteúdo 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 recebo alertas via email ou via push. Eu vou preparar mais um passo a passo pra receber alertas via Telegram.

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.