Go Down

Topic: A hardware ZABBIX Agent made with Arduino Mega (Read 3096 times) previous topic - next topic

levkov

Hi all,

I created a stand alone, hardware ZABBIX (Monitoring System) Agent (running Zabbix Agent-like firmware directly on micro-controller) using Arduino Mega 2560 Board + Ethernet Shield (Wiznet W5100). This device equipped with DHT22 temperature-humidity sensor.

Current (ZSA1-E model) Features:

1. Measures temperature and humidity using calibrated digital sensor
2. Direct monitoring with Zabbix Server (behave like Zabbix agent in passive mode)
3. Can support PoE 802.3 (need special Ethernet Shield with PoE support)
4. Cheap: 50~60$ for all parts price (based on Alibaba and Sparkfun prices, shipping included)
5. Can be easy assembled (minimal soldering and enclosure modification)
6. Web based network setting setup (save network settings in EEPROM)

It's firmware and design will be free and open source. Also Wi-Fi version (with the same form factor) and support for additional sensors (dust, motion, light, Co2..etc) will be implemented in near future.

Pictures and Screenshots:








Source code:
https://github.com/levkov/sensor.im/blob/master/ZSA1-E/ZSA1E.ino

Electronic Diagram:
https://github.com/levkov/sensor.im/wiki/Electronic-Diagram

Thanks  to Evengy Levkov,

I made some modifications in the code ,  made it more basics , this was tested with arduino uno and
5100 ethernet shield.

here the source :

//*****************************************************************************************
//* Purpose : Zabbix Sensor Agent - Environmental Monitoring Solution *
//* Author : Evgeny Levkov *
//* Adapted to basics : Schotte Vincent *
//* Credits: *

//-----------------INCLUDES--------------------
#include <SPI.h>
#include <Ethernet.h>


//--------------------------------------------
#define MAX_CMD_LENGTH 25

//--------------------------------------------
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xE3, 0x5B };

IPAddress ip(192, 168, 1, 93);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

EthernetServer server = EthernetServer(10050); //Zabbix Agent port //Zabbix agent port

EthernetClient client;

boolean connected = false;
//--------------------------------------------

//--------------------------------------------
String cmd; //FOR ZABBIX COMMAND
int led = 2; //LED PORT TO BLINK AFTER RECIEVING ZABBIX COMMAND
int counter = 1;  // For testing
//--------------------------------------------


void setup()
{
     Ethernet.begin(mac, ip, gateway, subnet); 
     server.begin();
     pinMode(led, OUTPUT);
     digitalWrite(led, LOW);

}

void loop()
{
//--------------------------------------------
  client = server.available();
  if (client == true) {
    if (!connected) {
      client.flush();
      connected = true;
    }
    if (client.available() > 0) {
      readTelnetCommand(client.read());
          }
    }
}
//--------------------------------------------


void readTelnetCommand(char c) {

  if(cmd.length() == MAX_CMD_LENGTH) {
    cmd = "";
  }
  cmd += c;
  if(c == '\n') {
    if(cmd.length() > 2) {
      // remove \r and \n from the string
      cmd = cmd.substring(0,cmd.length() - 1);
      parseCommand();
    }
  }
}
//--------------------------------------------
void parseCommand() { //Commands recieved by agent on port 10050 parsing

   counter = counter + 1;


  // AGENT ping
  if(cmd.equals("ping")) {
      server.println("1");
      client.stop();
// connected = false;

// AGENT version
   } else if(cmd.equals("version")) {
      server.println("ArduinZabbixVini.1.0");
      client.stop();
// connected = false;

     
// AGENT sensor1
} else if(cmd.equals("sensor1")) {
      float h = 99;
      server.println(h);
      client.stop();

// AGENT sensor2
} else if(cmd.equals("sensor2")) {
      float t = 20;
      server.println(t );
      client.stop();
     
}     
// AGENT counter
else if(cmd.equals("counter")) {
      float t = 20;
      server.println(counter );
      client.stop();
     
// NOT SUPPORTED
} else {
    // server.println("ZBXDZBX_NOTSUPPORTED");
    server.println(cmd);
    client.stop();
  }
  cmd = "";
}
//--------------------------------------------



In Zabbix just do the following ;

1. configure a host with ip address of the sketch  example    arduino3 with ip 192.168.1.93
2. configure you're items like following
    Host                          arduino3   
    Description                  Temperature sensor1
    Type                           zabbix agent
    Key                          sensor1           // as in the sketch
   Type of information           numeric float
   



Have fun



Hi Arduinovini, I use your code and everything is fine! Thanks!

But, I include de DHT library for "real" values and get a error message:

sensor2.cpp.o: In function `setup': /usr/share/arduino/hardware/arduino/cores/arduino/IPAddress.h:33: undefined reference to `DHT::DHT(unsigned char, unsigned char, unsigned char)'

Code: [Select]

//*****************************************************************************************
//* Purpose : Zabbix Sensor Agent - Environmental Monitoring Solution *
//* Author : Evgeny Levkov *
//* Adapted to basics : Schotte Vincent *
//* Credits: *

//-----------------INCLUDES--------------------
#include "DHT1.h"
#include <SPI.h>
#include <Ethernet.h>
#define DHTPIN 7
#define DHTTYPE DHT22
#define MAX_CMD_LENGTH 25

DHT dht(DHTPIN, DHTTYPE);

//--------------------------------------------
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xE3, 0x5B };

IPAddress ip(10, 0, 1, 3);
IPAddress gateway(10, 0, 1, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server = EthernetServer(10050); //Zabbix Agent port //Zabbix agent port
EthernetClient client;
boolean connected = false;

//--------------------------------------------
String cmd; //FOR ZABBIX COMMAND
//int led = 2; //LED PORT TO BLINK AFTER RECIEVING ZABBIX COMMAND
int counter = 1;  // For testing
//--------------------------------------------


void setup()
{
     Ethernet.begin(mac, ip, gateway, subnet);
     server.begin();
     //dht.begin();
     //pinMode(led, OUTPUT);
     //digitalWrite(led, LOW);

}

void loop()
{
//--------------------------------------------
  client = server.available();
  if (client == true) {
    if (!connected) {
      client.flush();
      connected = true;
    }
    if (client.available() > 0) {
      readTelnetCommand(client.read());
      }
    }
}
//--------------------------------------------


void readTelnetCommand(char c) {

  if(cmd.length() == MAX_CMD_LENGTH) {
    cmd = "";
  }
  cmd += c;
  if(c == '\n') {
    if(cmd.length() > 2) {
      // remove \r and \n from the string
      cmd = cmd.substring(0,cmd.length() - 1);
      parseCommand();
    }
  }
}
//--------------------------------------------
void parseCommand() { //Commands recieved by agent on port 10050 parsing

   counter = counter + 1;


  // AGENT ping
  if(cmd.equals("ping")) {
      server.println("1");
      client.stop();
// connected = false;

// AGENT version
   } else if(cmd.equals("version")) {
      server.println("ArduinZabbixVini.1.0");
      client.stop();
// connected = false;

     
// AGENT sensor1
} else if(cmd.equals("sensor1")) {
      //float h = 68;
      float h = dht.readHumidity();
      server.println(h );
      client.stop();
      delay(2000);

// AGENT sensor2
} else if(cmd.equals("sensor2")) {
      //float t = 22;
      float t = dht.readTemperature();
      server.println(t );
      client.stop();
      delay(2000);
     
}     
// AGENT counter
else if(cmd.equals("counter")) {
      //float t = 20;
      server.println(counter );
      client.stop();
     
// NOT SUPPORTED
} else {
    // server.println("ZBXDZBX_NOTSUPPORTED");
    server.println(cmd);
    client.stop();
  }
  cmd = "";
}


Debug message is attached.

Any help?




Hi,
Problem: DHT22 library is not to Arduino 1.0.
Solution: attached


posth173

Thank you guys for all the useful info!
With one DHT22 it works like a charm!

Now I encounter an issue when trying to use multiple DHT22's.

For some reason it only shows a maximum of 2 inputs in zabbix at the same time, sometimes it switches between the four(2x humidity measurement and 2x temperature measurement).

Can someone please tell me what I'm doing wrong?

In the picture attached there is some interruptions that are just me reuploading a different script trying to figure out what's wrong

//* Purpose : Zabbix Sensor Agent - Environmental Monitoring Solution *
//* Author : Evgeny Levkov *
//* Adapted to basics : Schotte Vincent *
//* DHT22 implementation to Arduino 1.0 : Carlos Eduardo de Siqueira *
//* Credits: *

//-----------------INCLUDES--------------------
#include "DHT22.h"
// Only used for sprintf
#include <stdio.h>

// Data wire is plugged into port 7 on the Arduino
// Connect a 4.7K resistor between VCC and the data pin (strong pullup)
#define DHT22_1_PIN 7
#define DHT22_2_PIN 8

// Setup a DHT22 instance
DHT22 dht(DHT22_1_PIN);
DHT22 dht2(DHT22_2_PIN);

#include <SPI.h>
#include <Ethernet.h>
#define MAX_CMD_LENGTH 25
//--------------------------------------------
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xE3, 0x5B };

IPAddress ip(10, 0, 30, 15);
IPAddress subnet(255, 255, 255, 0);

EthernetServer server = EthernetServer(10050); //Zabbix Agent port //Zabbix agent port
EthernetClient client;
boolean connected = false;

//--------------------------------------------
String cmd; //FOR ZABBIX COMMAND
//int led = 2; //LED PORT TO BLINK AFTER RECIEVING ZABBIX COMMAND
int counter = 1;  // For testing
//-------

void setup(void)
{
  // start serial port
  //Serial.begin(9600);
  //Serial.println("DHT22 Library Demo");
  Ethernet.begin(mac, ip, subnet);
  server.begin();
}


void loop(void)
{
//--------------------------------------------
client = server.available();
  if (client == true) {
    if (!connected) {
      client.flush();
      connected = true;
    }
    if (client.available() > 0) {
      readTelnetCommand(client.read());
      }
    }
}

void readTelnetCommand(char c) {
  if(cmd.length() == MAX_CMD_LENGTH) {
    cmd = "";
  }
  cmd += c;
  if(c == '\n') {
    if(cmd.length() > 2) {
      // remove \r and \n from the string
      cmd = cmd.substring(0,cmd.length() - 1);
      parseCommand();
    }
  }

}

//--------------------------------------------
void parseCommand() { //Commands recieved by agent on port 10050 parsing

DHT22_ERROR_t errorCode;
 
  // The sensor can only be read from every 1-2s, and requires a minimum
  // 2s warm-up after power-on.
      //delay(2000);
      //counter = counter + 1;

      delay(2000);
      errorCode = dht.readData();
     
   if (errorCode == DHT_ERROR_NONE){
   if (cmd.equals("humid")) {
     server.print(dht.getHumidity());
      client.stop();
   } else
      if (cmd.equals("temp")) {
      server.print(dht.getTemperatureC());
      client.stop();           
   }
   
     delay(2000);
     errorCode = dht2.readData();
   
   if (errorCode == DHT_ERROR_NONE){
   if (cmd.equals("humid2")) {
     server.print(dht2.getHumidity());
      client.stop();
   } else
      if (cmd.equals("temp2")) {
      server.print(dht2.getTemperatureC());
      client.stop();           
   }
   }
   cmd = "";

 
  }
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy