Cómo integrar Fusión Solar (de Huawei) con Alexa
Recientemente me han instalado unas placas solares con un inversor de Huawei, modelo SUN2000.
Tras ver que la aplicación Fusión Solar ofrece muchos datos relativos a la generación y consumo de energía, me intrigó la idea de si sería posible integrar la información de la aplicación Fusión Solar con Alexa.
Tras unas búsquedas rápidas en Google, bastante gente preguntaba por lo mismo en los propios foros de Huawei, pero ninguna persona parecía haber dado con una solución, ya que Huawei no ofrece ningún tipo de integración para dispositivos Smart Home.
Sin embargo, algunas personas habían encontrado una solución para integrar la información de Fusión Solar en Home Assistant, que es un sistema open source para Smart Home que usa dispositivos Raspberry Pi o servidores caseros para gestionar todos los dispositivos integrados.
Esas personas las encontré aquí: https://github.com/tijsverkoyen/HomeAssistant-FusionSolar
En concreto, descubrieron que se podía usar la información generada por el modo kiosco (un tablero de control personalizado que ofrece información muy concreta que el fabricante elige) que ofrece Fusión Solar y también que, conociendo los datos de tu instalador o haciéndote tú mismo instalador de tu propia instalación solar, se puede acceder mediante OpenAPI o NorthboundAPI a una API interna que Fusión Solar ofrece para instaladores.
Puesto que, en mi caso particular, mi única intención era conocer desde Alexa la potencia que se está generando actualmente (solo por curiosidad y por no tener que acceder a la app de Fusión Solar), los datos que ofrece el modo kiosco eran suficientes para mi propósito. Eso sí, hay que advertir que el modo kiosco tiene un pequeño problema: los datos están cacheados durante 30 minutos, por lo que la información no está accesible en tiempo real, sino con 30 minutos de desfase. Si a ti esto no te sirve, tendrás que pelearte con el modo API.
Por otro lado, descubrí que era bastante fácil programarte tu propia skill para Alexa. Simplemente con seguir el tutorial de la propia Amazon (que son unos 30 minutos), donde explican cómo crearte tu primera skill, ya dispones de la información suficiente.
Con toda esta información, me puse manos a la obra.
Primer paso: obtener los datos
Si bien en la página de Github del Home Assistant para Fusión Solar te dicen como obtener la URL del modo kiosco para integrarlo en su sistema (en la web de Fusión Solar, arriba a la derecha, está el icono de Kiosk
), no aclaran de dónde obtienen los datos en formato json.
Porque en realidad, la URL que te da el modo kiosco es una página web que ejecuta unos archivos javascript y generan una página visible con estadísticas y una gráfica de potencia generada.
La URL de la página web que ofrece el modo kiosco tiene este formato:
y en él, lo único que destaca es el parámetro kk
, que nos da un token generado único de nuestra instalación, con una validez de 1 año desde que se genera. Pasado ese año, hay que volver a generar un nuevo token.
Si analizas esa página en las Dev Tools del navegador, verás una llamada al servicio REST, de donde obtiene los datos que se muestran en esa página web. En concreto, la llamada es esta:
Como se ve, usa el mismo token para obtener la información. La llamada devuelve varios datos (incluídos los de la gráfica a representar, que son muchos) y, en concreto, la información que queremos está en el campo data
. Un pequeño problema que nos encontramos con la respuesta de este dato, es que viene en formato escapado, por lo que no es legible a simple vista. Simplemente, desescapando el contenido ya tenemos la información legible.
Vienen varios datos, pero en mi caso el único que me interesa es el de la potencia actual, que se encuentra en data.realKpi.realTimePower
.
Ya tenemos una forma de obtener el dato que necesitamos fácilmente.
Segundo paso: integrarlo en una skill de Alexa
Como no es el propósito de este tutorial explicar cómo se crea una skill de Alexa, que para eso el tutorial de Alexa lo explica perfectamente, lo que os voy a poner es el código final que ejecuta la skill de Alexa para devolverme la información a través de un comando vocal.
Lo único que sí que voy a añadir es que mi intención era que Alexa me diese la información con un único y sencillo comando, para lo cual lo que he hecho es usar el “LaunchRequestHandler” para ejecutar directamente mi código sin tener que darle un segundo comando que ejecute un intent personalizado. Como nombre de invocación he elegido “fusión solar” (mínimo son dos palabras).
Aclaro esto porque en el tutorial se especifica que las skills de Alexa deben tener un nombre de invocación, como por ejemplo “Alexa, abre Fusión Solar” y, a continuación, en el intent personalizado donde tienes tu código, asignas una o varias frases de ejecución que llaman a ese intent (por ejemplo, “dame la potencia”). Eso me obligaba a decir frases largas como la siguiente: “Alexa, abre Fusión Solar y dame la potencia”. Para evitar esto, lo que decidí fue meter el código directamente en el launcher y evitar, de esa forma, tener que decir una frase de ejecución que llame al intent.
Dicho esto, así es como dejé el launcher:
const Alexa = require('ask-sdk-core');
const axios = require('axios');
const unscape = require('unescape');
const LaunchRequestHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
},
async handle(handlerInput) {
try {
const response = await axios.get(`https://uni001eu5.fusionsolar.huawei.com/rest/pvms/web/kiosk/v1/station-kiosk-file?kk=YOUR_TOKEN_HERE`);
const data = JSON.parse(unscape(response.data.data));
const power = Math.round(data.realKpi.realTimePower * 10) / 10;
let speechText;
switch (true) {
case (power <= 0.5):
speechText = `La potencia actual es muy baja, de solo ${power} kilovatios.`;
break;
case (power > 0.5 && power <= 1):
speechText = `La potencia actual es baja, de solo ${power} kilovatios.`;
break;
case (power > 1 && power <= 2):
speechText = `La potencia actual es media, de ${power} kilovatios.`;
break;
case (power > 2 && power <= 3):
speechText = `La potencia actual es alta, de ${power} kilovatios.`;
break;
case (power > 3):
speechText = `La potencia actual es muy alta, de ${power} kilovatios. ¡Vamos a todo tren!`;
break;
default:
speechText = `Valor desconocido`;
console.log("Valor no reconocido");
}
return handlerInput.responseBuilder
.speak(speechText)
.getResponse();
} catch (error) {
return handlerInput.responseBuilder
.speak(`Lo siento, hubo algún error al leer los datos del inversor.`)
.getResponse();
}
}
};
... resto del código que ya viene por defecto
Hay que notar aquí que he hecho uso de la librería axios, para hacer la llamada al servicio REST, y la librería unescape para desescapar los datos. Ambas deben ser incluidas en el package.json
de la lambda:
"dependencies": {
"ask-sdk-core": "^2.7.0",
"ask-sdk-model": "^1.19.0",
"aws-sdk": "^2.326.0",
"axios": "^1.7.9",
"unescape": "^1.0.1"
}
Tercer paso: preguntar a Alexa
Pues con estas dos cosas ya estaría todo listo para tener nuestra skill personalizada en Alexa. La prueba definitiva viene cuando le digo al Fire-TV: “Alexa, abre Fusión Solar” y Alexa me contesta con una sencilla frase: “La potencia actual es media, de 1.2 kilowatios”.
A continuación, viene la pregunta que más he visto en los foros sobre las skills que solo vas a usar tú en tu casa: ¿tengo que publicar la skill en el Market? La respuesta, según he investigado, parece ser no. Puedes dejar tu skill en modo developer y no necesitarás publicarla (lo cual sería perjudicial para ti, porque recuerda que has tenido que poner tu token personal en la url que llama al servicio rest, y que debes renovar ese token cada año). Lo único que debes tener en cuenta para que esto funcione, es que tu cuenta de desarrollador y la cuenta con la que usas Alexa deben ser la misma.
¡Y listo! Ya tengo algo de información de los paneles solares integrada en Alexa. En total, recabar y entender la información, ver el tutorial de skills para Alexa, encontrar y refinar los datos REST y programar y probar la skill, apenas me llevaron una tarde (unas 4 horas). Así que creo que es bastante asequible para cualquiera.
Seguro que si tienes más dispositivos Smart Home se te ocurren ideas para integrar apagados o encendidos en momentos determinados del día, simplemente consultando a Alexa. Espero que te haya sido de utilidad.