Programando BLE en RPi con Python

Es posible escribir programas para RPi (Raspberry Pi) que utilicen BLE, por ejemplo con Python.

Para ello debemos instalar previamente las librerias Bluez (5.48) y Bluepy

Para instalar Bluepy se puede hacer de forma automática

$ sudo apt-get install python3-pip libglib2.0-dev
$ sudo pip3 install bluepy

o de forma manual

$ sudo apt-get install git build-essential libglib2.0-dev
$ git clone https://github.com/IanHarvey/bluepy.git
$ cd bluepy
$ python setup.py build
$ sudo python setup.py install

Se puede probar la correcta instalación mediante el comando python btle.py XX:XX:XX:XX:XX:XX

Para instalar Bluez

sudo apt-get update 
sudo apt-get install libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libical-dev libreadline-dev libudev-dev libusb-dev make
mkdir -p work/bluepy
cd work/bluepy
wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.4.tar.xz
xz -d bluez-5.4.tar.xz
tar xvf bluez-5.4.tar
cd bluez-5.4
./configure --disable-systemd
make
sudo make install

Para probar

pi@raspberrypi:~/bluepy_src/bluepy/bluepy $ lsusb
Bus 001 Device 004: ID 145f:01d3 Trust 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Weewx en una Raspberry Pi

Weewx es un software libre desarrollado por Tom Keffer en 2008-2009 para controlar un gran número de modelos de estación meteorológica personales (PWS) como las 10xx, 20xx, 30xx de FOSHK.

Weewx permite, entre otras funciones,  enviar la información meteorológica a redes como: Weather Underground WUAwekas, CWOP, PWSweather, WOW; almacenarla en una base de datos SQLite o MySQL, publicarla en Intenet de forma gráfica, enviarla a un servidor con FTP o RSYNC.

Además mediante la instalación del driver interceptor de MWALL Weewx puede capturar la información meteorológica de prácticamente cualquier PWS que la reenvie a WU como  hacen, entre otras, las PWS HP1000, WS2600, WH2950 y la WH2650  de FOSHK. La captura de la información la puede hacer:

  • de forma directa o invasiva: configurando en la PWS la dirección IP de Weewx como si fuera la del  servidor de WU y configurando el servidor WU en Weewx para que a continuación la reenvie a WU (invasiva)
  • de forma indirecta o no invasiva: configurando weewx de forma que esnife el tráfico IP dirigido a WU

Lo interesante, en este momento, es que es posible instalar y ejecutar el software Weewx en una Raspberry Pi modelos 2 y 3 con Rasbian (Pequeño tamaño y muy económicas) pues ambos modelos disponen de WIFI y de conexión Ethernet, si bien el modelo 3 posibilita la conexión de un display con lo que se puede convertir a la Raspberry Pi en un monitor de la PSW.

Para instalar Weewx (V 3.8.0) en la Raspberry PI debemos ejecutar en el terminal:

  • sudo apt-get update
  • sudo apt-get install weewx

Para instalar el driver interceptor:

  • sudo wget -O weewx-interceptor.zip https://github.com/matthewwall/weewx-interceptor/archive/master.zip
  • sudo wee_extension –install weewx-interceptor.zip
  • sudo wee_config –reconfigure –driver=user.interceptor –no-prompt

Además hay que editar y modificar weewx

[Interceptor]
 driver = user.interceptor
 device_type = observer

Para el modo sniffer del interceptor hay que instalar suplementariamente:

  • sudo apt-get install python-libpcap

Debiendo editar y modificar weewx

[Interceptor]
 driver = user.interceptor
 device_type = observer
 mode = sniff
 iface = eth0
 pcap_filter = src 192.168.1.100 and dst port 80

Los comandos de terminal para gestionar weewx son:

pi@raspberrypi:~ $ sudo /etc/init.d/weewx
Usage: /etc/init.d/weewx {start|stop|status|restart|reload}

Por lo que para arrancar weewx hay que hacer:

  • sudo /etc/init.d/weewx start

Weewx para publciar la información meteorológica utiliza  Apache que viene preinstalado con Raspbian y para comprobar el funcionamiento correcto de weex podemos::

  • En un navegador poner file:///var/www/html/weewx/index.html
  • Si está arrancado Apache http://localhost/weewx

Desinstalar weeWX pero mantiene ficheros y datos

  • sudo apt-get remove weewx

Desistala weeWX borra configuración pero guarda datos:

  • sudo apt-get purge weewx

Borrar datos

  • sudo rm -r /var/lib/weewx
  • sudo rm -r /var/www/html/weewx

Complementos:

  • Utilidades:  http://www.weewx.com/docs/utilities.htm
  • Consideraciones prácticas:  https://github.com/weewx/weewx/wiki/Raspberry-Pi

Para intalar el software wview (Una alternativa, más limitada y menos usada que weeex) en Raspberry PI, mirar VK3BQ

 

Estaciones WH2950 y WH2650 de FOSHK

FOSHK fabrica, entre otras, las estaciones meteorológicas  WH2950 y WH2650  (FOSHK no vende directamente por lo que se comercializan con esos u otros nombres, por distribuidores como  misol y pueden comprarse en tiendas como amazon , aliexpress,  etc.) para las cuales no hemos desarrollado ninguna app, como lo hicimos con HP1000, WS2600 y Meteobridge. Con todo con mucha  frecuencia nos preguntan sobre ello, y de cómo se puede acceder a los datos que recogen y envían a Weather Underground y por esta razón publicamos este post.

En este momento no tenemos previsto hacer ningún desarrollo para estas dos estaciones de FOSHK, pues pensamos que Weewx cubre con crece las necesidades de los usuarios. Con todo, el protocolo de subida de datos (upload) a la red WU – Weather Underground  es público y por ello es posible desarrollar aplicaciones, pero antes de ponerse a tirar de código siga leyendo.

Weewx es un desarrollod e código abierto y gratuito que hace de puente o bridge entre la estación meteorológica que envía via WiFi datos a WU y WU.  Modificando adecuadamente la  URL/dirección web del servidor  WU por la IP del ordenador donde se ejecuta Weewx, pasamos a disponer del control  y de los datos y por ello podemos:

  • Reenviarlos a los servidores de redes como WeatherUnderground, PWSweather.com, CWOP, WOW, AWEKAS, etc.
  • Enviarlos a un servidor con FTP or rsync para su procesamiento o hacerlos públicos con weather34 o similar.
  • Almacenarlos en una base de datos como sqlite o MySQL .
  • Publicarlos en un servidor web al cual podemos acceder con un navegador desde cualquier dispositivo que esté en la red (Ordenador, teléfono móvil, tableta)

Weewx está escrito en Python para ser ejecutado sobre LINUX por lo que puede ejecutarse en cualquier ordenador que no usemos, aunque parece que Raspberry Pi 3 puede ser el candidato ideal.

La diferencia más importante entre meteobridge y weewx es que meteobridge es trasparente o no invasivo, en otras palabras captura los datos sin necesidad de modificar nada, mientras que para weewx si que es necesario dicha modificación al pasar a ser un elemento intermedio disminuyendo la fiabilidad del sistema en su conjunto.

Nosotros no hemos probado todavía weewx, aunque no lo descartamos, pero pinta bien.

Control de circuitos eléctricos con Raspberry Pi – II : Python

En una entrada anterior hemos visto cómo un programa escrito en Python puede controlar dispositivos conectados a la GPIO de la Raspberry Pi (OUT) como era un  LED, pero que se puede generalizar a otros dispositivos de bajo voltaje como un motor de un juguete o de mayor voltaje mediante un relé. Ahora vamos a ver cómo un dispositivo conectado a la GIO de la Raspberry Pi, como es un pulsador, puede controlar un programa Python (IN).

La entrada es flotante, es decir se detecta una variación relativa del  voltaje de entrada por el conector definido como entrada.

Generación de señal de entrada (Diagrama de eLinux)

En nuestro ejemplo hemos usado como entrada el conector 24 (pin 18) y los +3,3V lo tomamos del pin 1

# led_balancin_2.py 
#
# Cuando se pulsa parpadean las luces hasta que se
# vuelve a pulsar
try:
 import RPi.GPIO as GPIO
 print("GPIO.RPI_INFO = " + str(GPIO.RPI_INFO))
 print("GPIO.VERSION = " + str(GPIO.VERSION))
except RuntimeError:
 print("Error importando RPi.GPIO")
 
try: 
 import time
except RuntimeError:
 print("Error importando RPi.GPIO")
 
# GPIO: Ajuste de los nombres de GPIO: BOARD ó BCM
GPIO.setmode(GPIO.BCM)
# GPIO: Ajuste mensajes de warning a OFF
# (avisos de otros programas trabajando con GPIO)
GPIO.setwarnings(False)

# GPIO: Definicion de canales de IN y OUT
Lista_canales_out = [18,23] 
Lista_canales_in = [24] 
GPIO.setup(Lista_canales_out,GPIO.OUT)
GPIO.setup(Lista_canales_in,GPIO.IN)
GPIO.output(Lista_canales_out,(GPIO.LOW,GPIO.LOW))
pulso = 0 
while pulso < 2:
 if (GPIO.input(24)):
 print("Boton!")
 pulso += 1
 else:
 time.sleep(1)
 if pulso == 1:
 print ("Ni")
 GPIO.output(Lista_canales_out,(GPIO.HIGH,GPIO.LOW))
 time.sleep(1)
 print ("No")
 GPIO.output(Lista_canales_out,(GPIO.LOW,GPIO.HIGH))
 time.sleep(1)
 else:
 time.sleep(1)
GPIO.cleanup()

El siguiente reto, la siguiente entrada, cómo usar un dispositivo con BLE (Bluetooth de baja energia) para controlar un programa Python