Páginas

terça-feira, 19 de outubro de 2010

Termômetro USB – TemperNTC

Fala pessoal….

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
cpan -fi Bundle::CPAN
cpan -fi ExtUtils::MakeMaker
cpan -fi Inline::MakeMaker
cpan -fi Device::USB
cpan -fi Device::USB::PCSensor::HidTEMPer
Esse processo leva alguns minutos, responda todas as perguntas das instalações com as respostas padrão (tecle enter)

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 é:
# ./termometro
Termometro Interno: 21.12 C
Termometro Externo: 25.02 C
Para quem comprou o Temper, é só utilizar a função internal, as funções external não devem ser utilizadas.

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
/etc/init.d/munin-node restart
A saída do gráfico fica assim:



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.
Dúvidas, sugestões, enviem um e-mail para: 

2 comentários:

  1. Jóia Seu artigo, parabéns
    tenho um Temper, alguma idéia de como usar em Java?

    att.
    Marco

    ResponderExcluir
  2. 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.

    Sugiro 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

    ResponderExcluir