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.
Jóia Seu artigo, parabéns
ResponderExcluirtenho um Temper, alguma idéia de como usar em Java?
att.
Marco
Oi Marco, jeito tem sim, ele funciona como um dispositivo HID, o problema é saber qual é a sequencia de dados a ser enviada para ele retornar os valores desejados.
ResponderExcluirSugiro que dê uma olhada na classe Temper http://search.cpan.org/CPAN/authors/id/M/MS/MSULLAND/Device-USB-PCSensor-HidTEMPer-0.0201.tar.gz
e faça o port necessário para java...
boa sorte!
[]'s
Victor