miércoles, 26 de octubre de 2016

RaPi - Instalando y probando el binding MQTT

El objetivo era instalar, configurar y probar el binding MQTT que va a permitir que cada sensor o grupo de sensores envie su estado al openHab. Para probar voy a configurar un item simulando la información que enviaría un sensor de temperatura ubicado en la cocina. Básicamente los pasos son los mismos para configurar cualquier binding.

Paso 1: Instalar binding


El primer paso consiste en instalar el binding de MQTT en openHab. Lo que yo hice fue mover el archivo org.openhab.binding.mqtt-1.8.3.jar a mi carpeta de addons (/opt/openhab/addons) desde la carpeta alladdons donde tengo todos guardados.

Paso 2: Configurar openHab


El segundo paso es configurar en openhab.cfg la direccion del broker. En mi caso como mosquitto corre en la misma raspberry y por ahora no tiene nada de seguridad, fue fácil:

 mqtt:broker:url=tcp://localhost:1883

* para abrir el archivo de configuración desde la Rapi, hay que pararse en el directorio donde esta guardado y usar sudo nano
   cd /opt/openhab/configurations
   sudo nano openhab.cfg
Para guardar los cambios se usa Ctrl+O y para cerrar la ventan Ctrl+X


Paso 3: Agregar items


Una vez cambiada la configuración hay que agregar los items necesarios en el archivo de items el que recibe la información especificando:

direction: < para recibir mensajes
broker: alias del broker especificado en la configuracion
topic: topico al que se suscribe
type: tipo de mensaje que se recibe, puede ser
state : actualización de estado
command: comando
transformation: regla que define como transformar el mensaje en algo que openHab reconozca.
default
transformation name > cualquiera de los definidos en org.openhab.core.transform.bundle
regex_filter: texto que representa una expresión regular para filtrar mensajes

Item myItem {mqtt="<direction>[<broker>:<topic>:<type>:<transformer>:<regex_filter>], <direction>[<broker>:<topic>:<type>:<transformation>], ..."}

En mi caso solo configuré un item de prueba:

Number MQTT_Tempe "Temperatura Cocina [%.1f °C]" <temperature> {mqtt="<[broker:tempe/cocina:state:default]"}

Para más información hay ejemplos de salida y entrada en la wiki del binding

* para abrir el archivo de items, se usa también sudo nano pero desde la carpeta /opt/openhab/configurations/items


Paso 4: Ajustar sitemap


El cuarto paso consiste en agregar ese item en el sitemap, yo lo agregué en uno casi vacío que se llama casa (tengo ese y el demo), donde configuré también el binding de weather.

Simplemente agregué en /opt/openhab/configurations/sitemaps/casa.sitemap la siguiente línea:

    Text item=MQTT_Tempe

Recuerden chequear que las mayusculas y minúsculas esten iguales... les puede pasar que pongan MQTT_tempe en un lado y MQTT_tempe en otro y no funcione...


Paso 5: Probar!


Con esto configurado, y con openhab y mosquitto corriendo en la Raspberry, solo quedaba probar a publicar un mensaje al tópico tempe/cocina del broker (desde la aplicación MQTTool) y ver si lo recibía...


Funcionó! Desde la ventana de openHab en la RaPi se puede ver la siguiente información:

2016-10-26 09:47:30:182 [INFO ] [runtime.busevents   ] - MQTT_Tempe state updated to 32  


lunes, 24 de octubre de 2016

Arduino - Conectando y probando el ESP8266

El desafío de la semana consistió en lograr hacer arrancar exitosamente el módulo ESP8266 (que permite conectarse  a redes WiFi) conectado a un Arduino Uno, cosa que hace un tiempo al momento de comprarlo no había resultado... A veces es bueno tomarse un tiempo y volver a armarlo porque ves cosas que no habías visto antes!

Arranqué conectando el módulo al Arduino Uno de esta forma:



El GND del ESP8266 a un pin GND del Arduino
El TX del ESP  al pin 2 del Arduino
El RX del ESP al pin 3 del Arduino
EL RST y el VCC al 3,3v del Arduino

Cargué un sketch básico para lograr la comunicación y probar los primeros comandos AT:

#include <SoftwareSerial.h>
SoftwareSerial ESP8266(3, 2); // RX | TX

void setup()
{  Serial.begin(9600);
     ESP8266.begin(9600);
  }

void loop()
  {  
     if (ESP8266.available())
         { char e = ESP8266.read() ;  // lee lo recibido del modulo ESP
           Serial.print(e);           // lo escribe en el monitor 
         }
     if (Serial.available())
         {  char s = Serial.read();   // lee lo escrito en el monitor
            ESP8266.print(s);         // lo manda al módulo ESP
         }
   }

Una vez cargado abrí el Serial Monitor, configurado a 9600... y nada... Siguiendo varias recomendaciones de soluciones de problemas, desconecté y volví a conectar la alimentación del módulo (lo que sale del 3,3v del Arduino) pero a lo sumo conseguí ver caracteres extraños.

Seguí investigando y encontré que de acuerdo al modulo puede variar la velocidad a la que trabaja. Probé cambiando la velocidad del Serial Monitor pero no hubo ninguna mejora... Hasta que me di cuenta que lo que tenía que hacer es cambiar la velocidad en el sketch!
#include <SoftwareSerial.h>                                                                                 
SoftwareSerial ESP8266(3, 2); // RX | TX                                 
void setup() {                                                            
 Serial.begin(115200);                                                    
 ESP8266.begin(115200);                                                   
}                                                                        
void loop()   {                                                                                                 
 if (ESP8266.available())          {                                      
  char e = ESP8266.read() ;  // lee lo recibido del modulo ESP            
  Serial.print(e);           // lo escribe en el monitor                  
 }                                                                        
 if (Serial.available())          {                                       
  char s = Serial.read();   // lee lo escrito en el monitor               
  ESP8266.print(s);         // lo manda al módulo ESP                     
 }                                                                        
}                                                                         
Con eso logré que finalmente se conecte el "modulito", aunque no recibi el ready que esperaba sino un ioavailable.

A partir de eso, desde el Serial Monitor, empecé a pasarle distintos comandos AT.

Para empezar AT para testear que funcione el sistema AT, recibo como respuesta OK, asi que seguimos...

Básicamente los comandos AT pueden tener 4 variantes (no todas aplican a todas):

SeteaConsultaTestea modos posiblesEjecuta
AT+<x>=<…>AT+<x>?AT+<x>=?AT+<x>
Las que yo utilicé son:

AT+GMR -> devuelve la version del firmware del módulo
AT+CWLAP -> lista las conexiones de WiFi disponibles
AT+CQJAP="ssid","password" -> se conecta a la red ssid con la contraseña password
AT+CIPMUX=1 -> habilita conexiones multiples
AT+CIPSERVER=1,80 -> activa un servidor web en el puerto 80
AT+CIPSTA? -> devuelve la dirección IP del módulo

Una vez obtenida la dirección IP se puede conectar a la misma a través de cualquier explorador de internet (de una maquina conectada a la misma red). Se observará en el monitor serial que se reciben datos de la conexión que después se podrían parsear para recibir comandos.

Pero eso lo dejamos para la próxima!

miércoles, 19 de octubre de 2016

RaPi - Instalando y testeando el broker MQTT

Investigando un poco sobre las formas de transmitir información de la forma mas liviana y simple posible en mi futuro sistema domótico, me encontré con el protocolo MQTT. Este protocolo de comunicación o transmisión de mensajes maquina a maquina permite el intercambio de mensajes que tienen poco peso mediante un sistema de suscripción a tópicos.

Un sistema de comunicación MQTT cuenta con un broker o server que es el que recibe los mensajes y los retransmite a quienes se hayan suscripto al tópico que se referencie. Además existen clientes que o publican mensajes con un determinado tópico o se suscriben para recibir mensajes de uno o mas tópico.

Mas adelante trataremos de configurar openHab como cliente para publicar o suscribirse a determinados tópicos pero para empezar, y en lugar de utilizar un servidor MQTT web (hay pagos y gratuitos) vamos a instalar y configurar Mosquitto en la misma Raspberry Pi.

Los primeros pasos son necesarios para poder bajar la ultima versión disponible en mosquitto.org:

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-wheezy.list
sudo apt-get install mosquitto

Solamente con esto ya tenemos el servidor MQTT corriendo en nuestro puerto 1883.

Para probarlo usé la herramienta gratuita MQTTool:
Configuracion de los datos de IP de la Rapi y puerto
Una vez conectada, me suscribi desde la pestaña Subscribe al tópico tempe/+, que es suscribirte a cualquier tópico que este bajo la jerarquía de tempe. Desde la pantalla de Publish, publiqué un mensaje en el tópico tempe/cocina y se puede ver en la última captura como lo recupero!

Publicar mensaje en tempe/cocina Recibir todos los mensajes bajo tempe
Cuando quise hacer otra prueba otro día, no lo logré hasta que descubrí que la IP de la Raspberry había cambiado, así que voy a investigar si es posible usar el nombre en lugar de la IP para no tener esos problemas...

Próximo paso: configurar el binding MQTT en openHab para que recupere información publicada en ciertos tópicos.

martes, 18 de octubre de 2016

RaPi - Instalando OpenHab

El principal objetivo para la Raspberry Pi va a ser usarla como servidor openHab por lo que una vez actualizada, el paso siguiente iba a ser efectivamente bajarlo e instalarlo.

Antes de instalarlo, cree una carpeta donde guardar el archivo .zip usando el comando

sudo mkdir /opt/openhab

y bajé a esa carpeta la ultima version del runtime de la pagina de openHab, con el comando wget, la que luego extraje ahí mismo con unzip y procedí a borrar el zip original usando rm.

(ojo que el atajo para hacer el paste del link copiado de internet en la Rapi es Shift+Ctrl+V)

En mi caso, como la última versión estable disponible era la 1.8.3, fue:

cd /opt/openhab
sudo wget https://bintray.com/artifact/download/openhab/bin/distribution-1.8.3-runtime.zip
sudo unzip distribution-1.8.3-runtime.zip
sudo rm distribution-1.8.3-runtime.zip



Esto terminó de instalar openHab pero para que realmente funcione hay que instalar lo que se llama Bindings o paquetes opcionales que permiten conexiones a distintos tipos de artefactos o extender la funcionalidad de openHab, en el directorio addons (que se crea durante la instalación). De nuevo hay que copiar la dirección de la última versión del sitio de openHab.

cd addons
sudo wget https://bintray.com/artifact/download/openhab/bin/distribution-1.8.3-addons.zip

Por ahora no voy a extraer los addons porque para hacer la primera prueba voy a instalar la demo de openHab que incluye los addons necesarios.

Primero, siguiendo las instrucciones del sitio de openhab, hay que crear una copia del archivo de configuración que viene por default.

cd /opt/openhab
sudo cp configurations/openhab_default.cfg configurations/openhab.cfg

En ese mismo directorio de openhab voy a  instalar la demo

sudo wget https://bintray.com/artifact/download/openhab/bin/distribution-1.8.3-demo.zip
sudo unzip distribution-1.8.3-addons.zip

Ahi me pregunta si quiero reemplazar algunos archivos y contesto que sí a todos (A). Una vez extraídos todos los archivos, borro el zip.

sudo rm distribution-1.8.3-addons.zip

Y ahora sí, listo para ejecutar openhab, desde el directorio opt/openhab/ ejecuto el script start.sh

sudo ./start.sh

Para ver la demo dede la Rapi, abrir una ventana del explorador y acceder a:

localhost:8080/openhab.app?sitemap=demo

Demo vista desde el navegador de la Rapi


Para verlo desde otra computadora o celular, de la red, conociendo la ip de la Raspberry (se puede obtener con el comando hostname -I)

http://192.168.0.14:8080/openhab.app?sitemap=demo

Demo vista desde el celular

domingo, 9 de octubre de 2016

RaPi - conectando todo

Y arrancamos...

Siguiendo las instrucciones de la guía rápida que venia con la Rapi (y rechequeando con el sitio raspberrypi.org) conecte las cosas en el siguiente orden:
- tarjeta de memoria micro SD (con NOOBS instalado para instalar Raspbian): me tomó 10 segundos de pánico encontrar la ranura de la tarjeta porque está ubicada, a diferencia de todos los otros,  en la parte inferior de la tarjeta.

- conecté el mouse USB a uno de los 4 puertos disponibles
- conecté el "cosito" wireless del teclado a otro de los puertos
- conecté el cable HDMI previamente conectado al televisor (y seleccione en la tele para que muestre ese puerto HDMI)

Como no estoy cerca del router de internet no conecte cable de red y espero conectar después por wifi, porque era elegir entre display o red. Recién ahora me doy cuenta de que esto de tener solamente una televisión vieja sin HDMI cerca del router puede ser un problema.

Con todo esto listo y chequeado, conecté con muchos nervios la Rapi a la fuente y... arrancó!

Apareció la ventanita de NOOBS donde seleccioné que quería instalar Raspbian (es la única opción que tenía, igual, y la que buscaba).


Había una opción para configurar el wifi pero no pude hacerlo porque no me reconoce el teclado, no se bien por qué todavía, porque al momento está hace 8 minutos instalando (mientras me muestra "publicidad" de las distintas funcionalidades).


Finalmente después de unos 25 minutos terminó de instalarse, pero como anticipaba no reconoció el teclado wireless así que aproveché para comprar uno común USB. Con el teclado nuevo rápidamente instalado, ya pude conectarme al wifi y proceder a dejar el sistema operativo y todos los paquetes actualizados, de acuerdo a lo recomendado, con los comandos:
   sudo apt-get update
   sudo apt-get upgrade
   sudo reboot

Donde se ejecutan estos comandos? en la consola Terminal que se accede en mi caso desde la barra de arriba, el icono de la pantalla con fondo negro, o bien desde el menu Accessories > Terminal



Para más información sobre estos comandos creé una entrada especial en el blog donde los voy compilando: http://miyotecno.blogspot.com/2016/10/comandos-utiles-raspbian.html


sábado, 8 de octubre de 2016

Comandos Útiles Raspbian

En esta entrada voy a ir compartiendo los comandos básicos que para un novato en todo lo que es Linux, son útiles para dar los primeros pasos en el mundo de la Raspberry Pi.

sudo: está derivado del inglés "super user do" y es un programa que permite ejecutar las acciones que se explicitan a continuación con permisos de superusuario. Se utiliza como un prefijo del comando deseado, por ejemplo sudo apt-get update

apt: por Advanced Packaging Tool es una herramienta que contiene varios comandos para manejar instalaciones, actualizaciones y eliminacion de software. Se utiliza logueado como usuario root o bien, teniendo los permisos suficientes, utilizando sudo para actuar como super usuario.
El usuario pi, usuario por defecto de la Raspberry Pi, está dentro de la lista de sudoers, o sea usuarios habilitados para utilizar sudo.
sudo apt-get update: APT almacena una lista de orígenes de software en un archivo (/etc/apt/sources.list). Antes de actualizar cualquier software se debe actualizar la lista de paquetes usando el comando update para evitar el riesgo de instalar una versión obsoleta.

sudo apt-get upgrade: actualiza todo el software instalado a la ultima versión de acuerdo a lo almacenado en el archivo lcoal sources.list. Para actualizar solamente un software se debe usar el comando install.

sudo apt-get install <package>: instala el software indicado en <package>.

sudo rpi-update: actualiza la version del firmware. Generalmente no es necesario excepto que surja un issue puntual que se solucione en una versión posterior a la instalada.

sudo mkdir <directory>: crea una carpeta. Ejemplo sudo mkdir/opt/openhab crea una carpeta llamada openhab en el directorio donde se almacena el software adicional (optional).

cd <directory>: cambia el directorio donde se está posicionado, importante si se quiere por ejemplo bajar un archivo a un directorio en particular, o listar contenido. Ejemplo: cd /opt/openhab

sudo cp <filename1> <filename2>: copia un archivo a otro directorio o al mismo con otro nombre. Ejemplo: sudo cp configurations/openhab_default.fg configurations/openhab.cfg crea una copia del archivo con otro nombre

sudo mv <filename1> <filename2>: mueve un archivo de un directorio a otro.

rm <filename1>: elimina el archivo

sudo unzip <filename>: extrae el contenido del archivo zip

--help : usado como sufijo, proporciona ayuda sobre un comando en particular. Ejemplo: apt-get --help

viernes, 7 de octubre de 2016

Chiche nuevo: Mi Raspberry Pi

Al fin tengo en mis manos mi nueva Raspberry Pi 3, aprovechando una serie de promociones!



Cómo es mi primera experiencia con un entorno Linux voy a usar el blog para ir documentando todos los pasos y las referencias que voy usando.

El primer paso, ademas de tener la RaPi (cariñosamente), fue analizar que cosas básicas extra necesito para hacerla andar y no mucho mas, es decir los indispensables:

- tarjeta de memoria micro SD (este modelo usa las micro SD, los anteriores usaban SD): en el mismo proveedor compré una y pedi que viniera con NOOBS instalado que, según entendi en lo que lei, simplifica la instalación del sistema operativo elegida para los neófitos como yo.
- display y cable necesario: en mi caso consegui un cable HDMI-HDMI para poder conectar la RaPi a una televisión que tiene esa entrada
- mouse y teclado USB: en este caso lo que tengo en casa en esta época de notebooks, es un teclado inalámbrico Microsoft y un mouse USB, sólo espero que me reconozca el teclado...
- fuente con puerto microB usb: lo mejor que conseguí al momento es un cargador de celular que llega a 1500mA. Recomiendan 2A pero supongo que para arrancar sin periféricos extra funcionará

Con esas siete cosas ya estoy en condiciones de empezar a instalar el Raspbian (la distribución de Linux adaptada para la Raspberry Pi).




jueves, 6 de octubre de 2016

Presentación del Blog

La idea de este blog es un poco compartir mis experiencias con todo lo que es Open Source y usarlo a la vez como una forma de autodocumentar el proceso.

Hace poco tiempo que empecé con todo esto, con mi primer Arduino Uno y ahora pasé a incorporar una Raspberry Pi, con todo lo que implica moverme a ver un poco de Linux (quizas le tome el gustito!).

Lo mío en general fue programación en entornos mas bien visuales, algo de programación básica web y cero electrónica, y en el plano laboral hace mas de 12 años que estoy trabajando del lado funcional que del de desarrollo, por eso me resulta divertido aprender algo nuevo.

Documentación en ingles hay de todo y para todos por eso decidí hacerlo todo en español para que les sirva a todos los que comparten mi lengua materna!