Мониторинг реализован на клоне Arduino Uno + Ethernet Shield. Термодатчиком выступает цифровой датчик DHT22.

Данные влажности и температуры напрямую пишутся в MySQL БД. Завыборку данных из БД и визуализацию отвечает Joomla плагин Plotalot.

Т.к. Arduino имеет свойство зависать (у меня плата стабильно висла раз в 3-4 дня), в коде скетча предусмотрено использование Arduino Watchdog, который перезагружает плату в случае зависания.

Скетч для Arduino:

#include <Ethernet.h>
#include <DHT.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <avr/wdt.h>
byte mac[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //Arduino MAC address
//IPAddress ip(0,0,0,0);   //Arduino IP address
EthernetClient client;
IPAddress server_addr(0,0,0,0);  // MySQL server address
char user[] = "user";              // MySQL user login username
char password[] = "password";        // MySQL user login password
#define DHTPIN 4     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302) // Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
MySQL_Connection conn((Client *)&client);
long lastCheckTime = -600000;
void setup() {
  Serial.begin(9600);
  while (!Serial); // wait for serial port to connect
  Ethernet.begin(mac);
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
  }
  else
    Serial.println("Connection failed.");
}
void loop() {
  wdt_reset();
  wdt_enable(WDTO_8S);
  if(abs(millis()-lastCheckTime)>600000)
  {
    lastCheckTime = millis();
    float h = dht.readHumidity(); // Humidity variable
    float t = dht.readTemperature(); // Temp variable
 
    String query = "INSERT INTO dbname.tablename (Temperature, Humidity) values ("+String(t,3)+ ","+String(h,3)+")"; // Insert data into dbname.tablename
    char dbQuery[128];
 
    query.toCharArray(dbQuery,128);
    // Initiate the query class instance
    MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
    // Execute the query
    
    //sprintf(query,INSERT_SQL,h,String(t,3));
    cur_mem->execute(dbQuery);
    // Note: since there are no results, we do not need to read any data
    // Deleting the cursor also frees up memory used
    delete cur_mem;
    //Serial.println(query);
    Serial.println("Data recorded.");
  }
  wdt_reset();
  wdt_enable(WDTO_8S);
}

 Пример T-SQL запроса, который надо скормить в Plotalot, чтобы построился месячный график температуры:

SELECT CONCAT(a, ".", m, ".", y, " ", b, ":00"), t0 FROM(
SELECT EXTRACT(YEAR FROM `Timestamp`) as y, EXTRACT(MONTH FROM `Timestamp`) as m, EXTRACT(DAY FROM `Timestamp`) as a, EXTRACT(HOUR FROM `Timestamp`) as b
, AVG(Temperature)  as t0
 FROM `temp_log` WHERE timestamp > DATE_ADD(NOW(), INTERVAL -30 DAY)
GROUP BY EXTRACT(YEAR FROM `Timestamp`), EXTRACT(MONTH FROM `Timestamp`), EXTRACT(DAY FROM `Timestamp`), EXTRACT(HOUR FROM `Timestamp`)
order by EXTRACT(YEAR FROM `Timestamp`), EXTRACT(MONTH FROM `Timestamp`), EXTRACT(DAY FROM `Timestamp`), EXTRACT(HOUR FROM `Timestamp`)) as t