Como escuchar Apple Music en un dispositivo Alexa

La música es la alegre sonrisa que endulza nuestro día a día. Hace unos años la forma tradicional para escuchar música era sintonizar una emisora de radio, o comprar en alguno de los formatos disponibles, según la época; vinilo, CD o casete de audio, nuestro grupo o solista preferido. Con la llegada de Internet y el desarrollo de tecnologías como el streaming, la tendencia actual para escuchar música es precisamente el uso del streaming.

Existen diferentes alternativas para poder escuchar millones de canciones en streaming; Apple Music, Amazon Music, Spotify, Pandora, Tidal o Soundcloud, por poner las más famosas y reconocidas.

Si tienes una cuenta en Apple Music, puedes pedirle a Alexa que ponga tu música favorita en tus dispositivos Alexa.

Para ello debes instalar la Skill de “Apple Music“. Una vez instalada debes configurar la skill para enlazarla con tu cuenta de Apple Music.

Una vez realizadas las acciones anteriores, ve a “Más / Configuración / Música“. Si Apple Music no te sale en la lista, pulsa en “Vincular servicio nuevo” y selecciona el servicio de Apple Music.

Para configurar el orden de los servicios predeterminados, pulsa sobre “Servicios predeterminados“. En la nueva pantalla selecciona el servicio que por defecto se iniciara en tu dispositivo al solicitar una canción o emisora de radio a Alexa.

El order actual es el que verás debajo de “Servicios predeterminados“.

También puedes decirle a Alexa con que servicio quieres que reproduzca una cación, pero el comando de voz es más largo, ejemplo: “Alexa pon una canción de Madonna en Apple Music“.

Share

Convertir Arduino en un controlador de dispositivos con Alexa

Vamos a convertir, una tarjeta Arduino Wemos (Con modulo wifi), utilizando un modulo de reles, en un accesorio para encender/apagar diferentes dispositivos; luces, ventiladores, calefactores, discos duros o cualquier otro dispositivo que se te ocurra.

Para realizar esta tarea nos hace falta:

  • Una tarjeta Wemos.
  • Un modulo de reles, puede ser de 1, 2, 4 u 8 reles.
  • Darnos de alta en la web https://sinric.com/
  • Instalar la skill Sinric en Amazon Alexa.

Sinric es una Api gratuita desde la que vamos a poder crear todos aquellos dispositivos que necesitemos controlar. Por cada dispositivo que creamos, Sinric asigna un ID para su identificación.

Para añadir un nuevo dispositivo pulsamos en el botón “ADD” de la sección “Smart Home Device“, se abrira un panel como el de la imagen superior.

  • Friendly Name. Es el nombre con el que invocaremos a Alexa, para gestionar nuestro dispositivo, encender / apagar.
  • Description. La descripción del dispositivo.
  • Device Type. De la lista desplegable seleccionamos el que más se adapte a nuestro tipo de dispositivo.

Guardamos el nuevo dispositivo, y realizamos la misma operación para crear todos los que necesitemos.

En la pantalla principal de sinric veremos todos los dispositivos creados, es importante apuntar los ID que la aplicación ha generado. También debemos anotar el “Your API Key“, se encuentra en la parte superior, con estos datos podremos controlar los dispositivos desde nuestra Arduino.

En este repositorio de github podemos encontrar los archivos “ino” para la tarjeta Arduino, existen diferentes ejemplos para el uso de la api de sinric.

Aqui tienes el código que utilizo para gestionar mis dispositivos a traves de Alexa. Se pueden controlar 4 dispositivos, pero es muy fácil añadir más.

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsClient.h> //  https://github.com/kakopappa/sinric/wiki/How-to-add-dependency-libraries
#include <ArduinoJson.h> // https://github.com/kakopappa/sinric/wiki/How-to-add-dependency-libraries
#include <StreamString.h>

ESP8266WiFiMulti WiFiMulti;
WebSocketsClient webSocket;
WiFiClient client;

#define MyApiKey "Tu-Api-Key-de-Sinric" // TODO: Change to your sinric API Key. Your API Key is displayed on sinric.com dashboard
#define MySSID "El-Nombre-de-tu-WIFI" // TODO: Change to your Wifi network SSID
#define MyWifiPassword "La-Contraseña-de-tu-WIFI" // TODO: Change to your Wifi network password

#define HEARTBEAT_INTERVAL 300000 // 5 Minutes 

const int relayPin1 = D1;
const int relayPin2 = D2;
const int relayPin3 = D3;
const int relayPin4 = D4;

uint64_t heartbeatTimestamp = 0;
bool isConnected = false;

void setPowerStateOnServer(String deviceId, String value);
void setTargetTemperatureOnServer(String deviceId, String value, String scale);

// deviceId is the ID assgined to your smart-home-device in sinric.com dashboard. Copy it from dashboard and paste it here

void turnOn(String deviceId) {

  // Device 1
  if (deviceId == "El-ID-de-tu-Dispositivo") // Device ID of first device
  {
    Serial.print("Turn on device id: ");
    Serial.println(deviceId);

    digitalWrite(relayPin1, HIGH); // turn on relay with voltage HIGH
  }
  else {
    Serial.print("Turn on for unknown device id: ");
    Serial.println(deviceId);
  }

  // Device 2
  if (deviceId == "El-ID-de-tu-Dispositivo") // Device ID of first device
  {
    Serial.print("Turn on device id: ");
    Serial.println(deviceId);

    digitalWrite(relayPin2, HIGH); // turn on relay with voltage HIGH
  }
  else {
    Serial.print("Turn on for unknown device id: ");
    Serial.println(deviceId);
  }

  // Device 3
  if (deviceId == "El-ID-de-tu-Dispositivo") // Device ID of first device
  {
    Serial.print("Turn on device id: ");
    Serial.println(deviceId);

    digitalWrite(relayPin3, HIGH); // turn on relay with voltage HIGH
  }
  else {
    Serial.print("Turn on for unknown device id: ");
    Serial.println(deviceId);
  }

  // Device 4
  if (deviceId == "El-ID-de-tu-Dispositivo") // Device ID of first device
  {
    Serial.print("Turn on device id: ");
    Serial.println(deviceId);

    digitalWrite(relayPin4, HIGH); // turn on relay with voltage HIGH
  }
  else {
    Serial.print("Turn on for unknown device id: ");
    Serial.println(deviceId);
  }
}

void turnOff(String deviceId) {

  // Device 1
  if (deviceId == "El-ID-de-tu-Dispositivo") // Device ID of first device
  {
    Serial.print("Turn off Device ID: ");
    Serial.println(deviceId);

    digitalWrite(relayPin1, LOW);  // turn off relay with voltage LOW
  }
  else {
    Serial.print("Turn off for unknown device id: ");
    Serial.println(deviceId);
  }

  // Device 2
  if (deviceId == "El-ID-de-tu-Dispositivo") // Device ID of first device
  {
    Serial.print("Turn off Device ID: ");
    Serial.println(deviceId);

    digitalWrite(relayPin2, LOW);  // turn off relay with voltage LOW
  }
  else {
    Serial.print("Turn off for unknown device id: ");
    Serial.println(deviceId);
  }

  // Device 3
  if (deviceId == "El-ID-de-tu-Dispositivo") // Device ID of first device
  {
    Serial.print("Turn off Device ID: ");
    Serial.println(deviceId);

    digitalWrite(relayPin3, LOW);  // turn off relay with voltage LOW
  }
  else {
    Serial.print("Turn off for unknown device id: ");
    Serial.println(deviceId);
  }

  // Device 4
  if (deviceId == "El-ID-de-tu-Dispositivo") // Device ID of first device
  {
    Serial.print("Turn off Device ID: ");
    Serial.println(deviceId);

    digitalWrite(relayPin4, LOW);  // turn off relay with voltage LOW
  }
  else {
    Serial.print("Turn off for unknown device id: ");
    Serial.println(deviceId);
  }
}

void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
  switch (type) {
    case WStype_DISCONNECTED:
      isConnected = false;
      Serial.printf("[WSc] Webservice disconnected from sinric.com!\n");
      break;
    case WStype_CONNECTED: {
        isConnected = true;
        Serial.printf("[WSc] Service connected to sinric.com at url: %s\n", payload);
        Serial.printf("Waiting for commands from sinric.com ...\n");
      }
      break;
    case WStype_TEXT: {
        Serial.printf("[WSc] get text: %s\n", payload);
        // Example payloads

        // For Switch or Light device types
        // {"deviceId": xxxx, "action": "setPowerState", value: "ON"} // https://developer.amazon.com/docs/device-apis/alexa-powercontroller.html

        // For Light device type
        // Look at the light example in github

        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject((char*)payload);
        String deviceId = json ["deviceId"];
        String action = json ["action"];

        if (action == "setPowerState") { // Switch or Light
          String value = json ["value"];
          if (value == "ON") {
            turnOn(deviceId);
          } else {
            turnOff(deviceId);
          }
        }
        else if (action == "SetTargetTemperature") {
          String deviceId = json ["deviceId"];
          String action = json ["action"];
          String value = json ["value"];
        }
        else if (action == "test") {
          Serial.println("[WSc] received test command from sinric.com");
        }
      }
      break;
    case WStype_BIN:
      Serial.printf("[WSc] get binary length: %u\n", length);
      break;
  }
}

void setup() {
  Serial.begin(115200);

  // Relay PIN eg: https://github.com/wemos/D1_mini_Examples/blob/master/examples/04.Shields/Relay_Shield/Blink/Blink.ino
  pinMode(relayPin1, OUTPUT);
  pinMode(relayPin2, OUTPUT);
  pinMode(relayPin3, OUTPUT);
  pinMode(relayPin4, OUTPUT);
  

  WiFiMulti.addAP(MySSID, MyWifiPassword);
  Serial.println();
  Serial.print("Connecting to Wifi: ");
  Serial.println(MySSID);

  // Waiting for Wifi connect
  while (WiFiMulti.run() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  if (WiFiMulti.run() == WL_CONNECTED) {
    Serial.println("");
    Serial.print("WiFi connected. ");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }

  // server address, port and URL
  webSocket.begin("iot.sinric.com", 80, "/");

  // event handler
  webSocket.onEvent(webSocketEvent);
  webSocket.setAuthorization("apikey", MyApiKey);

  // try again every 5000ms if connection has failed
  webSocket.setReconnectInterval(5000);   // If you see 'class WebSocketsClient' has no member named 'setReconnectInterval' error update arduinoWebSockets
}

void loop() {
  webSocket.loop();

  if (isConnected) {
    uint64_t now = millis();

    // Send heartbeat in order to avoid disconnections during ISP resetting IPs over night. Thanks @MacSass
    if ((now - heartbeatTimestamp) > HEARTBEAT_INTERVAL) {
      heartbeatTimestamp = now;
      webSocket.sendTXT("H");
    }
  }
}

// If you are going to use a push button to on/off the switch manually, use this function to update the status on the server
// so it will reflect on Alexa app.
// eg: setPowerStateOnServer("deviceid", "ON")

// Call ONLY If status changed. DO NOT CALL THIS IN loop() and overload the server.
void setPowerStateOnServer(String deviceId, String value) {
  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.createObject();
  root["deviceId"] = deviceId;
  root["action"] = "setPowerState";
  root["value"] = value;
  StreamString databuf;
  root.printTo(databuf);

  webSocket.sendTXT(databuf);
}

//eg: setPowerStateOnServer("deviceid", "CELSIUS", "25.0")

// Call ONLY If status changed. DO NOT CALL THIS IN loop() and overload the server.
void setTargetTemperatureOnServer(String deviceId, String value, String scale) {
  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.createObject();
  root["action"] = "SetTargetTemperature";
  root["deviceId"] = deviceId;

  JsonObject& valueObj = root.createNestedObject("value");
  JsonObject& targetSetpoint = valueObj.createNestedObject("targetSetpoint");
  targetSetpoint["value"] = value;
  targetSetpoint["scale"] = scale;

  StreamString databuf;
  root.printTo(databuf);

  webSocket.sendTXT(databuf);
}

Rellena los siguientes apartados con tus datos:

  • Tu-Api-Key-de-Sinric.
  • El-Nombre-de-tu-WIFI
  • La-Contraseña-de-tu-WIFI
  • El-ID-de-tu-Dispositivo

Carga el archivo “ino” en la tarjeta Arduino.

Ahora queda montar tu tarjeta Arduino Wemos con la placa de reles, hacer las conexiones entre Arduino y reles, y las conexiones para la corriente electrica de los enchufes que utilices.

Para comprobar que todo funciona correctamente, aun nos queda realizar un paso más.

Desde la aplicación “Amazon Aleza“, de tu dispositivo móvil, instala la skill de “Sinric“, puedes ver más información pinchando en el enlace.

Una vez configurada debes pulsar en “Más” y “Añadir dispositivo“. Pulsa sobre uno de los dispositivos, por ejemplo “Luz“, y en la siguiente pantalla, pulsa en “Otro“. Pulsa en el botón “Detectar Dispositivos“. Si todo fue bien, pasados unos minutos, Alexa habra detectado los nuevos dispositivos.

Dile a Alexa que encienda alguno de los dispositivos que has creado en Sinric.

Recuerda que estos dispositivos se comportan exactamente como cualquier otro dispositivo que has comprado. Creando rutinas, puedes programarlo para que se encienda/apage a una hora determinada o cuando se produzca un determinado evento.

Share

Alexa puede leer por ti, tus libros favoritos

Alexa se ha convertido en un accesorio imprescindible para el hogar, no solo puede reproducir tu música favorita, tus emisoras de radio, contar cuentos, controlar la domótica de tu casa; luces, interruptores, persianas, aire acondicionado, cerraduras, alarmas, cámaras y un largo número de dispositivos más. O realizar multitud de otras tareas gracias a las Skills. Alexa también es capaz de leer tus libros favoritos.

Para ello, un requisito imprescindible es, disponer del libro a través de Amazon Kindle. Si ya compras tus libros a través de este sistema, puedes decirle a tu dispositivo Alexa que los lea por ti.

En Amazon Kindle también es posible encontrar libros de forma gratuita, y muchos otros a precios inferiores a 1 euro. Si estas suscrito a Amazon Prime, puedes probar este servicio de forma gratuita durante 30 días, aquí, también dispones de forma gratuita de un servicio en el cual muchos libros se encuentran disponibles también de forma gratuita, con un sistema parecido a una biblioteca, puedes tener hasta 10 libros, una vez leídos los devuelves de forma digital y puedes volver a seleccionar otros. Otro sistema disponible en la plataforma es kindle unlimited, igual que los servicios de música, es a traves de una suscripción mensual, puedes leer todos los libros que quieras. Puedes probar este servicio de forma gratuita durante 30 días aquí.

Pero vamos a lo interesante, como hacer que Alexa nos lea un libro. Para ello debes ir a la aplicación Kindle, de tu dispositivo móvil o de escritorio, donde veras tu colección de libros actual, ahora tan solo debes decirle a tu dispositivo Alexa, “lee” y añadir el nombre del libro que quieres que lea.

Por ejemplo “Alexa lee el libro La Torre Tesla

Con “Alexa para“, nuestro asistente detendrá la lectura del libro. Si quieres reanudar la lectura dile, “Alexa lee libro“, Alexa continuará la lectura del último libro que estabas leyendo, allí donde lo dejaste. Si tienes activada la sincronización entre dispositivos, cuando pases la lectura de un dispositivo a otros, este se sincronizará automaticamente, siempre mostrando el punto donde lo dejaste en cualquiera de tus dispositivos; libro electronico, aplicación de escritorio, aplicación movil, o dispositivos Alexa.

Desde la aplicación Amazon Alexa, también puedes controlar la lectura de tu libro, incluso enviar dicha lectura a un dispositivo especifico. Para ello ve a “Reproducir“, en el apartado Bibioteca Kindle, selecciona el libro que quieres que tu dispositivo lea, en el desplegable que se ha abierto, selecciona el dispositivo, a continuación comenzara la lectura.

Ahora ya puedes disfrutar de tus narraciones favoritas, leidas por tu asistente virtual.

Share

Programar Alexa para encender y apagar dispositivos al amanecer y atardecer

Alexa nos permite controlar multitud de dispositivos a través de comandos de voz; enchufes, interruptores, bombillas, cerraduras, cámaras, e infinidad de otros dispositivos. Pero a parte de utilizar los comandos de voz, también es posible realizar acciones programadas; en tiempos determinados o cuando se produce un evento, como puede ser al amanecer, atardecer, llegar o salir de casa, entre otras opciones disponibles.

Vamos a configurar un evento el cual encienda una lampara cada día de la semana, cuando se produce el ocaso del Sol.

Pra realizar tal tarea debemos de ir a la aplicación Amazon alexa. Pulsamos sobre el icono “Más“, situado en la parte inferior derecha de la pantalla, seleccionamos “Rutinas“, y pulsamos sobre el circulo con signo más, situado en la parte superior derecha.

Seleccionamos la primera opción “Introduce un nombre para la rutina” y añadimos un nombre a esta rutina, por ejemplo, “Encender Lampara al atardecer“, pulsamos sobre “Siguiente“.

Ahora pulsamos sobre “Cuando” aquí veremos cuatro opciones, seleccionados “Horario“. De las tres siguientes opciones, elegimos “Anochecer“.

Con “Diferencia de tiempo“, nos permite seleccionar cuando se producira el evento, si justo cuando oscurece, o unos minutos antes o despues de producirse. En la parte inferior podemos seleccionar los días de la semana en los que se producira el evento, por defecto estan marcados todos, pulsando sobre ellos los desmarcamos, en la parte inmediatamente superior se mostrarán los días seleccionados, para evitar confusiones, sino sabemos que los circulos en blanco son los seleccionados, y los circulos negros, los desmarcados.

Una vez realizadas las correspondientes configuraciones, pulsamos sobre “siguiente“. Seleccionamos “Añadir acción“, seleccionamos “Dispositivos“, “Todos los dispositivos“, y buscamos el dispositivo que realizará la acción y pulsamos sobre él. Según las acciones que pueda realizar dicho dispositivo, veremos más o menos opciones de configuración. Si se trata de una bombilla o interruptor, disponemos de una opción de configuración, “Potencia“, la cual se puede seleccionar como activar o desactivar, sugún la acción que queremos que se realize. Una vez seleccionada una acción, pulsamos nuevamente sobre “Siguiente“, aquí solo nos queda pulsar en “Guardar“, para que nuestra nueva rutina quede guardada y lista para entrar en acción.

Ahora cada vez que oscurezca se activara la nueva rutina, encendiendo el dispositivo programado. Como cada día oscurece a una hora diferente, este evento no se puede programar con un horario fijo, nos va de maravilla utilizar las opciones, amanecer y atardecer para realizar este tipo de programaciones.

Share