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.