Published
Edited
Sep 13, 2019
Insert cell
md`# # Magic Mirror Codigo Facilito Course

Temario

## Bloque 1: Bienvenida
- [x] 1 Bienvenida al Curso
- [x] 2 Qué es un Magic Mirror?
- [x] 3 Materiales
- [x] 4 Que vamos a construir?
- [x] 5 Recomendaciones Previas

## Bloque 2: Configuración de Raspberry Pi
- [x] 6 Descarga Instalación de SO Buster
- [x] 7 Configuración SSH
- [x] 8 Configuración VNC
- [x] 9 Configuración del Display
- [x] 10 Respaldo de SD

## Bloque 3 Magic Mirror
- [x] 11 Instalación del MM
- [x] 12 Inicio desde Arranque
- [x] 13 Orientación de la Pantalla
- [x] 14 Modo Sleep
- [x] 15 Update del MM

## Bloque 4 Modulos de MM
- [x] 16 Reloj
- [x] 17 Open Weather
- [x] 18 Calendar
- [x] 19 Compliments

## Bloque 5 Modulos de Terceros
- [x] 20 Galeria de Fotos
- [x] 21 ScreenCast
- [x] 22 Youtube Playlist
- [x] 23 Google Photos
- [x] 24 Remote Control

## Bloque 6 Hey Google!
- [x] 25 Google Assistant API
- [ ] 26 Device Registration
- [ ] 27 Device Registration Troubles
- [ ] 28 Ajustes de audio
- [ ] 29 Test
- [ ] 30 Para activar el entorno de assistant
- [ ] 31 Getting the Google Assistant to start on start up

## Bloque 7 Despedida
- [ ] 32 Demo
- [ ] 33 ¿Que Aprendimos?
- [ ] 34 Recursos
- [ ] 35 Despedida

-----------------------------------------------

## Bloque 1 Bienvenida

### Bienvenida

Los espejos inteligentes vienen directamente de la ciencia ficción. Forman parte de una visión optimista del futuro que imagina un mundo donde las pantallas y los datos están por todas partes, listos para brindarnos cualquier información que necesitemos en cualquier momento.

Sin embargo no solo en escenarios de ciencia ficción los hemos visto, van desde peliculas infantiles, conciertos, centros comerciales hasta sistemas de entretenimiento. Eso habla del amplio mercado que tienen estos dispositivos, algunos con mayor cantidad de features que otros, dependiendo de la industria a la que sean aplicados.

Por ejemplo podremos encontrar dispositivos tactiles, con inteligencia artificial, vision computacional, conexión a internet e incluso algunos capaces de controlar tu sistema domotico.

Resulta que construir tu propio espejo inteligente no es solo ciencia ficción, en realidad es realmente fácil armar uno.

Aquí se aprenderemos cómo construir uno tu mismo, instalar y configurar sus modulos, instalar actualizaciones, ademas instalaremos algunos modulos de terceros como:
* Hacer el stream de tu telefono al espejo sin un chromecast
* Configurar tu calendario de Google
* Visualizar tus albumes favoritos de Google Photos
* Conectarlo con Google Assistant, asi que si ya construiste tu propio Google Home estas un paso adelante, sino aqui aprenderemos como, ademas de integrarlo como modulo a nuestro espejo.
* Además de controlarlo via remota desde tu telefono o computadora

Así que no esperes a que algún Kickstarter aleatorio actúe y te venda un espejo inteligente mejor comencemos a construir nuestro propio Magic Mirror.

### ¿Qué es un MM?
MagicMirror² es una plataforma de espejo inteligente con un sistema de modulos Open Source.

Con una larga lista de módulos instalables, MagicMirror² nos permite convertir nuestro espejo del pasillo o del baño en su asistente personal.

http://magicmirror.builders

### Materiales

Para este curso necesitaremos:

* Raspberry Pi 2, 3B o B+
* Micro SD 8, 16GB
* Fuente de Alimentación
* Display
* Microfono USB o el Mic de una Camara
* Speaker

### Que vamos a construir
Diagrama del Curso

### Recomendaciones Previas
Del carton, del espejo, del internet, del sistema

---------------------------------------------------------------------------

## Bloque 2: Configuración de Raspberry Pi

### Descarga Instalación de SO Buster

[Link de descarga](https://www.raspberrypi.org/downloads/raspbian/)

### Configuración SSH

Lo primero que haremos será trabajar con nuestra raspberry pi por ssh, vnc o si lo prefieren con un display.

Ejecutamos nuestro script de actualizacion.

Para trabajar la raspberry por ssh debemos descargar un sofware llamado putty que nos permitira hacer la conexión, ademas de saber la direccion Ip de nuestro dispositivo.
Para ello iremos a la terminal y ejecutaremos el siguiente comando:

hostname -I
El cual nos dará el numero de nuestra ip.

Ahora debemos habilitar la conexión, esto lo podemos hacer de manera grafica o por consola.

* Graficamente: Menu > Preferences > Raspberry Pi Configuration > Interfaces.
* SSH -> Enable
* Aceptar
* Por consola: sudo raspi-config
* Interfacing Options -> SSH - Enable -> Yes


Posteriormente procederemos a descargar putty de el siguiente [link](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)

Ahora que tenemos instalado putty debemos abrirlo y en donde dice host escribiremos la direccion ip.
Le damos click en conectar y si es la primera vez que te conectas por este medio nos aparecera un letrero, damos click en Yes y nos aparecera la terminal.

Para tener acceso debemos ingresar las credenciales, por defecto suelen ser las siguientes.

user: pi, raspberry, pi
Pass: pi, pi, raspberry
Listo, ahora nuestra terminal debera mostrar lo siguiente:

pi@raspberrypi: ~/

De lo contrario la contraseña o el usuario son incorrectos y deberás repetira la configuración.

### Configuración VNC

Si eres de los que prefieren utilizar una interfaz gráfica en el lugar de una linea de comandos, puedes reccurrir al uso del VNC.

Para ello deberas iniciar tu sistema.

Abrir la terminal y ejecutar el siguiente comando:

sudo apt-get install realvnc-vnc-server realvnc-vnc-viewer
Ahora debemos habilitar la conexión, esto lo podemos hacer de manera grafica o por consola.

* Graficamente: Menu > Preferences > Raspberry Pi Configuration > Interfaces.
* VNC -> Enable
* Aceptar
* Por consola: sudo raspi-config
* Interfacing Options -> VNC - Enable -> Yes

Una vez que nuestra conexion por VNC esta habilitada, en nuestra computadora personal, instalaremos el [VNC Viewer](https://www.realvnc.com/es/connect/download/viewer/windows/) que, como su nombre lo indica nos permite visualizar el escritorio de nuestra raspberry.

### Configuración del Display
[Link al Driver](http://www.lcdwiki.com/How_to_install_the_LCD_driver)

### Especificaciones del Case DYI

Explicar la plantilla y el montaje

-----------------------------------------------------------------------------

## Bloque 3 Magic Mirror
### Instalación del MM

[Instrucciones](https://howchoo.com/g/ntcymzbimjv/how-to-install-magic-mirror-on-your-raspberry-pi)
* Abrimos la terminal
* Pegamos el siguiente comando

bash -c "$(curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/master/installers/raspberry.sh)"

* Si no empieza automaticamente lo podemos iniciar con el siguiente comando

cd ~/MagicMirror && DISPLAY=:0 npm start

### Inicio desde Arranque

Start Magic Mirror on System Boot

* Para iniciar desde el arranque del sistema hacemos lo siguiente:
pm2 startup
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi

* Hacemos un script de arranque
cd ~
nano mm.sh

* Agregamos lo siguiente:
cd ~/MagicMirror
DISPLAY=:0 npm start

* Hacemos el ejecutable
chmod +x mm.sh

* Ahora forzamos el reinicio de nuestro servicio
pm2 start mm.sh

* Ahora reiniciamos la rpi
sudo reboot

### Orientación de la Pantalla

* Para cambiar la orientacion de la pantalla:
sudo nano /boot/config.txt

* Añadimos la siguiente linea:
// rotate the screen
display_rotate=1 # use lcd_rotate=3 to rotate in the other direction

### Modo Sleep

* Abrimos la terminal y escribimos el siguiente comando:
sudo nano ~/.config/lxsession/LXDE-pi/autostart

* Agregamos las siguientes lineas:
@xset s 0 0
@xset s noblank
@xset s noexpose
@xset dpms 0 0 0

* Update del MM

* Ve al directorio
cd MagicMirrror

* Ejecuta el siguiente comando
git pull && npm install

* Ensamble del Espejo
Dibujo de como va
----------------------------------------------------------------------------------

## Bloque 4 Modulos de MM
### Reloj

* Abre la Terminal
* Ve al directorio
cd MagicMirror

* Abre un editor de Texto del archivo config.js
nano config.js

* Revisamos la estructura de nuestro modulo
modules: [
{
module: "clock",
position: "top_left", // This can be any of the regions.
config: {
// The config property is optional.
// See 'Configuration options' for more information.
}
}
]

* Los parametros a modificar son:
* timeFormat: 12 -24
* displaySeconds: true o false, que se vean o no
* showPeriod: true o false
* showPeriodUpper:true o false
* clockBold
* showDate
* showWeek
* dateFormat see docs
* displayType: digital, analog
* analogSize
* analogFace
* secondsColor
* analogPlacement
* analogShowDate
* timezone

* Validamos el JSON

### Open Weather

[Link al Modulo](https://github.com/MichMich/MagicMirror/tree/master/modules/default/currentweather)

Para poder configurar el modulo de Open Weather necesitamos un par de datos, que son:
Location ID y Appid

Primero vamos al siguiente link de [Open Weather Map](https://openweathermap.org/)
* Creamos una cuenta
* Damos si a todo
* No soy un robot
* Aceptar
* Damos el nombre de nuestro proyecto
* Widget
* Aceptar

#### Application ID (appid)
* Para obtenerlo le damos click en SIGN IN
* Despues en Api Key
* Tomamos la de default
* 989900dd52a6c3bd916eae48a196a55f

#### Location ID
El link que nos proporciona está mal, así que les mostrare como se busca el location id por que si les paso un link y lo cambian de nuevo, entonces ya no sabran como obtenerlo, bien.
* Nos iremos a API
* Debajo de Current Weather Data seleccionamos API Docs
* Navegamos hasta encontrar By City ID
* Damos click en el link que nos da
* Seleccionamos City List Json que es el primero.
* Lo abrimos con wordpad
* Buscamos nuestra ciudad con el buscador
* Copiamos la long y lat y lo corroboramos en [Latlong](https://www.latlong.net/Show-Latitude-Longitude.html)

"lon": -100.930832,
"lat": 21.156111

* Mi id es: 4023117

* Validamos el Json

### Calendar

* Abre la Terminal
* Ve al directorio
cd MagicMirror

* Abre un editor de Texto del archivo config.js
nano config.js

* Revisamos la estructura de nuestro modulo
modules: [
{
module: "calendar",
position: "top_left", // This can be any of the regions. Best results in left or right regions.
config: {
// The config property is optional.
// If no config is set, an example calendar is shown.
// See 'Configuration options' for more information.
}
}
]

* Validamos el Json

### Compliments

Es lo mismo que los demas, lee la doc

------------------------------------------------------------------------------

## Bloque 5 Modulos de Terceros

### Galeria de Fotos
See on Raspberry
[Link al Modulo](https://github.com/AdamMoses-GitHub/MMM-ImageSlideshow)

### BackGround Gallery
[Por si la cagas](https://github.com/darickc/MMM-BackgroundSlideshow)

### ScreenCast
[Link al modulo](https://github.com/kevinatown/MMM-Screencast)

Uno de los modulos que mas lucen definitivamente es el de ScreenCast asi que veamos como configurarlo.
Te permite stremear cualquier video de youtube, como si fuera un autentico Chromecast.

* Lo primero es ir al link del modulo
* En la raspberry acceder al siguiente directorio cd MagicMirror/modules
* Ya en la carpeta modules, clonar el repositorio git clone https://github.com/kevinatown/MMM-Screencast.git
* Ahora ir al siguiente directorio cd MMM-Screencast
* Correr el siguiente comando npm install
* Regresar al directorio modules
* Ir al archivo de configuracion cd config/config.js
* Abrir el archivo con un editor de texto nano config.js
* Agregar lo siguiente:

var config = {
modules: [
{
module: 'MMM-Screencast',
position: 'bottom_right', // This position is for a hidden <div /> and not the screencast window
config: {
position: 'bottomRight',
height: 300,
width: 500,
}
}
]
}

* Revisar el JSON

### Google Photos

[Link al Modulo](https://github.com/eouia/MMM-GooglePhotos)

Modulo para la conexion de Google Photos API con nuestro Magic Mirror

Para ello haremos lo siguiente:

* Abrimos la terminal de la Raspberry
* Nos vamos al directorio cd MagicMirror/modules
* Clonamos el repositorio del modulo

git clone https://github.com/eouia/MMM-GooglePhotos.git
* cd MMM-GooglePhotos
* Instalamos el modulo npm install

Ahora requerimos de 2 elementos para poder configurar nuestro modulo *Auth y AlbumID*

* Nos dirigimos al [Google API Console](https://console.developers.google.com/apis/)
* Nos vamos a la barra de menu, creamos un nuevo proyecto
* Luego APIs & Servicios > Bibliotecas
* Buscamos "Photos Library API"
* Seleccionamos "Habilitar"
* Del lado izquierdo, en las "Credenciales"
* Seleccionamos "+ Crear Credenciales"
* Seleccionamos el tipo de credencial "ID OAUTH"
* Seleccionamos "otro"
* y crear

A mi me arrojo 2 datos bien raro estos:

ID Cliente
473063027960-dm676sf16m1pbjkoq2r8jai8hgbkmmd8.apps.googleusercontent.com

Secreto del Cliente
Este es tu ID de cliente

* Descargamos las credenciales .json y las renombramos a credentials.json
* Luego nos dirigimos al directorio MMM-GooglePhotos y pegamos nuestro json ahi
* Ahora en la terminal escribimos el siguiente comando

node auth_and_test.js

* Y nos va abrir una ventana en el chromium para loguearnos con nuestra cuenta de google y dar autentificacion del proceso.
* Después de eso aparecera un numero, copialo y pegalo en la consola
* Ahora ya nos mostrara la lista de albumes que tenemos en google photos y su numerito que nos faltaba
* Copia el numero del id del album que quieres mostrar
* Ahora abrimos la consola
* Abrimos el editor de texto
* nano config.js
{
module: "MMM-GooglePhotos",
position: "top_right",
config: {
albumId: ["YOUR_GOOGLE_PHOTOS_ALBUM_ID","NEXT_GOOGLE_PHOTOS_ALBUM_ID"],
refreshInterval: 1000*60,
scanInterval: 1000*60*10, // too many scans might cause API quota limit also.
//note(2018-07-29). It is some weird. API documents said temporal image url would live for 1 hour, but it might be broken shorter. So, per 10 min scanning could prevent dead url.

sort: "time", //'time', 'reverse', 'random'
showWidth: "800px", // how large the photo will be shown as. (e.g;'100%' for fullscreen)
showHeight: "600px",
originalWidthPx: 800, // original size of loaded image. (related with image quality)
originalHeightPx: 600, // Bigger size gives you better quality, but can give you network burden.
mode: "hybrid", // "cover" or "contain" (https://www.w3schools.com/cssref/css3_pr_background-size.asp)
//ADDED. "hybrid" : if you set as "hybrid" it will change "cover" and "contain" automatically by aspect ratio.
}
},

* Revisar el JSON

### Google Calendar Module

[Link al Modulo](https://github.com/MichMich/MagicMirror/tree/master/modules/default/calendar)

Para configurar el modulo de Google Maps

Estructura Básica

config: {
colored: false,
coloredSymbolOnly: false,
calendars: [
{
url: 'http://www.calendarlabs.com/templates/ical/US-Holidays.ics',
symbol: 'calendar',
auth: {
user: 'username',
pass: 'superstrongpassword',
method: 'basic'
}
},
],
}

Y nos va a pedir 3 datos, la url, nuestro usuario de google y nuestro pass de google.

Para obtener nuestro iCal, nos vamos a google calendar.

* [Google Calendar](https://calendar.google.com/calendar/r?pli=1)
* En el engrane, seleccionamos configuración
* Ahora seleccionamos el calendario que queremos usar
* Hacemos scroll down
* Buscamos la opcion "Dirección pública en formato iCal" y copiamos el [url](https://calendar.google.com/calendar/ical/monsh8a%40gmail.com/public/basic.ics)
* Después la pegamos en donde dice url
* Agregamos nuestro usuario de google
* Nuestra contraseña de google

### Youtube playlist
[Link al modulo](https://github.com/nitpum/MMM-EmbedYoutube)

* Para instalar el modulo hacemos
git clone
* Nos vamos al directorio
cd modules
* Ejecutamos el comando
npm install
* Nos vamos al directorio
cd config
* Abrimos config.js con nano
nano config.js
* Agregamos lo siguiente para un solo video
{
module: "MMM-EmbedYoutube",
position: "middle_center",
config: {
video_id: "EtIK7Ztc4a0",
loop: true
}
}

* Para un playlist
{
module: "MMM-EmbedYoutube",
position: "bottom_bar",
config: {
video_id: "EtIK7Ztc4a0",
video_list: [
"s3YEYMSqC4",
"S0MW45jXjVY",
"OzR2mfpbjYI",
"sdbl-LpIoQI",
"UkkKbVRN548"
],
autoplay: true,
loop: true
}
}

### Remote Control

[Link a la app](https://github.com/Jopyth/MMM-Remote-Control)

Con este modulo podremos realizar la configuracion necesaria para trabajar nuestro magic mirror desde nuestro telefono celular.
Para ello haremos lo siguiente:

* Ir al link del modulo
* Copiar el comando de Quick installation

bash -c "$(curl -s https://raw.githubusercontent.com/Jopyth/MMM-Remote-Control/master/installer.sh)"

* En nuestra raspberry abrimos la terminal
* Nos vamos al directorio MagicMirror cd MagicMirror
* Seguido al directorio modules cd modules
* Ahora pegamos el comando del Quick Installation
* Presionamos y de yes, y, n
* Seleccionamos Y para ver las instrucciones
* Vamos siguiendo los pasos
* Copiamos el module
* Abrimos la terminal
* Nos vamos a cd MagicMirror
* Con un editor abrimos el archivo config.js
* nano config.js y añadimos el module
* Descomentamos la linea de position
* Verificamos el Json con JSON FORMATTER
* Ahora debemos buscar en el VAR config la variable address
* Copiar el siguiente valor address: "localhost" -> address: "0.0.0.0"
* Cambiar el whitelist address por lo siguiente //ipWhiteList: ["127.0.0.1","fff:127.0.0.1", ":::1"], -> ipWhiteList: [],
* Una vez realizados estos pasos continuamos
* Escribimos y/ Yes para finalizar la configuracion del modulo
* Para finalizar reiniciamos el servicio con

cd ~/MagicMirror && DISPLAY=: 0 npm start
pm2 restart MagicMirror

##### Configuracion del celular

Para la configuracion de la webapp en el telefono debemos escribir la siguiente direccion url

http://192.168.xxx.xxx:8080/remote.html

Donde escribiremos la dirección ip a la que se conecta a la red nuestra raspberry pi

-----------------------------------------------------------------------------

## Bloque 6 Hey Google!

#### Google Assistant Module
[Link al video](https://www.youtube.com/watch?v=Mlb2EyzlZRE)
[Link al Modulo](https://github.com/gauravsacc/MMM-GoogleAssistant)

[To Configure as Google Home](https://pimylifeup.com/raspberry-pi-google-assistant/)
[If we have some error she knows how to fix them](https://medium.com/@janne.spijkervet/your-own-raspberry-pi-google-assistant-1434be9eac99)

Lo primero que debemos hacer es abrir el navegador por que necesitamos habilitar el API

[Link consola](console.cloud.google.com/cloud-resource-manager)
Registrando el Google API

Antes de comenzar con la configuración del código de Google Assistant en la Raspberry Pi, primero debemos registrarnos y configurar un proyecto en la Consola de acciones de Google.

Con su cuenta de Google lista para ir al panel de Acciones de la Consola de Google, o simplemente vaya a la URL a continuación que lo llevará allí.

[Actions on Google Console](https://console.actions.google.com)

Ya que hemos iniciado sesión haremos lo siguiente:

* Click en ** Add/Import project **
* Asignar un Nombre de Proyecto
Una vez creado el proyecto debemos habilitar el API de Google Assistant

* En una nueva ventana abrimos [API GA](https://console.developers.google.com/apis/library/embeddedassistant.googleapis.com)

Ahora que nuestra API ha quedado habilitada podemos continuar en nuestra consola de Actions on Google.

#### Device Registration

Pasos cuando es la primera vez que lo registramos.

Seleccionamos en la parte inferior la opción **Device Registration** y posteriormente seleccionaremos **Register Model**. Lo cual nos llevara a la siguiente pantalla e ingresaremos los siguientes datos:

* Product Name "Simple descripción de para que lo queremos"
* Manufacture Name "En caso de que quieran distribuir en masa podemos colocar aquí el nombre de nuestra marca, en mi caso escribiré CódigoFacilito"
* Device Type "Speaker, por que es lo que más se acerca al uso que le vamos a dar."
* Device Model ID "Asegurate de copiar este dato por que lo requeriremos más adelante"

Ahora que ya hemos terminado nos mostrará la opción para descargar las credenciales, estas credenciales son importantes ya que nuestra raspberry pi las necesita para poder hablar con el server de Google Assistant

Para ello vamos a dar clic en **Download OAuth 2.0 credentials**

Devemos asegurarnos de tener este archivo en nuestra Raspberry Pi.

#### Device Registration Troubles

En el caso de que tengamos un dispositivo previamente registrado debemos hacer lo siguiente:

[Registration Tool](https://developers.google.com/assistant/sdk/reference/device-registration/device-tool)

#### Ajustes de audio

Para revisar los micros
1 tarjeta, 0 device
arecord -l

Para speakers
aplay -l


Para configurar
nano /home/pi/.asoundrc

pcm.!default {
type asym
capture.pcm "mic"
playback.pcm "speaker"
}
pcm.mic {
type plug
slave {
pcm "hw: 1,0"
}
}
pcm.speaker {
type plug
slave {
pcm "hw:0,1"
}
}

#### Test

Test Audio

speaker-test -t wav

Test Microfono

arecord --format=S16_LE --duration=5 --rate=16000 --file-type=raw out.raw

Para reproducir lo grabado

aplay --format=S16_LE --rate=16000 out.raw

Volumen

alsamixer


#### Para activar el entorno de assistant

source env/bin/activate


* Push to talk

googlesamples-assistant-pushtotalk

###### Hotword
Este es un caso complicado
Anteriormente....

googlesamples-assistant-hotword --device-model-id jarvis

Ahora... ESTE COMANDO FUNCIONA EN EL PATH

cd espejo/lib/python3.7/site-packages/googlesamples/assistant/library

Porque... [En el Assistant Service](https://github.com/googlesamples/assistant-sdk-python)
Encontraran que en el sdk, samples, library aparece el [hotword](https://github.com/googlesamples/assistant-sdk-python/blob/master/google-assistant-sdk/googlesamples/assistant/library/hotword.py)
Y lo demas está en el [grpc](https://github.com/googlesamples/assistant-sdk-python/tree/master/google-assistant-sdk/googlesamples/assistant/grpc)

python -m hotword --device_model_id <deviceid>

python -m hotword --device_model_id magicmirror-249622-magic-ei071c

Si no funciona....

* Listar modelos
googlesamples-assistant-devicetool --project-id magicmirror-249622 list --model

* Listar dispositivos
googlesamples-assistant-devicetool --project-id magicmirror-249622 list --device

* Borrar dispositivo
googlesamples-assistant-devicetool --project-id magicmirror-249622 delete --device 7070f5de-be64-11e9-b4d6-b827ebdbfc8f

* Borrar modelo
googlesamples-assistant-devicetool --project-id magicmirror-249622 delete --model magicmirror-249622-magicmirror-ps9280

* Registrar
googlesamples-assistant-devicetool --project-id project_id register-device --device device_id --model model_device_id --nickname margic --client-type LIBRARY

*BIBLIOTECAS QUE INSTALE*

python -m pip install --upgrade pip setuptools wheel
python -m pip install --upgrade google-assistant-library==1.0.0
python -m pip install --upgrade google-assistant-sdk[samples]==0.5.1

#### Getting the Google Assistant to start on start up

Para que nuestro Assistant funcione desde el arranque deberemos...

* Abrir la terminal
* Crear un archivo en un editor

nano /home/pi/start_assistant.sh

* Agregamos las siguientes lineas

#!/bin/bash

source /home/pi/espejo/bin/activate
cd espejo/lib/python3.7/site-packages/googlesamples/assistant/library
python -m hotword --device_model_id magicmirror-249622-magic-ei071c
//googlesamples-assistant-hotword --device-model-id <deviceid>

La primera linea es para decirle que lo debe correr con bash y la segunda linea usamos source para leer y ejecutar los comandos de activacion de nuestro archivo, en el entorno virtual que ya creamos antes.

* Presionamos

Ctrl + x

* Decimos Yes

y

* Enter, con eso guardamos y salimos

* Ahora que ya tenemos el archivo vamos a crear el servicio que lo va a ejecutar.

sudo nano /lib/systemd/system/assistant.service

* Agregamos lo siguiente:

[Unit]
Description=Google Assistant
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/bin/bash /home/pi/start_assistant.sh
Restart=on-abort
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

* Guardamos y salimos
* Ahora habilitamos el servicio

sudo systemctl enable assistant.service

* Y lo iniciamos

sudo systemctl start assistant.service

* Ahora somos capaces de comunicarnos con nuestro Assistant

Hey Google, Ok Google

* Para conocer el estatus de nuestro Assistant

sudo systemctl status assistant.service

-----------------------------------------------------------------------------------
## Bloque 7 MMM Assistant Module

#### Instalando el modulo de Assistant
* Primero necesitamos crear una cuenta en [PubNub](https://admin.pubnub.com/#/register)
* Crear una app para obtener dos datos publish, suscriber keys, que necesitamos para configurarlo en el config.js del MM
* Reemplazamos los keys aqui
pi/assistant.py
* Nos vamos al siguiente directorio
cd MagicMirror/modules
* Ahi clonamos el siguiente [repositorio](git clone https://github.com/gauravsacc/MMM-GoogleAssistant.git)
* Nos vamos al directorio
cd MagicMirror/modules/MMM-GoogleAssistant
* Ejecutamos el siguiente comando
npm install

#### Verificando la Instalacion del modulo
Ahora vamos a probar que efectivamente nuestro assistant funciona para ello:
* Nos iremos al siguiente directorio:
cd MagicMirror/modules/MMM-GoogleAssistant/pi/

* Vamos a editar el archivo *assistant.py*
nano assistant.py

* Buscamos la funcion init_pubnub() para modificarla
subscribe key = pubnub que hicimos
publish key = pubnub que hicimos

#### Instalacion de Pubnub

* Ahora vamos a instalar PubNub y todas sus dependencias
pip install 'pubnub>=4.0.13'

* Ahora vamos a probarlo en python3
/home/pi/env/bin/python3 -u assistant.py

* y si todo sale bien deberemos ver el siguiente mensaje
"hello from python"

* Presionamos Ctrl + c para salir de ahi.

Nuestro assistant esta funcionando y se comunica con PubNub

#### Configuración del Modulo

* Ahora nos iremos al siguiente directorio
cd MagicMirror/config/config.js

* Editamos el archivo de configuracion
nano config.js

* Añadimos lo siguiente:

{
module: "MMM-GoogleAssistant",
position: "top_right",
config: {
maxWidth: "100%",
header: "",
publishKey: 'YOUR_PUBNUB_PUBLISH_KEY',
subscribeKey: 'YOUR_PUBNUB_SUBSCRIBE_KEY',
updateDelay: 500
}
},

* En donde dice PublishKey: ponemos la clave del pubnub
* En donde dice Suscribe Key: ponemos la otra clave del pubnub
Agregando esas dos cosas, y el delay es de 500ms

#### Configuración del ShellScript

* Creamos un nuevo archivo
nano google_assitant.sh

* Agregamos lo siguiente
/home/pi/env/bin/python3 -u /home/pi/MagicMirror/modules/MMM-GoogleAssistant/pi/assistant.py
* Guardamos y salimos
* Le damos los permisos con
chmod +x google_assitant.sh
* Y ya con eso tenemos el ejecutable

Ahora queremos que esto se inicie cuando arranca la Raspberry

* Tengo un Archivo .sh de Assistant

* Ahi agrego el siguiente comando
/home/pi/google_assistant.sh

* Finalmente para verificar que no hay errores en nuestro config.js

* Nos vamos al siguiente directorio
cd MagicMirror/config

* Ahora lo comprobamos
npm run config:check

Y listo, ya con eso si no hay errores de sintaxis nos lo dira, solo busca errores sintacticos.

-----------------------------------------------------------------------------------
## Bloque 8 Despedida

### Recursos

* [How to develop modules](https://forum.magicmirror.builders/topic/8532/how-to-develop-modules)
* [Modules Repositories](https://github.com/MichMich/MagicMirror/blob/master/modules/README.md)
* [Tool to build Modules JSON](https://github.com/mykle1/MMM-UFO)
* [A complete guide for beginners to build modules](https://forum.magicmirror.builders/topic/8534/head-first-developing-mm-module-for-extreme-beginners)
* [3rd Party Modules](https://github.com/MichMich/MagicMirror/wiki/3rd-party-modules)

`
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more