segunda-feira, 14 de setembro de 2015

Monitoramento de tensão - SNMP + Zabbix

Olá pessoal!

Depois de um bom tempo sem postagens o blog volta com novidades! Dando continuidade ao projeto de monitoramento de tensão hoje veremos como implementar SNMP com Agentuino neste projeto e monitorá-lo através do Zabbix da mesma forma como fizemos com o circuito de monitoramento de temperatura.
O que precisaremos para implementar SNMP? Antes de mais nada precisamos acrescentar um Shield Ethernet W5100 ao nosso projeto, configurar a rede e conectá-lo. Uma vez acrescentado o Shield Ethernet W5100, vamos ao código:

A única coisa que mudou em relação ao SNMP Agentuino do projeto de monitoramento de temperatura foi a variável tensao que será disponibilizada via SNMP para a leitura pelo agente SNMP Zabbix.


#include <Wire.h> 
#include <SPI.h>
#include <Ethernet.h>
#include <Agentuino.h> 

static byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0x0D }; 

EthernetClient client;

static const char sysDescr[20] PROGMEM     = "1.3.6.1.2.1.1.1.0";  // read-only  (DisplayString)

// .iso.org.dod.internet.mgmt.mib-2.system.sysObjectID (.1.3.6.1.2.1.1.2)
static const char sysObjectID[20] PROGMEM   = "1.3.6.1.2.1.1.2.0";  // read-only  (ObjectIdentifier)

// .iso.org.dod.internet.mgmt.mib-2.system.sysUpTime (.1.3.6.1.2.1.1.3)
static const char sysUpTime[20] PROGMEM     = "1.3.6.1.2.1.1.3.0";  // read-only  (TimeTicks)

// .iso.org.dod.internet.mgmt.mib-2.system.sysContact (.1.3.6.1.2.1.1.4)
static const char sysContact[20] PROGMEM    = "1.3.6.1.2.1.1.4.0";  // read-write (DisplayString)

// .iso.org.dod.internet.mgmt.mib-2.system.sysName (.1.3.6.1.2.1.1.5)
static const char sysName[20] PROGMEM       = "1.3.6.1.2.1.1.5.0";  // read-write (DisplayString)

// .iso.org.dod.internet.mgmt.mib-2.system.sysLocation (.1.3.6.1.2.1.1.6)
static const char sysLocation[20] PROGMEM   = "1.3.6.1.2.1.1.6.0";  // read-write (DisplayString)

// .iso.org.dod.internet.mgmt.mib-2.system.sysServices (.1.3.6.1.2.1.1.7)
static const char sysServices[20] PROGMEM   = "1.3.6.1.2.1.1.7.0";  // read-only  (Integer)

// Arduino defined OIDs
// .iso.org.dod.internet.private (.1.3.6.1.4)
// .iso.org.dod.internet.private.enterprises (.1.3.6.1.4.1)
// .iso.org.dod.internet.private.enterprises.arduino (.1.3.6.1.4.1.36582)
// .iso.org.dod.internet.private.enterprises.arduino.value.valA0-A5 (.1.3.6.1.4.1.36582.3.1-6)
/*
static const char valA0[] PROGMEM   = "1.3.6.1.4.1.36582.3.1.0";  // read-only  (Integer)

static const char valA1[] PROGMEM   = "1.3.6.1.4.1.36582.3.2.0";  // read-only  (Integer)

// .iso.org.dod.internet.private.enterprises.arduino.value.valD0-D13 (.1.3.6.1.4.1.36582.3.7-20)
static const char valD0[] PROGMEM   = "1.3.6.1.4.1.36582.3.7.0";  // read-only  (Integer)

static const char valD1[] PROGMEM   = "1.3.6.1.4.1.36582.3.8.0";  // read-only  (Integer)
*/
static const char tensao[24] PROGMEM = "1.3.6.1.4.1.36582.3.5.0";  // read-only  (Integer)


static char locDescr[20] = "Agentuino";

static char locObjectID[20] = "1.3.6.1.4.1.36582";
static uint32_t locUpTime = 0;
static char locContact[20] = "Eric Gionet";
static char locName[20] = "Agentuino";
static char locLocation[20] = "Nova Scotia, CA";
static int32_t locServices = 7;
boolean loctensao = 0; 
boolean statustensao = 0;

//uint32_t prevMillis = millis();
uint32_t dispMillis = 0;


char oid[SNMP_MAX_OID_LEN];
SNMP_API_STAT_CODES api_status;
SNMP_ERR_CODES status;


byte LEDNORMAL = 3; //pino do Led verde (ENERGIA NORMAL)
byte LEDFALTA = 4; //pino do Led vermelho (FALTA DE ENERGIA)

volatile unsigned long contador; //variável controlada através da interrupção na porta 2 

void pduReceived()
{
  SNMP_PDU pdu;
  Serial.println("UDP Packet Received...");
  api_status = Agentuino.requestPdu(&pdu);
  if ( (pdu.type == SNMP_PDU_GET || pdu.type == SNMP_PDU_GET_NEXT || pdu.type == SNMP_PDU_SET)
    && pdu.error == SNMP_ERR_NO_ERROR && api_status == SNMP_API_STAT_SUCCESS ) {
    pdu.OID.toString(oid);
    Serial.print("OID = ");
    Serial.println(oid);
    
    if ( pdu.type == SNMP_PDU_SET ) {
      status = SNMP_ERR_READ_ONLY;
    } else if ( strcmp_P(oid, sysDescr ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locDescr);
    } else if ( strcmp_P(oid, sysUpTime ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_TIME_TICKS, locUpTime);
    } else if ( strcmp_P(oid, sysName ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locName);
    } else if ( strcmp_P(oid, sysContact ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locContact);
    } else if ( strcmp_P(oid, sysLocation ) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locLocation);
    } else if ( strcmp_P(oid, sysServices) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_INT, locServices);
     } else if ( strcmp_P(oid, sysObjectID) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_OCTETS, locObjectID);
    } else if ( strcmp_P(oid, tensao) == 0 ) {
      status = pdu.VALUE.encode(SNMP_SYNTAX_INT, loctensao);
    
    } else {
      status = SNMP_ERR_NO_SUCH_NAME;
    }
    pdu.type = SNMP_PDU_RESPONSE;
    pdu.error = status;
    Agentuino.responsePdu(&pdu);
  }
  Agentuino.freePdu(&pdu);
  
}

void setup() {
     Ethernet.begin(mac);
     pinMode(LEDNORMAL, OUTPUT);
     digitalWrite (LEDNORMAL, LOW);
     pinMode(LEDFALTA, OUTPUT);
     digitalWrite(LEDFALTA, LOW);

     pinMode(2,INPUT); //porta 2 que detecta se está em estado alto ou baixo
     digitalWrite(2,LOW);  
     contador = 0;
     attachInterrupt(0, detect, RISING); //a interrupção 0 utiliza a porta 2 para atender a interrupção e caso haja a interrupção chama a função detect na subida do estado (LOW para HIGH)

    api_status = Agentuino.begin();

    if ( api_status == SNMP_API_STAT_SUCCESS ) {
          Agentuino.onPduReceive(pduReceived);
          delay(10);
          Serial.println("SNMP Agent Initiated...");
          return;
     } 
     else
     {
          delay(10);
          Serial.print("SNMP Agent failed!");
      }

}

void loop() {
  unsigned long contador_loop = contador; 
  unsigned long tempo = millis()+100; 
  while (tempo > millis()); 
  if (contador > contador_loop) //se chamar a interrupção detect contador ficará maior que contador_loop
  {
     digitalWrite(LEDNORMAL, HIGH); //se tiver tensão no circuito acende Led Verde
     digitalWrite(LEDFALTA, LOW); //se tiver tensão no circuito apaga Led vermelho
     statustensao = 1;
  }
  else
  {
     contador = 0;
     digitalWrite(LEDFALTA, HIGH); //se não tiver tensão no circuito acende Led vermelho
     digitalWrite(LEDNORMAL, LOW); //se não tiver tensão no circuito apaga Led verde   }
     statustensao = 0;
  }
  Agentuino.listen();
  loctensao = statustensao;  
}

void detect() {
   contador++; 
}

Com isso basta configurar o Zabbix para ler via SNMP a variável tensao e acionar uma trigger se o valor for igual a zero (falta tensão).

Configuramos um gráfico para visualizar:




Pessoal, por enquanto é só. Quaisquer dúvidas estamos aqui. No próximo post iniciaremos um novo projeto.


sábado, 25 de abril de 2015

Monitoramento de tensão - código

Olá pessoal,

Continuando o projeto de monitoramento de tensão vamos ao código:

byte LEDNORMAL = 3; //pino do Led verde (ENERGIA NORMAL)
byte LEDFALTA = 4; //pino do Led vermelho (FALTA DE ENERGIA)

volatile unsigned long contador; //variável controlada através da interrupção na porta 2

void setup() {
     pinMode(LEDNORMAL, OUTPUT);
     digitalWrite (LEDNORMAL, LOW);
     pinMode(LEDFALTA, OUTPUT);
     digitalWrite(LEDFALTA, LOW);

     pinMode(2,INPUT); //porta 2 que detecta se está em estado alto ou baixo
     digitalWrite(2,LOW); 
     contador = 0;
     attachInterrupt(0, detect, RISING); //a interrupção 0 utiliza a porta 2 para atender a interrupção e caso haja a interrupção chama a função detect na subida do estado (LOW para HIGH)
}

void loop() {
  unsigned long contador_loop = contador;
  unsigned long tempo = millis()+100;
  while (tempo > millis());
  if (contador > contador_loop) //se chamar a interrupção detect contador ficará maior que contador_loop
  {
     digitalWrite(LEDNORMAL, HIGH); //se tiver tensão no circuito acende Led Verde
     digitalWrite(LEDFALTA, LOW); //se tiver tensão no circuito apaga Led vermelho
  }
  else
  {
     contador = 0;
     digitalWrite(LEDFALTA, HIGH);
//se não tiver tensão no circuito acende Led vermelho

      digitalWrite(LEDNORMAL, LOW); //se não tiver tensão no circuito apaga Led verde   }
}

void detect() {
   contador++;
}



Créditos do código: Renato Aloi

Qualquer dúvida postem aqui ou no Facebook ok?

No próximo post vamos ver como utilizar o Agentuino + Zabbix também para apresentar graficamente o monitoramento de tensão.

Até mais pessoal!
 

 

sábado, 18 de abril de 2015

Monitoramento de tensão - circuito de detecção de tensão

Olá pessoal!



Vamos para a implementação do monitor de tensão e o primeiro passo é montar o circuito detector de tensão. A idéia é monitorar um circuito elétrico (tomada ou derivação) quanto à presença de tensão ou não e fazer com que o Arduino perceba estes estados através de uma de suas portas. Temos que colocar alguns parâmetros no projeto para que o circuito detector trabalhe de forma flexível e segura:
1) Tensão a ser monitorada: pode ser 110V ou 220V. No projeto optamos por trabalhar com ambas as tensões.
2) Proteção dos circuitos: como estamos monitorando um circuito elétrico é fundamental implementarmos algumas proteções aos circuitos diretamente ligados ao Arduino.

Detalhes construtivos:

1) Caixa para acomodação dos componentes: optamos por utilizar uma caixa 20x20 do sistema VID da Tigre.




2) Conector fêmea para cabo de energia: tínhamos sobrando esses cabos com conector fêmea para cabo de energia e decidimos utilizá-lo para poder conectar cabos de energia com o novo padrão e se for preciso também conectar cabos de energia com padrão antigo. Se a tomada a ser monitorada for do padrão novo utiliza-se um cabo de energia com plug no padrão novo! Se não utilize um cabo do padrão antigo.



3) Protoboard para conexão dos componentes.




4) Borne para ligação da entrada de energia no optoacoplador.





Detalhes do circuito:

1) Utilização de optoacoplador: como estamos trabalhando com tensões de 110V AC e 220V AC convém protegermos o Arduino caso haja algum problema nesses circuitos. O optoacoplador utilizado foi o 4N25.
2) Resistor de 220K: limitador de corrente na entrada do optoacoplador.
3) Resistor pull-down de 10K.
4) 2 LEDS (um para indicar presença de tensão (led verde) e outro para indicar falta de tensão (led vermelho).


Esquema de ligação:




Como funciona:

O circuito que se quer monitorar a tensão é conectado através dos pinos 1 e 2 do optoacoplador e utilizando-se de um resistor limitador de corrente. Nos pinos 4 e 5 são ligados ao 5V e GND do Arduino e utilizando-se de um resistor pull-down para sempre termos sinais em nível ALTO ou BAIXO, sem níveis intermediários. Se há tensão no circuito o LED do optoacoplador é iluminado (está conectado nos pinos 1 e 2 do optoacoplador) e do outro lado temos um fototransistor e quando exposto à luz a sua base é excitada por esse facho de luz, fazendo com que os pinos 4 e 5 passem a conduzir. No pino 4 derivamos uma conexão à porta 2 do Arduino que ficará em estado alto se o circuito tiver tensão e em estado baixo se não estiver com tensão.
No Arduino optamos por trabalhar com interrupções na porta 2 para detectar essas mudanças de estado da porta e agir conforme essas mudanças ocorrem.

No próximo post vamos ao código! Não deixem de acompanhar!

Até mais!

quinta-feira, 19 de março de 2015

Novo projeto - monitoramento de tensão

Olá pessoal,

Hoje vamos iniciar com as experiências que tive em uma outra necessidade que tive no dia-a-dia do meu trabalho. Primeiramente vamos entender a problemática e a solução que obtive utilizando Arduino.
Temos diversos equipamentos de rede (switch) que são conectados a pequenos nobreaks para que em momentos de quedas rápidas de energia o switch não seja desligado. Se há queda de energia isso faz com que o switch seja reinicializado e isso demora um tempo e a rede fica indisponível enquanto ele não volta ao seu estado funcional.
Com a utilização destes pequenos nobreaks o grande problema ocorre quando há uma queda mais prolongada de energia, consumindo boa parte da carga da bateria e também muitas vezes esgotando totalmente. Como esses nobreaks muitas vezes só desligam com a carga totalmente esgotada ocorreram várias vezes das baterias dos nobreaks ficarem danificadas por esse esgotamento. Uma parte da rede elétrica em que estes nobreaks e switches ficam conectados são conectados em um estabilizador de 100KVA em cabine e algumas vezes o estabilizador desarma e não reaciona (ele tem uma chave que desarma e o rearme é manual). A outra parte da rede elétrica não está no estabilizador (rede não estabilizada) e depende diretamente da energia vinda diretamente da rua.
De tudo isso o complicado é saber quando e onde ocorreu o problema. É uma falha da concessionária de energia? É problema no estabilizador como mencionado acima? O quão frequente são estas falhas?
Com esses problema surgiu a idéia de implementar uma espécie de monitoramento da energia em determinados pontos da rede elétrica para determinar quando e onde caiu a energia. A idéia é que se colocarmos um monitor de energia em algum ponto da rede elétrica que está conectada com o estabilizador saberemos que provavelmente em uma queda de energia deste ponto provavelmente o problema ocorreu no estabilizador como mencionado acima ou o circuito que este ponto de rede elétrica caiu (por desarme de disjuntor, problema na tomada, etc).Se conectarmos um monitor de energia em um ponto da rede elétrica que não está conectada ao estabilizador e houver uma queda de energia detectada provavelmente a energia vinda diretamente da concessionária falhou ou o circuito que este ponto de rede elétrica caiu (por desarme de disjuntor, problema na tomada, etc). Então temos:
1 monitor de energia conectado à rede elétrica estabilizada.
1 monitor de energia conectado à rede elétrica não estabilizada.

Temos as seguintes situações com essa configuração de monitores:
1) Queda de energia detectada pelo monitor conectado à rede estabilizada: provavelmente ocorreu queda do estabilizador ou do circuito.
2) Queda de energia detectada pelo monitor conectado à rede não estabilizada: provavelmente ocorreu um problema geral elétrico.
3)Queda de energia detectada pelo monitor conectado à rede estabilizada e também queda de energia detectada pelo monitor conectado à rede não estabilizada: provavelmente há falha de energia vinda diretamente da concessionária de energia.

Como implementar esse monitor? O escolhido foi: com Arduino! Basta implementar um circuito detector de tensão e monitorar. Monitorar como? Podemos utilizar igualmente o monitoramento implementado para temperatura que ao invés de monitorar temperatura monitora tensão e notifica via e-mail e SMS.
No próximo post vamos entrar nos detalhes de implementação do monitor de tensão utilizando Arduino.
Até a próxima.


sexta-feira, 27 de fevereiro de 2015

Evolução do projeto de acionamento de ar condicionado

Olá pessoal,

Vimos nos posts anteriores como o projeto de acionamento de ar condicionado via infravermelho evoluiu desde a primeira concepção do projeto com a utilização de shield GSM e shield Ethernet para notificação e alarme de temperatura alta até a utilização da biblioteca Agentuino e o Zabbix. Este projeto foi concebido para resolver um problema relacionado ao fato do ar condicionado não ter o recurso de restart automático.
A boa notícia é que para o ambiente em que tínhamos esse projeto rodando foram adquiridos dois aparelhos de ar condicionado com restart automático! Agora, além da redundância de aparelhos, não será mais necessário o acionamento via infravermelho.
Hoje o projeto está somente monitorando a temperatura e emitindo alertas via SMS ou e-mail caso a temperatura fique mais alta do que a programada no Zabbix.
Uma coisa é certa: vale a experiência e aprendizado ao se tentar soluções para os problemas do dia a dia. Analisando todo o histórico do projeto e sua evolução quanta coisa aprendi.
E aí tem mais alguma sugestão para aprimorar o projeto? No próximo post vamos a outro projeto que desenvolvemos: monitor de tensão.

Até mais!


segunda-feira, 16 de fevereiro de 2015

Agentuino + Zabbix - Parte 4 - Google Agenda e SMS


Olá pessoal,

Continuando a série Agentuino + Zabbix hoje veremos como usar o Google Agenda para o envio de SMS quando uma trigger do Zabbix for acionada. Veremos como instalar e utilizar o gcalcli (Google Calendar Command Line Interface) no Zabbix e configurá-lo para enviar SMS usando este software.

Como funciona?

O sistema funciona assim: o Zabbix, através de um script, utiliza o gcalcli para criar um evento no Google Agenda e uma vez criado o evento o Google Agenda é configurado para notificar o usuário a criação do evento através de SMS. O esquema básico é o seguinte:

1) O Zabbix gera o alerta e executa o script que utiliza o gcalcli para criar o evento.
2) O evento é criado na agenda.
3) Uma notificação via SMS é enviado ao usuário notificando que um novo evento foi criado.

Instalação do gcalcli:

É necessário fazer a instalação de alguns pacotes necessários (dependências) antes de instalar o gcalcli. Deve-se instalar:

- python-dateutil-2.4.0
- setuptools
- python-gflags-2.0
- google-api-python-client-1.3.1
- httplib2

Eu acabei utilizando os sources de cada um destes pacotes, descompactando e instalando com o comando python setup.py install

Instalar o gcalcli:

# wget --no-check-certificate https://github.com/insanum/gcalcli/archive/master.zip
# unzip -e master.zip
# cd gcalcli-master
# python setup.py install

Execute o seguinte comando para testar:

# gcalcli agenda

ERROR: Missing module - No module named dateutil.tz

Se ao executar o gcalcli ele apresentar como Missing Module (módulo faltante) basta baixar e instalar o módulo faltante. Por exemplo se ele indicar que o módulo dateutil.tz está faltando basta instalar a dependência python-dateutil-2.4.0.

Instalando dateutil:

#  wget --no-check-certificate https://pypi.python.org/packages/source/p/python-dateutil/python-dateutil-2.4.0.tar.gz
# tar zxvf python-dateutil-2.4.0.tar.gz
# cd python-dateutil-2.4.0
# python setup.py install

Instalando setuptools:

# wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
# python ez_setup.py --insecure

Instalando gflags:

# wget --no-check-certificate https://python-gflags.googlecode.com/files/python-gflags-2.0.tar.gz
# tar zxvf python-gflags-2.0.tar.gz
# cd python-gflags-2.0
# python setup.py install

Instalando httplib2:

# wget --no-check-certificate https://github.com/jcgregorio/httplib2/archive/master.zip
# unzip -e master.zip.1
# cd httplib2-master/
# python setup.py install

Instalando google-api-python-client-1.3.1

# wget --no-check-certificate https://github.com/google/google-api-python-client/archive/master.zip
# unzip -e master.zip.2
# cd google-api-python-client-master/
#  python setup.py install



Se tudo ocorrer bem o gcalcli estará instalado. Precisamos fazer com o que o servidor zabbix seja autorizado a criar eventos através do gcalcli e também é necessário que se tenha uma conta válida do Google e que esta conta tenha acesso ao Google Agenda. Uma vez logado com a conta do Google através do navegador faça o seguinte:

No Zabbix execute:

#  gcalcli agenda --noauth_local_webserver


Com o navegador aberto logado com uma conta do Google (Gmail por exemplo) cole o link que se apresenta na barra de endereços. Aceite e copie o código de verificação. Cole o código de verificação no Zabbix e dê um Enter.
Se der tudo certo tem que apresentar a resposta Authentication Successfull.

Acesse o Google Agenda. Crie um novo calendário chamado Monitoramento Zabbix. Clique no ícone de roda dentada para acessar Configurações.


Na aba Agendas, clique em Criar nova agenda.


Dê um nome, descrição e local para a agenda e depois clique em Criar Agenda:


A agenda foi criada.


Clique no ícone de roda dentada novamente para acessar Configurações e vá novamente na aba Agendas e clique em Editar notificações da agenda que você acabou de criar:


Marcar as opções para notificar por SMS 10 minutos antes de cada evento:


Vá na aba Configuração de celular, forneça no campo Telefone o número do seu celular e clique em Enviar código de confirmação. Você deverá receber o código de confirmação através de SMS e digite no campo Código de confirmação o código recebido. Clique em Salvar.


Se tudo correr bem o Status aparecerá como Número de telefone validado com sucesso.


Agora falta criar o script no Zabbix que utilizará o gcalcli para criar o evento.

# cd /etc/zabbix/scripts
# vi sms.sh

Crie o script sms.sh com o seguinte conteúdo:

 #!/bin/bash

let oneminf=`date +%s`+60
dateonemin=`date -d @$oneminf +%R`

gcalcli --calendar 'Monitoramento Zabbix' --title "$1" --when $dateonemin --reminder '1m sms' --where '' --descr '' --duration 1 add


No caso estou usando o gcalcli para criar um evento no calendário "Monitoramento Zabbix" com o título que eu passar no script sms.sh (o $1 será substituído pelo conteúdo que eu passar no script) 1 minuto depois da data atual com lembrete em 1minuto via SMS. O evento terá duração de 1 minuto.


Vimos no post anterior que a trigger tem como ação executar um comando remoto no servidor Zabbix.



Se a temperatura for maior que 28 graus o Zabbix dispara a trigger que por sua vez dispara a ação e executa o script sms.sh dessa forma:

# /etc/zabbix/scripts/sms.sh "[Arduino Sensor] Temperatura:PROBLEM"

Se quiser testar é só chamar o script dessa forma:

# /etc/zabbix/scripts/sms.sh "[Arduino Sensor] Temperatura: NORMAL"

Veja o SMS recebido:




Bom pessoal acredito que encerramos a série com Zabbix. Quaisquer dúvidas entrem em contato. No próximo post avaliaremos a evolução do projeto de acionamento de ar condicionado via infravermelho.





sexta-feira, 30 de janeiro de 2015

Agentuino + Zabbix - Parte 3 - Criação de alarmes via SMS e E-mail no Zabbix

Olá pessoal!!

Continuando a série com Zabbix + Agentuino, vamos ver hoje como criar triggers e ações para criar alarmes com aviso por SMS e E-mail através do Zabbix. Quando a temperatura lida com o Arduino ultrapassar um certo limite o Zabbix lerá essa temperatura e disparará a trigger e as ações programadas.

Vamos lá!

O primeiro passo é criar a trigger associada ao host. Localize o host Arduino e assegure-se de que ele está se comunicando via SNMP com seu servidor Zabbix e fornecendo a temperatura.





















Clique no botão Criar Trigger:





















Na primeira aba Trigger escolha o nome da trigger e clique no botão Adicionar para criar a expressão que será avaliada para o disparo da trigger.





















Abrirá uma janela pop-up e em seguida selecione o item do host (Temperatura) que faz a leitura da temperatura.













































No campo Função escolha a opção: Último (mais recente) valor de T é > N.
No campo N digite 28.

Com isso a expressão criada será lida dessa forma: se o último valor de T (item Temperatura) for maior que N (28) dispara a trigger. Escolha o valor da temperatura que for mais conveniente.

















Voltando a tela de criação da Trigger escolha uma Descrição da trigger de forma bem clara e concisa. Escolha o Tipo de Risco como Atenção. Clique em Salvar.





















Está criada a trigger.



Com a trigger criada devemos criar as ações que serão realizadas quando esta trigger for ativada. Para isso vá em Configurações e clique em Acões. Depois clique em Criar Ação:



Crie um Nome para a ação. No campo Duração padrão de cada passo da operação digite 240 (segundos). e clique na caixa Mensagem de Recuperação. Nos demais campos deixar como está.




Vamos criar as condições em que a trigger será disparada. Colocaremos assim: se a severidade da Trigger (risco) for classificado como Atenção e o host for o Arduino a ação (ou ações) será(ão) executada(s).
Primeiramente remova as condições que vem por padrão:

Em Nova Condição selecione Severidade da Trigger e escolha Atenção na próxima caixa e depois clique em Salvar:

Escolha uma nova Condição, selecione Host e selecione o host (Arduino Sensor no meu caso) e depois clique em Adicionar.


Agora criaremos de fato as ações a serem executadas. Clique na aba Ações e clique em Nova:



Antes de prosseguir com as ações vamos criar o grupo de usuários para que as permissões sejam criadas. Clique em Administração, Usuários e escolha Grupo de Usuários e em seguida clique em Criar Grupo de usuários: 



Dê um nome para o grupo (no caso coloquei como Arduinos) e clique em Salvar:


Agora vamos configurar um usuário Zabbix chamado Arduino sensor para que este receba os e-mails de alerta.
Clique em Administração, Usuários e escolha Usuários e em seguida Criar Usuário.


Dê um Apelido, Nome, Sobrenome e crie uma senha para o usuário. Clique em Adicionar:

Escolha o grupo Arduinos e clique em Selecionar:



Será criado o usuário Arduino sensor.

Agora vamos ativar as permissões do grupo de usuário Arduinos e assim o usuário Arduino sensor herdará as permissões.

Vá no grupo de usuários Arduinos e clique na aba Permissões. Vamos definir que o grupo Arduinos tenha permissão Somente leitura e que por consequencia o usuário Arduino sensor terá o mesmo privilégio. Em seguida clique em Salvar.




Com o usuário e grupo criados retomemos à criação das ações. A primeira ação que será criada funcionará assim: será enviado um e-mail para o e-mail cadastrado do usuário Arduino Sensor quando a trigger for disparada. Preencha os campos exatamente como aparecem na imagem abaixo e depois clique em Salvar:



Agora vamos criar a segunda ação que enviará SMS quando a trigger for disparada.

Clique em Nova e aparecerá a tela para configurar os detalhes da operação. Notem que o Tipo de operação está selecionado como Comando remoto e na Lista Alvo está selecionado Host Atual para indicar que a operação será no host em que a Trigger será disparada (no caso o host Arduino Sensor). Selecione o tipo como Script personalizado, e escolha a opção Executar em como Servidor Zabbix.
No campo Comandos está o caminho de execução do script sms.sh que enviará o SMS via Agenda do Google. Clique em Salvar.

Com isso as duas ações estão criadas.


No próximo post veremos como configurar o Google Agenda para enviar SMS quando o script sms.sh for acionado.

Até a próxima!