
Raspberry Pi – Notificando correos electrónicos nuevos y citas del calendario
Hace tiempo que quería pasaros un par de scripts que suelo usar para que una Raspberry Pi que tengo conectada a un altavoz me hable; en este documento únicamente veremos cómo configurar la Pi para que nos hable por el altavoz y nos diga si hemos recibido algún correo electrónico, y si es así nos indicará el remitente y el asunto del correo; así como si tenemos alguna cita en el calendario en los próximos 5 minutos, nos lo recordará por el altavoz!
Convirtiendo el texto en voz,
Empezamos montando el sistema que nos hablará, mediante un conversor de texto a voz, un Text-to-Speech (TTS) usaremos el sintetizador de voz ‘festival’, lo instalaremos en nuestra Raspberry Pi, que es compatible con cualquier idioma, posteriormente nos bajaremos los dífonos en castellano desde la forja de guadalinex, tendremos dos voces, una femenina (Silvia) y otra masculina (Pedro), cada cual que use la que más le guste 😉
Instalamos festival en nuestras Raspberry Pi:
[sourcecode language=”plain”]sudo apt-get -y install festival[/sourcecode]
Si queremos usar la salida 3,5 del jack de audio para el sonido en vez del HDMI ejecutaremos:
[sourcecode language=”plain”]amixer cset numid=3 1[/sourcecode]
Será interesante poner bien el volumen que queremos oir, y grabamos los cambios:
[sourcecode language=”plain”]alsamixer
sudo alsactl store[/sourcecode]
Bien, ahora descargaremos los idiomas que nos interesen, poner el que queráis, os dejo en orden primero voz femenina y el otro la masculina. Además los instalamos e indicamos en el fichero de configuración cual usar:
[sourcecode language=”plain”]
wget https://github.com/guadalinex-archive/hispavoces/raw/master/packages/festvox-sflpc16k_1.0-1_all.deb
wget https://github.com/guadalinex-archive/hispavoces/raw/master/packages/festvox-palpc16k_1.0-1_all.deb
sudo dpkg -i festvox-sflpc16k_1.0-1_all.deb
sudo dpkg -i festvox-palpc16k_1.0-1_all.deb
sudo vim /etc/festival.scm [/sourcecode]
Al final añadimos la que nos interese, y comentamos las demás:
[sourcecode language=”plain”];(set! voice_default ‘voice_JuntaDeAndalucia_es_pa_diphone)
(set! voice_default ‘voice_JuntaDeAndalucia_es_sf_diphone)[/sourcecode]
Y ya podremos probar a convertir un texto en audio con:
[sourcecode language=”plain”]echo Hola manolo que tal estas | festival –tts[/sourcecode]
Si nos interesa, podremos generar un script que al ejecutarlo con un parámetro nos lea dicho parámetro, más útil para luego llamarlo desde otros scripts, en mi caso le llamo ‘textoAvoz.sh’:
[sourcecode language=”plain”]echo $1 | festival –tts[/sourcecode]
Leer calendario desde la Raspberry Pi,
Si queremos leer nuestro calendario, la mejor experiencia la he tenido con ‘gcalcli’, ya que se puede gestionar cualquier calendario, podremos agregar tantos calendarios a nuestra cuenta de Gmail que nos interesen, sean de nuestros Exchange u otros sistemas, así como suscribirnos a calendarios que nos interesen…
Instalamos gcalcli o
[sourcecode language=”plain”]sudo apt-get install git python-pip python-gdata python-dateutil python-gflags python-vobject python-parsedatetime
sudo pip install gcalcli[/sourcecode]
Una vez instalado, ejecutaremos el siguiente comando para obtener la URL que nos permita obtener el código de activación y darle permisos en nuestra cuenta de Gmail. Ejecutamos el siguiente comando y abrimos la URL en un navegador, pegaremos el código y listo!
[sourcecode language=”plain”]gcalcli list –noauth_local_webserver[/sourcecode]
Probamos a ver si vemos los calendarios de nuestra cuenta:
[sourcecode language=”plain”]gcalcli list[/sourcecode]
Y probamos a que nos muestre si tenemos eventos en los próximos 15 minutos:
[sourcecode language=”plain”]gcalcli remind 15 ‘echo %s'[/sourcecode]
Creamos el siguiente script ‘lee_calendario.sh’ y lo hacemos ejecutable:
[sourcecode language=”plain”]
#!/bin/bash
CITA=`/usr/local/bin/gcalcli remind 4 ‘echo %s’ –cal=Personal`
echo $CITA
if [ "$CITA" == "" ]; then
echo "No hay citas"
else
echo "Hay citas"
HORA=$(cut -c-7 <<< "$CITA")
echo $HORA
ASUNTO=${CITA:7:1000}
FRASE1="Hector, en cinco minutos, a las "
FRASE2=" acuerdate de "
FRASE="$FRASE1 $HORA $FRASE2 $ASUNTO"
echo $FRASE
echo $FRASE | /usr/bin/festival –tts
fi
[/sourcecode]
Y probamos a ejecutarlo!
[sourcecode language=”plain”]./lee_calendario.sh[/sourcecode]
Lo ponemos en crontab para que se ejecute cada 5 minutos y listo!
[sourcecode language=”plain”]*/5 * * * * /home/pi/lee_calendario.sh[/sourcecode]
Leer el mail desde la Raspberry Pi,
Con este sencillo script de python podremos obtener los mails no leidos mediante una conexión IMAP a nuestro servidor de correo, nos leerá el remitente y el asunto de cada correo. Creamos el archivo ‘lee_mail.py’:
[sourcecode language=”plain”]
import imaplib
from email.header import decode_header
mail = imaplib.IMAP4_SSL(‘FQDN_SERVIDOR_CORREO’)
mail.login(‘USUARIO@DOMINIO’, ‘CONTRASEÑA’)
mail.select(‘INBOX’, readonly=True)
typ, new = mail.search(None, "UNSEEN")
new = new[0].split()
if len(new) > 1:
Mails = ‘Tienes ‘ + str(len(new)) + ‘ correos nuevos’
import subprocess
subprocess.call(["/home/pi/textoAvoz.sh", Mails])
elif len(new) == 1:
Mails = ‘Tienes un correo nuevo’
import subprocess
subprocess.call(["/home/pi/textoAvoz.sh", Mails])
if (len(new) > 0):
res = list()
res1 = list()
for msg in new:
typ, data = mail.fetch(msg, ‘(BODY[HEADER.FIELDS (SUBJECT)])’) # FROM, DATE, etc
data = data[0][1].strip()
decoded = decode_header(data[9:])[0] # "Subject: " is 9 characters long
text = decoded[0].replace("\r\n", "")
if (decoded[1] != None):
text = unicode(text, decoded[1])
res.append(text.encode(‘utf-8’))
typ, data1 = mail.fetch(msg, ‘(BODY[HEADER.FIELDS (FROM)])’) # FROM, DATE, etc
data1 = data1[0][1].strip()
Arroba = data1.index(‘<‘)
decoded1 = decode_header(data1[6:Arroba-1])[0] # "Subject: " is 9 characters long
text1 = decoded1[0].replace(‘"’, "")
if (decoded1[1] != None):
text1 = unicode(text1, decoded1[1])
res1.append(text1.encode(‘utf-8’))
text1 = unicode(text1)
text = unicode(text)
import unicodedata
text1output = unicodedata.normalize(‘NFKD’, text1).encode(‘ascii’,’ignore’)
textoutput = unicodedata.normalize(‘NFKD’, text).encode(‘ascii’,’ignore’)
Texto = ‘"Correo de ‘ + text1output + ‘, con asunto: ‘ + textoutput + ‘"’
print (Texto)
import subprocess
subprocess.call(["/home/pi/textoAvoz.sh", Texto])
[/sourcecode]
Recordamos hacerlo ejecutable, ponerlo en el cron igualmente si nos interesa con la programación que nos interese.
Fácil y sencillo cómo saber si tenemos citas en el calendario o mails y queremos que una dulce voz nos lo indique! Espero que lo disfrutéis!