Temperature and Humidity Arduino’s based sensor with Exosite IoT Platform

I share my sketch that allows to use a DHT 22 (11 or 21 also supported) with Arduino against Exosite.com Internet Of Things platform.

Requirements:

  1. Arduino Uno, Mega or similar.
  2. Ethernet Shield.
  3. DHT22 Sensor
  4. 4.7 Ohm resistor between data and power pins (yellow/red)
  5. Exosite.com account with one registered device and two vars: temp and humidity as float each one.

Schematic design:

Arduino DHT22

Sketch

/*
 Exosite Arduino Basic Temp Monitor 2 (updated to use Exosite library)
  
 This sketch shows an example of sending data from a connected
 sensor to Exosite. (http://exosite.com) Code was used from various
 public examples including the Arduino Ethernet examples and the DHT
 Library examples found on the Arduino playground. 
  
 This code keeps track of how many milliseconds have passed
 and after the user defined REPORT_TIMEOUT (default 60 seconds)
 reports the temperature from a DHT22 (and 11) temp and humidity sensor.
 The code sets up the Ethernet client connection and connects / disconnects 
 to the Exosite server when sending data.

 Latest version of this sketch is available here:
 https://github.com/changux/arduino_exosite_library/blob/master/examples/TemperatureMonitor/TemperatureHumidityMonitorWithDHTSensor.ino 
  
 Assumptions:
 - Tested with Arduino 1.6.6
 - Arduino included Ethernet Library
 - Arduino included SPI Library
 - Using Exosite library https://github.com/exosite-garage/arduino_exosite_library
 - Using Adafruit's DHT Library https://github.com/adafruit/DHT-sensor-library 
 - User has an Exosite account and created a device (CIK needed / https://portals.exosite.com -> Add Device)
 - User has added a device to Exosite account and added a data source with alias 'temp', type 'float' and 'humidity', type 'float'.

 
  
 Hardware:
 - Arduino Uno, Mega, Duemilanove or similiar
 - Arduino Ethernet Shield
 - DHT 22 (11 or 21 also works) temp sensor (on data pin 2, with 4.7k pull-up)
 
Version History:
- 1.0 - Dec 15 2015. First version based on the TemperatureMonitor sketch of Exosite library.

*/


#include <EEPROM.h>
#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
#include <Exosite.h>

#define DHTPIN 2 // PIN connected

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Initialize DHT sensor.
DHT dht(DHTPIN, DHTTYPE);

//

String cikData = "";  // <-- FILL IN YOUR CIK HERE! (https://portals.exosite.com -> Add Device)
byte macData[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };         // <-- FILL IN YOUR Ethernet shield's MAC address here.

// User defined variables for Exosite reporting period and averaging samples
#define REPORT_TIMEOUT 30000 //milliseconds period for reporting to Exosite.com
#define SENSOR_READ_TIMEOUT 5000 //milliseconds period for reading sensors in loop

class EthernetClient client;
Exosite exosite(cikData, &client);


void setup() {
  Serial.begin(9600);
  Serial.println("Boot");
  dht.begin();
  delay(1000);
  Serial.println("Starting Exosite Temp Monitor");
  Serial.print("DHT Digital Pin Specified: ");
  Serial.println(DHTPIN);
  Ethernet.begin(macData);
  // wait 3 seconds for connection
  delay(3000);

}

void loop() {
  static unsigned long sendPrevTime = 0;
  static unsigned long sensorPrevTime = 0;
  static float tempC;
  static float h;
  char buffer[7];
  String readParam = "";
  String writeParam = "";
  String returnString = "";
  // Wait a few seconds between measurements.

  Serial.print("."); // print to show running

  // Read sensor every defined timeout period
  if (millis() - sensorPrevTime > SENSOR_READ_TIMEOUT) {
    Serial.println();
    Serial.println("Requesting temperature...");
    dht.readTemperature(); // Send the command to get temperatures
    float tempC = dht.readTemperature();
    Serial.print("Celsius:    ");
    Serial.print(tempC);
    Serial.println(" C ..........DONE");
    tempC = dht.readTemperature();
    //
    Serial.println();
    Serial.println("Requesting humidity...");
    dht.readHumidity(); // Send the command to get humidity
    float h = dht.readHumidity();
    Serial.print("Percent:    ");
    Serial.print(h);
    Serial.println(" % ..........DONE");
    h = dht.readHumidity();


    sensorPrevTime = millis();
  }

  // Send to Exosite every defined timeout period
  if (millis() - sendPrevTime > REPORT_TIMEOUT) {
    Serial.println(); //start fresh debug line
    Serial.println("Sending data to Exosite...");
    tempC = dht.readTemperature();
    h = dht.readHumidity();

    readParam = "";        //nothing to read back at this time e.g. 'control&status' if you wanted to read those data sources
    writeParam = "temp="; //parameters to write e.g. 'temp=65.54' or 'temp=65.54&status=on'

    String tempValue = dtostrf(tempC, 1, 2, buffer); // convert float to String, minimum size = 1, decimal places = 2

    writeParam += tempValue;    //add converted temperature String value

    writeParam += "&humidity="; //add humidity

    writeParam += h;

    //Debug
    //Serial.println(writeParam);

    if ( exosite.writeRead(writeParam, readParam, returnString)) {
      Serial.println("Exosite OK");
      if (returnString != "") {
        Serial.println("Response:");
        Serial.println(returnString);
      }
    }
    else {
      Serial.println("Exosite Error");
    }

    sendPrevTime = millis(); //reset report period timer
    Serial.println("done sending.");
  }
  delay(1000); //slow down loop
}

The latest version of this sketch is available here.

Result

This is an example dashboard.

exosite.com

Final recomendations

Don’t forget when you are inside exosite’s account:

  1. Add a device with exosite using a Generic template.
  2. Add two variables: temp and humidity as float.
  3. Add your CIK to the script BEFORE uploading and testing.

Übersicht (OSX Desktop Widget) to display recent posts of Splunk Answers

Übersicht is a great tool that came to offer an option to the powerful Geektool.

About the Übersicht:

Übersicht lets you run system commands and display their output on your desktop in little containers, called widgets. Widgets are written using HTML5, which means they
* are easy to write and customize
* can show data in tables, charts, graphs … you name it
* can react to different screen sizes

In the other way, answers.splunk.com is the perfect place to interact with members of the Splunk’s community and well, the first point of technical support.

Today, i found a widget from a Übersicht colaborator, to present a RSS feed inside a widget, a very useful add-on and i decided parameterized to show the recent posts of answers.splunk.com. The code is very easy to adjust, is written in Coffeescript and Python for advanced features. I made some transformations using Google Script to convert twitter posts from @splunkanswers to RSS and adjusting minor things related the presentation.

Ubersnitch answers

If you want it, please clone the repo from Github or download the .zip

Bye!

Update1:  With the RSS feed, you can do cool things…

pebble1 pebble2

Log.io + zimbra

“Monitorear” servicios que reportan logs en muchos archivos puede ser una tarea tan aburrida como compleja de seguir. Si bien, hoy se puede hacer usando herramientas como logstash, fluentd, greylog2 o el mismo splunk, aveces sólo es necesario tener una pantalla mostrando la actividad del servicio en un centro de monitoreo o NOC y es por eso, que log.io surge como una simple y poderosa opción.

Log.io esta hecho en nodejs, tiene arquitectura cliente-servidor, con lo que es posible tener varios “clientes” (o en su propias palabras, un harvester) reportando a un sólo servidor.

logio arch

La instalación está ampliamente documentada, pero en resumen:

$ sudo npm install -g log.io --user "MI-USUARIO"
$ sudo log.io-server
$ sudo log.io-harvester

El archivo de configuración:

$ vi ~/.log.io/harvester.conf
exports.config = {
  nodeName: "demo-server",
  logStreams: {
    Zimbra: [
      "/opt/zimbra/log/mailbox.log",
      "/opt/zimbra/log/nginx.access.log",
      "/opt/zimbra/log/nginx.log",
      "/var/log/zimbra.log",
      "/var/log/mail.log"
    ],
  }, 
  server: {
    host: '0.0.0.0',
    port: 28888
  }
}

Y finalmente, el resultado:

logio2

 

Hasta la próxima.

 

@ClaroColombia bloquea acceso a gran proveedor europeo de internet

Update 1: Logré hablar con una persona del área técnica quien me dijo que tenían identificado el problema y que estaban trabajando en el. Conseguí, que al menos mi conexión se arreglara (por cierto Gracias), sin embargo, el inconveniente sigue latente en todos los demás enlaces residenciales.

Hace días, un amigo me invitó a probar un servicio que está a punto de lanzar. No pude entrar, el navegador se quedaba intentándolo hasta que finalmente, daba un error: “could not connect to 5.9.136.xx“. Pedí a mi amigo que revisara si tenía políticas de firewall que causaran la falla a lo cual contestó que no había ninguna seguridad implementada en el servicio de momento. No insistí mas.
El día siguiente, probé desde la oficina y allí funcionaba perfectamente. ¿Cómo puede ser esto? Decidí volver a probar desde donde el día anterior fallaba (casa) y si, seguía fallando. Olvidé el tema por unos días.

Tiempo después, intenté ver un video de floqq y no pude, se quedaba buscando algo que no encontraba.

problema1

Me propuse identificar la causa y al parecer, mi navegador no podía encontrar el sitio videos.floqq.com. La dirección IP de ese dominio es 5.9.66.150, ¿dónde he visto yo una dirección parecida? Pues si, la dirección IP se parece a la que días antes había probado sin éxito desde casa. Al buscar un poco más, identifiqué que esos dos bloques IP (y muchos mas en el segmento 5.9.0.0/16 está asignado a un proveedor de hosting alemán, Hetzner Online Ag.

http://myip.ms/view/ip_addresses/84475904/5.9.0.0_5.9.254.255

Vamos a ver, dos direcciones IP en sudredes distintas 5.9.136.xx y 5.9.66.150, asignadas al mismo proveedor alemán e inaccesibles desde  mi casa, donde mi proveedor a internet es @ClaroColombia, probadas desde otro proveedor de internet y que funcionan, ¿dónde estará la falla? :)

Una pista más, si escribo la url http://videos.floqq.com/ en mi navegador, veo la página de un cable modem Cisco, ¿ah?

Screen Shot 2013-10-16 at 8.28.24 AM

Podrá ser cierto que @ClaroColombia usa direcciones IP públicas para hacer gestión sobre los equipos que instala en los clientes? Pues si, así parece.

Llevo varios días intentando reportar la falla vía telefónica y no hay cómo, su dirección de contacto entre operadores abuse@telmexla.net.co no funciona, luego, ¿quién puede ayudarnos?

Seamos concretos, tenemos 65535 (5.9.0.0/16) servidores y/o equipos conectados a internet (conocidas al menos) que no son accesibles a causa de un error GIGANTE de @ClaroColombia.

Mis amigos de @floqq, al reportarles el problema, tuvieron que inventarse algo para que mientras a @ClaroColombia se le antoja resolver la causa original, pudieran ofrecer sus servicios en Colombia, gracias a ellos por su velocidad y ayuda.

Para probar esto, los invito a intentar acceder por Hetzner:

http://videos.floqq.com/video.php?video=e27b04c824844f668fca12f1666137a2

Si tiene @ClaroColombia y no lo logra, pruebe por aquí:

http://videos2.floqq.com/video.php?video=e27b04c824844f668fca12f1666137a2

A ver si @ClaroColombia hace algo…

Update 1: @luisuribe reporta que las conexiones de empresa (fibra) funcionan, luego el problema en principio afecta básicamente las conexiones residenciales que es donde @ClaroColombia es realmente masivo.

Installing Circos on OSX 10.8

Circos is a software package for visualizing data and information. It visualizes data in a circular layout — this makes Circos ideal for exploring relationships between objects or positions. There are other reasons why a circular layout is advantageous, not the least being the fact that it is attractive.

Circos is ideal for creating publication-quality infographics and illustrations with a high data-to-ink ratio, richly layered data and pleasant symmetries. You have fine control each element in the figure to tailor its focus points and detail to your audience.

The installation in OSX is some tricky, and well, after search and try a ton of options, this small recipe appear to works perfect. I assume you have installed brew and Command line tools from Xcode.

$ cd circos-0.64/
$ cd bin
$ vi circos
  --> change path to OSX "env" location (/usr/bin/env)
$ vi gddiag 
  --> change path to OSX "env" location (/usr/bin/env)
$ sudo perl -MCPAN -e shell
cpan> install Config::General
cpan> install Font::TTF::Font
cpan> install Math::VecStat
cpan> install Readonly
cpan> install Text::Format 
cpan> install Math::Bezier
cpan> install Set::IntSpan
$ brew install libpng
$ brew install freetype
$ brew install gd --with-freetype
$ cd $HOME/Downloads
$ curl -O http://www.cpan.org/authors/id/L/LD/LDS/GD-2.49.tar.gz
$ tar zxvf GD-2.49.tar.gz && cd GD-2.49
perl Makefile.PL 
sudo make install
cd ../circos-0.64/bin
circos-0.64/bin$ ./circos --conf ../example/etc/circos.conf
circos

circos

Simple Aol Reader Google Chrome App

After the Google reader suicide, all the people is finding a new tool to replace it. I am testing a lot of tools, but, by the way, Aol Reader seems like a good option. The tool is in beta status, and doesn’t  have native applications to access it (Aol said that are in development).

For my needs, I wrote a small app to work as a “launcher” from Google Chrome, can be downloaded from here:

http://db.tt/2X5RHzwa

The installation is very easy, download, unzip and follow this steps:

http://superuser.com/questions/247651/how-does-one-install-an-extension-for-chrome-browser-from-the-local-file-system

1

Enjoy!

IPv6 en Colombia, un año después del #WorldIPv6LaunchDay

Si, hace exactamente un año, fue el día en que ipv6 encendió definitivamente y desde entonces, nada es igual, dicen los promotores de la iniciativa. Antes de esto, fuimos testigos de más de una década de especulaciones y planes pues finalmente el direccionamiento IPv4 público acabó y sólo se están asignando las reservas que los administradores del mismo tienen.

En la actualidad, el establecimiento de IPv6 en el mundo avanza y sus cifras lo demuestran, hay algo más del doble de despliegues  que el año inmediatamente anterior, según datos recientemente divulgados.

En Colombia, se hicieron algunos eventos, grandes anuncios, y pese a todo ello, no pareciera haber avances desde entonces. Por ejemplo, si revisamos la lista de los 500 sitios de internet más consultados desde nuestro país según el reconocido portal de información web, Alexa,  www.eltiempo.com (el primer sitio Colombiano en aparecer en la posición 19) no ofrece su servicio web a través de IPv6, ni el www.elespectador.com (en la posición 25), ni www.todo1.com (posición 35) y no es si no hasta la posición 373 (en la página 15) que encontramos al primero: www.une.com.co (bien por Une):

$ ping6 www.une.com.co
PING6(56=40+8+8 bytes) 2001:xxx:xxxx:x::xxxx --> 2800:e1:411b::5
16 bytes from 2800:e1:411b::5, icmp_seq=0 hlim=44 time=498.709 ms

Por otro lado, el portal de la red Renata www.renata.edu.co un proyecto pionero y de vanguardia en la implementación de tecnología avanzada en la academia e instituciones científicas, pese a tener configurado acceso via ipv6, no lo tiene en servicio (lo cual además les notifiqué via correo electrónico el 06/06/2013).

$ nmap -6 www.renata.edu.co
Starting Nmap 6.25 ( http://nmap.org ) at 2013-06-06 11:40 COT
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.11 seconds

Incluso habilitaron un cuestionario para certificar los “conocimientos en ipv6” que no funciona (retorna un “Problemas de conexión” aquí).

Y si seguimos buscando, seguiremos encontrando infinidad de casos, en donde al parecer, se crearon los registros dns, se anunciaron, y quizá se ofreció servicio por un corto período de tiempo (por ejemplo www.ean.edu.co) para luego sencillamente, dejar de hacerlo manteniendo la prueba de haberlo tenido (prueba que además hace que aquellos que tenemos IPv6 configurado en nuestros dispositivos no podamos ingresar a sus sitios web debido a la preferencia en la resolución dns de registros cuatro-a).

Ya si nos vamos a buscar estadísticas de IPv6 por país, usando por ejemplo el sitio de google dispuesto para tal fin, vemos que en América Latina el único caso a destacar es el de Perú, pues todos los demás, no salimos del 0% de adopción de IPv6.

Screen Shot 2013 06 06 at 11 54 13 AM

En el mismo sentido, el 6lab de Cisco muestra el decrecimiento en los usuarios y conexiones en 2013

Decrecimiento 2013

Y finalmente, ipv6-test.com tiene también un reporte del caso de Colombia, en donde es evidente que incluso las implementaciones vienen a menos y además, toca directamente el tema de los navegadores de los clientes, en donde se ve un pequeño aumento en la curva, sin embargo en la siguiente gráfica (Default browser protocol in Colombia (dual-stack users)) queda claro que conexiones nativas a IPv6, casi no hay.

En conclusión, la adopción de IPv6 en américa latina a este ritmo puede tardar mucho mas de lo planeado, incluso existen proyectos en marcha del Ministerio Tic para su masificación en Colombia, que de momento, tienen un impacto reservado (de una muestra de 296 sitios web de entidades públicas ó gov.co NINGUNA ofrece servicios web vía ipv6). Además, los proveedores de internet (ISP) aún no ven la necesidad de ofrecer conexiones nativas pese a tener gran parte o toda su infraestructura lista para hacerlo, además, porque si una organización o entidad lo necesita, deberá pagar por ello como un servicio adicional y hasta que sea considerado como tal, no será masivo. Finalmente, creo que la educación al respecto en tema de IPv6 necesita ser reforzada, porque los administradores de IT y los estudiantes, aun no son conscientes de la importancia de hacer sus proyectos compatibles y sencillamente, tampoco están técnicamente enterados.

¿Será el 2014 el año en que Colombia sea pionero en IPv6? Depende de todos.