From f6691368f1aa92fc79cb9925cfcb72b769b671b8 Mon Sep 17 00:00:00 2001 From: chaos511 <43281665+chaos511@users.noreply.github.com> Date: Mon, 23 Dec 2024 20:38:25 -0600 Subject: [PATCH] Add support for COLOR_TEMPERATURE_CONTROLLER --- examples/lightWithColorTemp.cpp | 122 ++++++++++++++++++++++++++++++++ readme.md | 2 +- src/AlexaStatusMessage.h | 4 ++ 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 examples/lightWithColorTemp.cpp diff --git a/examples/lightWithColorTemp.cpp b/examples/lightWithColorTemp.cpp new file mode 100644 index 0000000..24374e0 --- /dev/null +++ b/examples/lightWithColorTemp.cpp @@ -0,0 +1,122 @@ +#include + +#ifdef ESP32 +#include +#else +#include +#endif + +#include + +// Define constants for WiFi and Alexa Client configuration +const char *WIFI_SSID = ""; + +const char *ALEXA_USERNAME = ""; +const char *ALEXA_PASSWORD = ""; +const char *ALEXA_ROOT_TOPIC = ""; + +// Create the Alexa client object +Alex2ESP alexClient; +AlexaDevice* device1; + +// Initial state for the light (PowerController) +PowerController outputState = PowerController::OFF; +int brightness=100; +int colorTemp=0; +void setup() { + // Initialize the LED as output + pinMode(LED_BUILTIN, OUTPUT); + + // Initialize serial communication for debugging + Serial.begin(74880); + + // Connect to Wi-Fi + WiFi.mode(WIFI_STA); + WiFi.begin(WIFI_SSID); + + Serial.print("[WIFI] Connecting to WiFi"); + + while (WiFi.status() != WL_CONNECTED) { + Serial.print("."); + delay(100); + } + + Serial.println(); + Serial.printf("[WIFI] Connected to SSID: %s, IP address: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str()); + + // Initialize the Alexa client + alexClient.begin(ALEXA_USERNAME, ALEXA_PASSWORD, ALEXA_ROOT_TOPIC); + + // Register a new device with a unique ID and name + device1 = alexClient.getDevice("Test Lamp ESP", "ESP-01"); + + // Set the device's display category to LIGHT + device1->setDisplayCategory(DisplayCategory::LIGHT); + + // Add a power controller capability to the device + device1->addCapability(AlexaInterfaceType::POWER_CONTROLLER); + + // Add a brightness controller to the device to allow dimming + device1->addCapability(AlexaInterfaceType::BRIGHTNESS_CONTROLLER); + + // Add a color temperature controller + device1->addCapability(AlexaInterfaceType::COLOR_TEMPERATURE_CONTROLLER); + + // Register event listener for "ReportState" directive + device1->registerEvent("ReportState", [](const JsonDocument& directive, const AlexaInterfaceType& type) { + // Build and send status report + device1->buildStatusMessage(directive["header"]["correlationToken"]) + .AddHealthProp(EndpointHealth::OK) + .AddPowerControllerProp(outputState) + .AddBrightnessControllerProp(brightness) + .AddColorTemperatureControllerProp(colorTemp) + .send(); + }); + + // Register event listener for "Event" directive to handle state changes + device1->registerEvent("Event", [](const JsonDocument& directive, const AlexaInterfaceType& type) { + if (type == AlexaInterfaceType::POWER_CONTROLLER) { + if (directive["header"]["name"] == "TurnOn") { + outputState = PowerController::ON; + Serial.println("Turning ON"); + } else if (directive["header"]["name"] == "TurnOff") { + outputState = PowerController::OFF; + Serial.println("Turning OFF"); + } + }else if (type == AlexaInterfaceType::BRIGHTNESS_CONTROLLER) { + if(directive["header"]["name"]=="SetBrightness"){ + brightness=directive["payload"]["brightness"]; + Serial.println("setting brightness to: "+brightness); + outputState = PowerController::ON; + } + }else if (type == AlexaInterfaceType::COLOR_TEMPERATURE_CONTROLLER) { + if(directive["header"]["name"]=="SetColorTemperature"){ + colorTemp=directive["payload"]["colorTemperatureInKelvin"]; + Serial.println("setting color temperature to: "+colorTemp); + outputState = PowerController::ON; + } + }else{ + return; + } + + // Send the updated state after change + device1->buildStatusMessage(directive["header"]["correlationToken"], true) + .AddHealthProp(EndpointHealth::OK) + .AddPowerControllerProp(outputState) + .AddBrightnessControllerProp(brightness) + .AddColorTemperatureControllerProp(colorTemp) + .send(); + }); +} + +void loop() { + // Process Alexa client communication + alexClient.loop(); + + // Update the state of the LED based on the power controller state and brightness + if(outputState == PowerController::ON){ + analogWrite(LED_BUILTIN,map(brightness,0,100,255,0)); + }else{ + digitalWrite(LED_BUILTIN, true); + } +} diff --git a/readme.md b/readme.md index 4a6d974..4c995fc 100644 --- a/readme.md +++ b/readme.md @@ -109,10 +109,10 @@ toggleController->addActionMapping(openMapping); | AlexaInterfaceType::BRIGHTNESS_CONTROLLER | Fully Supported | | AlexaInterfaceType::TOGGLE_CONTROLLER | Fully Supported | | AlexaInterfaceType::TEMPERATURE_SENSOR | Fully Supported | +| AlexaInterfaceType::COLOR_TEMPERATURE_CONTROLLER | Fully Supported | | AlexaInterfaceType::AUTOMATION_MANAGEMENT | Supported* | | AlexaInterfaceType::CHANNEL_CONTROLLER | Supported* | | AlexaInterfaceType::COLOR_CONTROLLER | Supported* | -| AlexaInterfaceType::COLOR_TEMPERATURE_CONTROLLER | Supported* | | AlexaInterfaceType::CONTACT_SENSOR | Supported* | | AlexaInterfaceType::APPLICATION_STATE_REPORTER | Supported* | | AlexaInterfaceType::AUDIO_PLAY_QUEUE | Supported* | diff --git a/src/AlexaStatusMessage.h b/src/AlexaStatusMessage.h index d5a65cf..3f0eef5 100644 --- a/src/AlexaStatusMessage.h +++ b/src/AlexaStatusMessage.h @@ -86,6 +86,10 @@ public: { return AddProperty(AlexaInterfaceType::BRIGHTNESS_CONTROLLER, "brightness", brightness, uncertaintyInMs); } + AlexaStatusMessage &AddColorTemperatureControllerProp(unsigned int colorTemperature, unsigned int uncertaintyInMs = 0) + { + return AddProperty(AlexaInterfaceType::COLOR_TEMPERATURE_CONTROLLER, "colorTemperatureInKelvin", colorTemperature, uncertaintyInMs); + } AlexaStatusMessage &AddToggleControllerProp(PowerController powerController,String instanceName, unsigned int uncertaintyInMs = 0) { String value = (powerController == PowerController::ON) ? "ON" : "OFF";