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: 

quarta-feira, 13 de outubro de 2010

Instalando o Debian via pendrive

Fala pessoal…..

Esses dias fui fazer um setup em um server e estava sem mídias (mentira, eu quebrei um cd-rw que funcionava, sem querer :p ). Qual a solução mais simples?

Utilizar uma instalação via internet, o NETINST do Debian.

Após uma olhada rápida no site do Debian achei a solução, rápida e simples!
O que você irá precisar?
  • Um pendrive >= a 256 mb
  • Uma máquina linux
  • Imagem iso do Debian netinst

Passo 1

Você irá precisar da imagem de boot do sistema, o debian fornece isso aqui:
Para sistemas i386 (32 bits) ou amd64 (64bits)
Os arquivos tem em média 20 mb


Passo 2

Download da imagem iso do netinst
Sistemas i386 (32 bits) ou amd64 (64bits)
Os arquivos tem 150 mb e 130 mb (valores arredondados)


Passo 3


ATENÇÃO TODOS OS SEUS DADOS DO PENDRIVE SERÃO DELETADOS APÓS ESSES COMANDOS!! ATENÇÃO!!

Descompacte a imagem no pendrive

Para isso, descubra onde o seu pendrive foi detectado, duas formas de se fazer isso:
fdisk -l
dmesg

Eu prefiro usar o fdisk -l, é mais simples de se identificar o dispositivo (localize-o pelo tamanho)

Nesse exemplo, irei usar o dispositivo em /dev/sdc, tenha certeza que é o dispositivo correto, caso contrário vc irá apagar informações de outros dispositivos, e isso não é legal

Execute o comando:
zcat boot.img.gz > /dev/sdc

Feito isso, monte o pendrive e copie o iso do netinst para o pendrive
mount /dev/sdc /mnt
cp netinst.iso /mnt
umount /dev/sdc

Feito isso é só dar boot na máquina e setar a opção de boot para o usb.
Qualquer dúvida/sugestão ou qualquer outra coisa, enviem um e-mail para: