RASPBERRY PI IOT
CON PYTHON Y FIREBASE
1. CREAR UN PROYECTO EN FIREBASE
Pasos para crear al proyecto
Antes de seleccionar la opción de agregar “Firebase a to app Android”,
vamos a crear un proyecto en el Android Studio
2. CREAR LA APLICACIÓN ANDROID
Ya que hemos creado el proyecto Android, tomamos el nombre del package, y
volvemos al proyecto de firebase y seleccionamos “Agregar firebase a tu
app Android”
Copiamos el nombre del paquete, como lo indica la imagen.
El siguiente paso es descargar el archivo google-service.json, y
arrastrarlo y soltarlo en la carpeta app, del proyecto en el Android
Studio.
Ahora agregamos el SDK, al proyecto, como lo indica la imagen.
classpath 'com.google.gms:google-services:3.2.0'
com.google.firebase:firebase-core:11.8.0'
compile '
compile ' com.google.firebase:firebase-database:11.8.0'
apply plugin: 'com.google.gms.google-services'
Luego de esto, vamos a establecer la conexión con la base de datos.
https://firebase.google.com/docs/database/android/start/
El siguiente código es para probar que estamos conectados correctamente a
la base de datos de Firebase
Antes de ejecutar este código, vamos a firebase y hacemos la configuración
inicial de la base de datos.
Ahora si volvemos al Android Studio, y Ejecutamos el proyecto.
Una vez se lanza la aplicación, vemos en Firebase que nos agregó message:
“Hello World!”
Qué fue lo que le seteamos en el código.
En el siguiente enlace puede ver el código completo de la aplicación.
https://github.com/rpi-jefer/rpio_iot_android_python
3. DESCARGAR LAS CREDENCIALES DE FIREBASE PARA
LA CONEXIÓN CON PYTHON
Primero, tenemos que ir a Firebase y descargar las credenciales, como se muestra a
continuación.
Ahora vamos a la base de datos en Firebase y creamos el siguiente
árbol
{
"home" : {
"botones" : {
"pulsador_a" : f alse,
"pulsador_b" t
: rue
},
"luces" : {
"luz_cocina" : true,
"luz_sala" : false
}
}
}
4. INSTALAR LO NECESARIO EN LA RASPBERRY PI
ACTUALIZAR LOS REPOSITORIOS
$ sudo apt-get update
$ sudo apt-get upgrade
http://www.linuxhispano.net/2013/05/03/diferencia-entre-apt-get-update-y-apt-get-upgrade/
INSTALAR PIP
$ sudo wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
INSTALAR PYTHON DEV
$ sudo apt-get install python-dev
INSTALAR FIREBASE ADMIN
$ sudo pip install firebase-admin
INSTALAR GPIO ZERO
$ sudo apt install python-gpiozero
CÓDIGO PRELIMINAR PARA TESTEAR FIREBASE
$ sudo nano test_fire.py
import firebase_admin
from firebase_admin import credentials
from firebase_admin import db
cred = credentials.Certificate('/home/pi/cred.json')
# Initialize the app with a service account, granting admin privileges
firebase_admin.initialize_app(cred, {
'databaseURL': 'https://tu-proyecto.firebaseio.com/'
})
ref = db.reference('demo')
print(ref.get())
print ('Ok !')
$ sudo python test_fire.py
5. PLANO ESQUEMÁTICO
5. CREAR CÓDIGO PYTHON
$ mkdir iot
$ cd iot
$ sudo nano main.py
Ver el código en el siguiente enlace
https://github.com/rpi-jefer/rpio_iot_android_python/blob/master/python/main.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# autor: Jefferson Rivera
# Abril de 2018
# email: [email protected]
import sys
from time import sleep
import signal
from gpiozero import LED, Button
from threading import Thread
import firebase_admin
from firebase_admin import credentials
from firebase_admin import db
LED = LED(17)
BUTTON = Button(27)
PAHT_CRED = '/home/pi/iot/cred.json'
URL_DB = 'https://rpi-demo-e24dd.firebaseio.com/'
REF_HOME = 'home'
REF_LUCES = 'luces'
REF_BOTONES = 'botones'
REF_LUZ_SALA = 'luz_sala'
REF_PULSADOR_A = 'pulsador_a'
class IOT():
def __init__(self):
cred = credentials.Certificate(PAHT_CRED)
firebase_admin.initialize_app(cred, {
'databaseURL': URL_DB
})
self.refHome = db.reference(REF_HOME)
#self.estructuraInicialDB() # solo ejecutar la primera vez
self.refLuces = s
elf.refHome.child(REF_LUCES)
self.refLuzSala = self.refLuces.child(REF_LUZ_SALA)
self.refBotones = s
elf.refHome.child(REF_BOTONES)
self.refPulsadorA = self.refBotones.child(REF_PULSADOR_A)
def estructuraInicialDB(self):
self.refHome.set({
'luces': {
'luz_sala':True,
'luz_cocina':True
},
'botones':{
'pulsador_a':True,
'pulsador_b':True
}
})
def ledControlGPIO(self, estado):
if estado:
LED.on()
print('LED ON')
else:
LED.off()
print('LED OFF')
def lucesStart(self):
E, i = [], 0
estado_anterior = self.refLuzSala.get()
self.ledControlGPIO(estado_anterior)
E.append(estado_anterior)
while True:
estado_actual = self.refLuzSala.get()
E.append(estado_actual)
if E[i] != E[-1]:
self.ledControlGPIO(estado_actual)
del E[0]
i = i + i
sleep(0.4)
def pulsador_on(self):
print('Pulsador On')
self.refPulsadorA.set(True)
def pulsador_off(self):
print('Pulsador Off')
self.refPulsadorA.set(False)
def botonesStart(self):
print('Start btn !')
BUTTON.when_pressed = self.pulsador_on
BUTTON.when_released = self.pulsador_off
print ('START !')
iot = IOT()
subproceso_led = Thread(target=iot.lucesStart)
subproceso_led.daemon = True
subproceso_led.start()
subproceso_btn = Thread(target=iot.botonesStart)
subproceso_btn.daemon = True
subproceso_btn.start()
signal.pause()
$ sudo python main.py
Código en GitHub
https://github.com/rpi-jefer/rpio_iot_android_python/blob/master/python/main.py
5. EJECUTAR EL SCRIPT AL ARRANCAR EL SISTEMA
OPERATIVO.
Instalar Supervisor
$ sudo apt-get install supervisor
Crear el archivo de configuración.
$ sudo nano /etc/supervisor/conf.d/iot.conf
Agregamos:
[program:iot]
command=sudo python /home/pi/iot/main.py
autostart=true
autorestart=true
stderr_logfile=/var/log/iot.err.log
stdout_logfile=/var/log/iot.out.log
Damos permiso de ejecución al archivo main.py
$ sudo chmod 755 /home/pi/iot/main.py
Ahora reiniciamos
$ sudo reboot
Y con esto ya tenemos la aplicación ejecutándose al iniciar la Raspberry
Pi.
@autor: Jefferson Rivera
[email protected] Bogotá Abril de 2018