domingo, 5 de agosto de 2012

Monitor de energia con Rasperry Pi + Arduino + Emoncms3

Desde hace tiempo quiero crearme un sistema "SCADA" que me permita ver y controlar las cosas electricas que pasan en casa.

Voy dando algunos palos de ciego, el ultimo fue comprarme un contador de electricidad Efergy Elite con su pasarela de internet Home hub, que ha resultado bonito, pero no lo que yo queria.

El software emoncms3 que estan creando en www.openengergymonitor.com es muy interesante, un pelin limitado y funcionando en un raspberry pi, lo lleva al limite de su potencia.

El sistema que utilizan en openenergymonitor es demasiado complicado para lo que yo quiero, es muy versatil y esta pensado para no tener que tener un servidor en casa.

Lo que yo he probado es utilizar un arduino para enviar los datos de los sensores directamente al  emoncms ejectuandose en el raspberry pi, utilizando la conexion usb, lo que me ahorra la cara shield ethernet y tener que alimentar el arduino a parte.
Asi me he construido este simple circuito que conecta un sensor de temperatura y otro de humedad al arduino.

Este programa hace que el arduino envie cada 10 segundos una cadena de texto, con formato JSON, que es la que necesita emoncms3.

#include
dht11 DHT11;
#define DHT11PIN 2

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  int chk = DHT11.read(DHT11PIN);
  switch (chk)
  {
    case DHTLIB_OK:
//        Serial.println("OK");
                Serial.print("temperature:");
                Serial.print((float)DHT11.temperature, 2);
                Serial.print(",humidity:");
                Serial.println((float)DHT11.humidity, 2);
 
        break;
    case DHTLIB_ERROR_CHECKSUM:
//        Serial.println("Checksum error");
        break;
    case DHTLIB_ERROR_TIMEOUT:
//        Serial.println("Time out error"); 
        break;
    default:
//        Serial.println("Unknown error");
        break;
  }
  delay(10000);
}
 

Y este programa ejecutado en el arduino, lee el puerto serie, y hace una peticion al servidor web de emoncms3, pasandole los datos del arduino.
#!/bin/python

# simple serial gateway for arduino-raspberry-emoncms3

# (C) 2012 Alvaro Alea Fernandez 
# Distributed under GPL V2
# simplely get a json string from serial port and feed the emoncms3 configured.
# no error check implemented


# Configuration Data:
port='/dev/ttyACM0'
speed=115200
host='http://localhost/emoncms3'
apikey='192xxxxxxxxxxxxxxxxxxxxxxxx'

import os
import serial
ser = serial.Serial(port,speed)
# ignore the first data, not complete.
data=ser.readline()

while 1:
    data=ser.readline()
        // remove the CR+LF needed for readline
        data1=data[:len(data)-2]
    os.system("wget -o /dev/null -O /dev/null " + host + '/api/post?apikey=' + apikey + '\&json={' + data1 + '}' )

ser.close()
exit()
 
No tiene control de errores, ni ninguna floritura, pero funciona perfectamente, luego el resto ya es configurar el emoncms, para obtener "la pantalla":

Por cierto el DHT11, no solo tiene muy mala resolucion, (no da decimales) si no que ademas no tiene nada de precision.

Y el raspberry pi (al menos con la debian original) no tiene potencia ni de coña para manejar esto, se caga con 2 variables y cuatro graficos, habria que ver que se puede hacer para optimizar esto.