WLED/wled00/alexa.cpp

109 lines
3.0 KiB
C++
Raw Permalink Normal View History

#include "wled.h"
/*
* Alexa Voice On/Off/Brightness/Color Control. Emulates a Philips Hue bridge to Alexa.
*
* This was put together from these two excellent projects:
* https://github.com/kakopappa/arduino-esp8266-alexa-wemo-switch
* https://github.com/probonopd/ESP8266HueEmulator
*/
#include "src/dependencies/espalexa/EspalexaDevice.h"
#ifndef WLED_DISABLE_ALEXA
2019-03-01 17:10:42 +01:00
void onAlexaChange(EspalexaDevice* dev);
2019-01-09 22:52:42 +01:00
2017-02-21 23:59:47 +01:00
void alexaInit()
{
2019-10-18 13:26:39 +02:00
if (alexaEnabled && WLED_CONNECTED)
2017-02-21 23:59:47 +01:00
{
2019-01-09 22:52:42 +01:00
if (espalexaDevice == nullptr) //only init once
{
2019-03-01 17:10:42 +01:00
espalexaDevice = new EspalexaDevice(alexaInvocationName, onAlexaChange, EspalexaDeviceType::extendedcolor);
2019-01-09 22:52:42 +01:00
espalexa.addDevice(espalexaDevice);
espalexa.begin(&server);
} else {
espalexaDevice->setName(alexaInvocationName);
}
2017-02-21 23:59:47 +01:00
}
}
2019-01-09 22:52:42 +01:00
void handleAlexa()
2017-02-21 23:59:47 +01:00
{
2019-10-18 13:26:39 +02:00
if (!alexaEnabled || !WLED_CONNECTED) return;
2019-01-09 22:52:42 +01:00
espalexa.loop();
2017-02-21 23:59:47 +01:00
}
2019-03-01 17:10:42 +01:00
void onAlexaChange(EspalexaDevice* dev)
{
2019-03-01 17:10:42 +01:00
EspalexaDeviceProperty m = espalexaDevice->getLastChangedProperty();
2019-03-01 17:10:42 +01:00
if (m == EspalexaDeviceProperty::on)
{
2019-01-09 22:52:42 +01:00
if (!macroAlexaOn)
{
if (bri == 0)
{
bri = briLast;
stateUpdated(CALL_MODE_ALEXA);
2019-01-09 22:52:42 +01:00
}
2021-06-14 01:58:12 +02:00
} else {
applyPreset(macroAlexaOn, CALL_MODE_ALEXA);
2021-06-14 01:58:12 +02:00
if (bri == 0) espalexaDevice->setValue(briLast); //stop Alexa from complaining if macroAlexaOn does not actually turn on
}
2019-03-01 17:10:42 +01:00
} else if (m == EspalexaDeviceProperty::off)
{
2019-01-09 22:52:42 +01:00
if (!macroAlexaOff)
{
if (bri > 0)
{
briLast = bri;
bri = 0;
stateUpdated(CALL_MODE_ALEXA);
2019-01-09 22:52:42 +01:00
}
2021-06-14 01:58:12 +02:00
} else {
applyPreset(macroAlexaOff, CALL_MODE_ALEXA);
2021-06-14 01:58:12 +02:00
if (bri != 0) espalexaDevice->setValue(0); //stop Alexa from complaining if macroAlexaOff does not actually turn off
}
2019-03-01 17:10:42 +01:00
} else if (m == EspalexaDeviceProperty::bri)
{
2019-03-01 17:10:42 +01:00
bri = espalexaDevice->getValue();
stateUpdated(CALL_MODE_ALEXA);
2019-01-09 22:52:42 +01:00
} else //color
{
2020-03-25 00:59:48 +01:00
if (espalexaDevice->getColorMode() == EspalexaColorMode::ct) //shade of white
{
byte rgbw[4];
2020-03-25 00:59:48 +01:00
uint16_t ct = espalexaDevice->getCt();
2021-11-28 04:01:58 +01:00
if (!ct) return;
uint16_t k = 1000000 / ct; //mireds to kelvin
if (strip.hasCCTBus()) {
strip.setCCT(k);
rgbw[0]= 0; rgbw[1]= 0; rgbw[2]= 0; rgbw[3]= 255;
2022-02-04 13:28:00 +01:00
} else if (strip.hasWhiteChannel()) {
2020-03-25 00:59:48 +01:00
switch (ct) { //these values empirically look good on RGBW
case 199: rgbw[0]=255; rgbw[1]=255; rgbw[2]=255; rgbw[3]=255; break;
case 234: rgbw[0]=127; rgbw[1]=127; rgbw[2]=127; rgbw[3]=255; break;
case 284: rgbw[0]= 0; rgbw[1]= 0; rgbw[2]= 0; rgbw[3]=255; break;
case 350: rgbw[0]=130; rgbw[1]= 90; rgbw[2]= 0; rgbw[3]=255; break;
case 383: rgbw[0]=255; rgbw[1]=153; rgbw[2]= 0; rgbw[3]=255; break;
default : colorKtoRGB(k, rgbw);
2020-03-25 00:59:48 +01:00
}
} else {
colorKtoRGB(k, rgbw);
2020-03-25 00:59:48 +01:00
}
strip.setColor(0, rgbw[0], rgbw[1], rgbw[2], rgbw[3]);
2020-03-25 00:59:48 +01:00
} else {
uint32_t color = espalexaDevice->getRGB();
strip.setColor(0, color);
2020-03-25 00:59:48 +01:00
}
stateUpdated(CALL_MODE_ALEXA);
}
}
#else
void alexaInit(){}
void handleAlexa(){}
#endif