Usted probablemente haya leído hace poco de una tendencia al alza, el Internet de las Cosas pues cada vez es más fácil de conectar dispositivos y sensores a la internet, donde se puede informar de su estado, recibir instrucciones, etc
La columna vertebral de este sistema es el repositorio de datos en línea, que registra los datos y le permite ver los resultados .Las dos principales plataformas que permiten hacer esto con relativa facilidad son Cosm.com ( antes pachube y un poco mas tarde Xivley) y Nimbits .
En este artículo, se va a conectar el Netduino a Nimbits a través de un intermediario Python. El autor prefiere este enfoque de una alternativa común, que conecta la Netduino directamente a una conexión Ethernet. Si usted está interesado en probar un enfoque mas directoro utilizando Cosm.com hay todo un libro que le muestra cómo , ya ademas en este blog se ha tratado aqui .
Tanto Cosm (Pachube) como Nimbits utilizan una API REST para recibir los datos de los sensores.
En el artículo sobre el uso de Tweet-A-Watt con Nimbits se n cubre el proceso de creación de una cuenta en el servidor Nimbits, obtener una clave de API, y la creación de puntos de datos. Usted tendrá que hacer todas estas cosas con el fin de recibir datos del Netduino. Sus ajustes Nimbits se guardan en el archivo de configuración de Python, como se explica a continuación.
Configuración Netduino
El hardware y el software Netduino no se modifica de la etapa anterior del proyecto,Netduino Meets World . Usted tendrá que tener XBees configurados tanto en el Netduino y extremos de Python de la configuración – detalles están en Netduino Meets World .
Bueno, en realidad, no es necesario si el XBees Netduino se encuentra muy cerca de la PC que ejecuta Python. Puesto que estamos utilizando los XBees como un dispositivo serie genérico, una conexión USB también funcionará sin cambios de software necesarios(el autor tiene un Netduino e conectados por USB a un BeagleBoard XM corriendo Python).
No se puede utilizar el puerto USB del Netduino para esto, pero se puede conectar las clavijas al adaptador-TTL a USB. Una opción es el cable 3.3V FTDI que describí allá por el Netduino: Tiempo y artículo de El Tiempo . Una opción un poco más barato es un tablero del desbloqueo de FTDI – Esta usando esta de Sparkfun y puede confirmar que funciona bien con el código que acompaña a este artículo.
Configuración de la interfaz de Python
El código Python, TimeRelay.py, se construye sobre la base del programa Python utilizado la última vez, TimeServer.py. Servidor de hora se configura con los interruptores de línea de comandos -, ya que hay muchos más ajustes ahora, he pasado a utilizar un archivo de configuración. Puede descargar el código de Python y el archivo de configuración de ejemplo de página de Google Code , aquí.
El archivo de configuración contiene los siguientes ajustes. Los que hay que rellenar están marcados en cursiva.
# Archivo de configuración para TimeRelay.py # SERIALPORT = \ COMxx <-. Puerto COM de Windows se debe especificar en este formato SERIALPORT = / dev/ttyUSB0 LOGFILENAME = TimeRelay.log DEBUG = True NIMBITS_SERVER = http://app.nimbits.com NIMBITS_USERID = NIMBITS_API_KEY = NIMBITS_UPDATE_INTERVAL = 300 # ID de sensores - formato es <Netduino Sensor <ID = <Nimbits Punto de datos <ID [, Nimbits Intervalo de actualización en segundos] H1 = PlantRoomHumidity, 1800 T1 = PlantRoomTemperature
Los 3 primeros ajustes se corresponden con los parámetros de línea de comandos en el predecesor del programa, que se enumeran en el artículo anterior:
- SERIALPORT – Especifica el puerto serie que el XBee está conectado. Tenga en cuenta el tamaño inusual del nombre del puerto de serie para Windows PC – esto es requerido por el PySerial biblioteca.
- LOGFILENAME – El archivo de registro tiene un papel más importante -, además de los mensajes de error, sino que también registra las lecturas de datos recibidos de la Netduino en un formato delimitado por comas. Puede desactivar la función de registro local, al dejar esta opción en blanco (es decir, la supresión de “TimeRelay.log” de esa línea).
- DEBUG – Activa los mensajes de depuración por escrito a la consola. Esto está activada por defecto, ya que es muy útil para solucionar problemas.
Los ajustes Nimbits son tomados de su cuenta Nimbits:
- NIMBITS_SERVER – La configuración predeterminada, app.nimbits.com, es el servidor Nimbits público. Si usted no quiere codearse con las masas sin lavar, usted puede configurar su propio servidor privado Nimbits en Google App Engine – usted entonces introducir el nombre del servidor GAE aquí (por ejemplo whatever.appspot.com). (Ambos Nimbits y GAE son libres cuando se utiliza para este propósito. Describí brevemente el proceso de configuración de un servidor Nimbits en el “Rolling Your Own” sección de mi artículo Nimbits )
- NIMBITS_USERID – Este es el Gmail electrónico que utilizó al crear sus Nimbits representan.
- NIMBITS_API_KEY – Esta tecla se envía por correo electrónico a usted al hacer clic en el botón de barra de herramientas de “clave secreta” en la consola del servidor Nimbits.
- NIMBITS_UPDATE_INTERVAL – Especifica la frecuencia con Nimbits será actualizado con la última lectura del sensor. El valor predeterminado es 300 segundos (es decir, 5 minutos), pero se puede sustituir esto para sensores individuales en las líneas de los sensores en la parte inferior del archivo de configuración de HTE. Tenga en cuenta que la Netduino enviará una nueva medición cada 60 segundos, independientemente de lo que se configura aquí – la aplicación Python enviará Nimbits un promedio de todas las lecturas desde la última actualización.
Los ajustes del sensor se utilizan para vincular los identificadores de sensor no modificables en la aplicación Netduino con los nombres de los puntos de datos que creó en Nimbits. Las configuraciones por defecto asumen nombres de punto de datos de PlantRoomTemperature y PlantRoomHumidity – si utiliza otros nombres (como se podría si en realidad no tienen una habitación Planta), a continuación rellenarlos en estas líneas del archivo de configuración.
Tenga en cuenta que los ajustes que se muestran arriba le enviará una nueva lectura de la humedad Nimbits cada 30 minutos, mientras que la temperatura se enviará utilizando el intervalo predeterminado de 5 minutos. Siéntase libre de cambiar esta función de cómo meteorológicamente activo es su casa.
Activar Sensores
Después de que haya terminado la actualización TimeRelay.cfg, ejecute TimeRelay.Py y ver la consola.
El programa comenzará haciendo una lista de los ajustes que se han encontrado en el archivo de configuración, a continuación, se abrirá el puerto serie y esperar a que algo suceda.
Si un Netduino ejecutar el código desde el último artículo está encendido, y salió de la “depuración” configuración activada en el archivo TimeRelay.cfg, debería ver una temperatura y una lectura de humedad que se muestra dentro de un minuto. Un mensaje que muestra la llamada a la API REST que envía los datos a Nimbits debe mostrarse en 5 minutos (o cualquier intervalo que usted utilizó en el archivo TimeRelay.cfg).
Cambie a su página web Nimbits, haga doble clic en el punto de datos en el panel de la izquierda, y el panel de Canales de Datos debe actualizar con el nuevo valor recibido.
Hay un montón de funciones muy útiles que usted puede experimentar con en el cuadro de diálogo Puntos de datos. Yo uso el ajuste de alarma de inactividad para decirme cuando algo ha ido mal con la configuración Netduino / Python, y el Alto y Bajo alerta Valor para decirme cuando algo ha ido terriblemente mal en mi casa.
La página web Nimbits también tiene algo ingenioso incorporado en las capacidades gráficas. Estos han cambiado recientemente con el lanzamiento de Nimbits 3.2, y seguirán evolucionando, por lo que ver la página web Nimbits y Nimbits el blog para las últimas.
El proceso de carga se ejecuta en otro temporizador. Esto está codificado que se produzca cada 60 segundos – nada mágico en ese intervalo, y sin duda podría cambiar según sea necesario.
Puesto que estamos utilizando el XBee como una interfaz serial genérico, todo el Netduino tiene que hacer es escribir los datos en el puerto serie. El sensor de ID no es modificable, y cada lectura se terminó con un CR / LF – un formato de mensaje “cruda pero eficaz”. No se ha notado ningún problema con ser ilegible o truncado de datos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// upload sensor readings once a minute
timerUploadSensors =
new
Timer(
new
TimerCallback(uploadSensorData),
null
, 60000, 60000);
. . .
private
static
void
uploadSensorData(
object
data)
{
string
strReading =
""
;
if
(blnHumidityUpdated)
{
blnHumidityUpdated =
false
;
// make copy of humidity reading, since it
// could be overwritten at any time
strReading +=
"H1:"
+ strHumidity +
"rn"
;
}
if
(blnTempUpdated)
{
blnTempUpdated =
false
;
// make copy of temperature reading, since it
// could be overwritten at any time
strReading +=
"T1:"
+ strTempDHT11 +
"rn"
;
}
uart.WriteToUART(strReading);
}
El código Python es un poco más interesante.
En primer lugar, se ha añadido una solución para un problema conocido con la biblioteca PySerial cuando se ejecuta en Windows. Cuando PySerial intenta abrir el puerto COM que piensa que su ya abierto – La solución es siempre cerrarla antes de abrirlo y no causa problemas en otros sistemas operativos:
1
2
3
ser
=
serial.Serial(SERIALPORT, BAUDRATE, timeout
=
TIMEOUT)
ser.close()
# workaround for known problem when running on Windows
ser.
open
()
El código que lee TimeRelay.cfg muestra algunas de potencia de archivos y la cadena de manipulación de Python. Cinco líneas de código es todo lo que se requiere para abrir un archivo, leer su contenido, analizar las líneas, y guárdelas en un diccionario.
1
2
3
4
5
6
7
8
9
10
11
12
13
def
readConfigFile():
#global config
for
line
in
open
(CONFIGFILE):
if
line.strip()[
0
] !
=
"#"
: # skip comment lines
parts
=
line.split(
"="
,
1
)
if
len
(parts)
=
=
2
:
config[parts[
0
].strip()]
=
parts[
1
].strip()
Las lecturas del sensor recibidas de la Netduino se almacenan en un diccionario. La clave es la identificación del sensor (por ejemplo, “T1″) y el valor es una lista con el formato:
<# De lecturas desde la última carga>, <Total de lecturas desde el pasado update>, <date/time de última upload>
Diccionarios de Python son frías porque pueden almacenar cualquier objeto como su valor, y el tipo de objeto pueden ser diferentes para diferentes entradas en el mismo diccionario. Menos interesante es el hecho de que Python lanza una excepción si se intenta leer una clave del diccionario que aún no existe, así que asegúrese de comprobar para ver si una lectura anterior ya se ha almacenado allí.
1
2
3
4
5
6
7
8
9
10
11
# add this reading to the sensor's list
if
sensor
in
sensorValues:
sensorValues[sensor][
0
]
=
sensorValues[sensor][
0
]
+
1
sensorValues[sensor][
1
]
=
sensorValues[sensor][
1
]
+
float_value
if
DEBUG:
print
"found sensorValue"
, sensor, sensorValues[sensor]
else
:
sensorValues[sensor]
=
[
1
, float_value, datetime.datetime.now()]
if
DEBUG:
print
"adding new sensorValue"
, sensor, sensorValues[sensor]
Tenga en cuenta que Python no es demasiado exigente con los tipos de variables, excepto cuando es. Si “sensorValues [sensor] [1]“ o “float_value” no eran tanto los valores de punto flotante, una excepción se produce cuando se suman.
El código que envía los datos a Nimbits utiliza la API REST CurrentValue . Esta API tiene un doble papel de escribir nuevos valores y leyendo el valor más reciente, pero sólo lo está utilizando para escribir datos aquí.
El código comienza con un hack, para redondear el valor a 3 posiciones decimales antes de enviarlo. Esto se hace por razones puramente estéticas, por lo que las lecturas que se muestran en la página web Nimbits ven bien y ordenado (parece mas bien o un truco porque redondear un número no debería requerir este grado de manipulación de cadenas).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# HACK round to 3 decimal places and drop trailing zeros
# - technically not needed, but makes Nimbits output nicer looking
stringValue
=
(
"%.3f"
%
value).rstrip(
'0'
).rstrip(
'.'
)
try
:
LogMsg(dataPoint
+
","
+
stringValue)
url
=
(NIMBITS_SERVER
+
"/service/currentvalue?value="
+
stringValue
+
"&point="
+
dataPoint.replace(
" "
,
"+"
)
+
"&email="
+
NIMBITS_USERID
+
"&secret="
+
NIMBITS_API_KEY)
urllib.urlopen(url)
return
True
except
IOError:
print
'Error sending to nimbits'
print
sys.exc_info()[
0
]
La llamada a la API de REST es un 2-liner, otro ejemplo del poder y la simplicidad de Python en comparación con. Net.El único truco es reemplazar espacios en el nombre de punto de datos con más signos, siendo esta una URL y todo.
Tenga en cuenta que no es necesario el envío de una marca de tiempo con los datos – la API CurrentValue asume el valor tiene una fecha y hora actual a menos que se especifique lo contrario. Lo bueno es que, desde que trabaja con las zonas horarias en Python puede ser una pesadilla.
Por desgracia, la API Nimbits CurrentValue no devuelve un valor para indicar si la llamada a la API se ha realizado correctamente, por lo que el código Python no escribirá un mensaje de error en la consola o el archivo de registro si algo sale mal. La primera señal de que algo anda mal es generalmente cuando “Alarma Idle” Nimbits ‘me envía un e-mail.
Fuente aqui