Recentemente comprei um termômetro USB para ver até onde conseguiria chegar com ele.
Comprei esse termômetro no ebay (paguei algo em torno de R$ 15,00) mas é encontrado facilmente nesses sites de compras chineses fica a dica.
Em um primeiro momento após pesquisar um pouco, encontrei um código na internet, mas ele tinha um problema, era escrito para o termômetro Temper que só tem um sensor de temperatura.
O TemperNTC, tem um “rabicho” (termômetro externo) com um sensor de temperatura extra, assim você consegue fazer duas medições em locais distintos.
Temper
TemperNTC
Partindo dai, iniciei minha pesquisa sobre como fazer-lo funcionar no linux, depois de algumas googladas, achei um módulo do Perl que tem suporte para ambos Temper, porém era necessário transformar a saída do módulo em alguma coisa funcional.
A saída do lsusb dele é:
Bus 003 Device 013: ID 1130:660c Tenx Technology, Inc.
Preparando para utilizar o termômetro
Para o módulo ser instalado corretamente, algumas dependências são necessárias, portanto instale:
aptitude install libusb-dev
Depois instale o CPAN e os módulos necessários
Esse processo leva alguns minutos, responda todas as perguntas das instalações com as respostas padrão (tecle enter)cpan -fi Bundle::CPAN cpan -fi ExtUtils::MakeMaker cpan -fi Inline::MakeMaker cpan -fi Device::USB cpan -fi Device::USB::PCSensor::HidTEMPer
Feito isso, já é possível retirar alguns dados do termômetro.
Crie um arquivo com o seguinte conteúdo:
#! /usr/bin/perl use 5.010; use strict; use warnings; use Carp; use Device::USB; use Device::USB::PCSensor::HidTEMPer::Device; use Device::USB::PCSensor::HidTEMPer::NTC; use Device::USB::PCSensor::HidTEMPer::TEMPer; use lib; use Device::USB::PCSensor::HidTEMPer; my $pcsensor = Device::USB::PCSensor::HidTEMPer->new(); my @devices = $pcsensor->list_devices(); my $interno_grande = $devices[0]->internal()->celsius(); my $externo_grande = $devices[0]->external()->celsius(); my $interno = substr $interno_grande, 0, 5; my $externo = substr $externo_grande, 0, 5; printf "Termometro Interno: $interno C\n"; printf "Termometro Externo: $externo C\n";
Salve o arquivo, dê permissão de execução, a saída desse pequeno código é:
Para quem comprou o Temper, é só utilizar a função internal, as funções external não devem ser utilizadas.# ./termometro Termometro Interno: 21.12 C Termometro Externo: 25.02 C
Legal, mas para mim isso ainda não é o suficiente. Gostaria de gerar alguns gráficos disso, é possível? SIM!
Como utilizo o Munin para fazer a geração dos gráficos da minha rede, resolvi escrever um plugin que faz a captura dos dados e coloca-los tudo em um único gráfico.
Preparando o ambiente para executar o script
1 – Instalar o munin e o sudo
aptitude install munin munin-node sudo
Com tudo instalado, já é possível ver localmente os gráficos, se você tem um web server instalado, ele estará disponível em http://seuwebserver/munin
2 – Configurar o sudo
Execute o comando:
visudo
No final do arquivo, adicione a seguinte linha:
nobody ALL=(root) NOPASSWD:/usr/local/bin/temper_run.pl
3 – Criar os arquivos
Crie o arquivo temper em /usr/share/munin/plugins e insira o seguinte conteúdo:
#!/bin/bash sudo /usr/local/bin/temper_run.pl $1
Crie o arquivo temper_run.pl em /usr/local/bin com o seguinte conteúdo:
#!/usr/bin/perl # Script to monitor ambient temperature using the TemperNTC # Writen by Victor Sartori 10/10 - victor (NoS Pa M) sartori (d o t ) eti [d o t] br # Version 0.2.1 # Some notes: # All values in Celsius, if you wanna use it in fahrenheit, change the conversion function to fahrenheit on line 50 and 51 use strict; use Carp; use Device::USB; use Device::USB::PCSensor::HidTEMPer::Device; use Device::USB::PCSensor::HidTEMPer::NTC; use Device::USB::PCSensor::HidTEMPer::TEMPer; use lib; use Device::USB::PCSensor::HidTEMPer; if ("$ARGV[0]" eq "autoconf") { printf "yes\n"; exit 0; } if ("$ARGV[0]" eq "config") { my $LOAD_WARN="28"; my $LOAD_CRIT="32"; print "graph_title Temperature\n"; print "graph_args --base 1000 -l 0\n"; print "graph_vlabel Temperature\n"; print "graph_scale no\n"; print "graph_category system\n"; print "temperE.label External temperature in Celsius\n"; print "temperE.warning $LOAD_WARN\n"; print "temperE.critical $LOAD_CRIT\n"; print "temperI.label Internal temperature in Celsius\n"; print "temperI.warning $LOAD_WARN\n"; print "temperI.critical $LOAD_CRIT\n"; print "graph_info Temperature.\n"; print "temper.info Average temperature.\n"; exit 0; } my $pcsensor = Device::USB::PCSensor::HidTEMPer->new(); my @devices = $pcsensor->list_devices(); my $internal_big = $devices[0]->internal()->celsius(); my $external_big = $devices[0]->external()->celsius(); # This is a workarround becouse the external value shows so much decimal values. my $internal = substr $internal_big, 0, 5; my $external = substr $external_big, 0, 5; print "temperI.value $internal\n"; print "temperE.value $external\n";
Dê permissão de execução para os dois arquivos, reinicie o munin-node
A saída do gráfico fica assim:/etc/init.d/munin-node restart
Alguns Problemas:
- O termômetro ficou com o sensor interno desrregulado, ele marcava sempre 75 ou 110, resolvi colocando em uma máquina windows, instalando o software que vem junto e alterando a parte de calibração para 0, ele voltou a marcar a temperatura normalmente.
- O plugin não rodava direto no munin-node, descobri que é necessário ter privilégios de root para acessar o dispositivo, por isso existe dois scripts e a configuração do sudo.
- Estou escrevendo um script para o nagios também, assim que ele estiver pronto faço um novo post aqui.
- O fonte do script do munin está em inglês, porque irei posta-lo no munin-exchange.
- Quem for um programador perl e souber como faço isso sem o sudo, fico grato se me explicar, não tenho muita experiencia com perl.