Examples as Arduino sketches: one folder per device type, each its own endpointId, Wi-Fi with a timeout
Light, DimmableLight, ColorTemperatureLight, ColorLight, TemperatureSensor, ContactSensor, Blind, Thermostat, Lock, Scene, Doorbell and MultiDevice on the 2.0 API: addCapability(row, instance), one onDirective() handler, the report helpers, ChangeReports from loop(), a deferred answer for the lock. Wi-Fi is waited for 30 s, then the sketch says what to check and carries on. examples/README.md has what each sketch does, its limits and the measured sizes for d1_mini: Light takes 30,616 bytes of static RAM and 332,565 of flash; all 17 sketches build with 0 warnings. test/test_examples compares the discovery object of every new sketch: 147 host tests (were 135). The sketches were compiled, not run on a board. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
7369883479
commit
69b4d59896
15 changed files with 2061 additions and 1 deletions
156
examples/ColorTemperatureLight/ColorTemperatureLight.ino
Normal file
156
examples/ColorTemperatureLight/ColorTemperatureLight.ino
Normal file
|
|
@ -0,0 +1,156 @@
|
|||
// ColorTemperatureLight: a white lamp with a warm and a cold channel (Alexa.PowerController,
|
||||
// Alexa.BrightnessController, Alexa.ColorTemperatureController).
|
||||
//
|
||||
// Two PWM outputs drive the two LED channels; the color temperature decides how the brightness is shared between
|
||||
// them. The lamp covers 2200 K to 7000 K: a value outside of it is set to the nearest the lamp has, and the answer
|
||||
// reports what was set. "Alexa, make the lamp warmer" and "cooler" move to the next of the five steps below.
|
||||
#include <Arduino.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <Alex2ESP.h>
|
||||
|
||||
// Wi-Fi and the credentials of your Alex2MQTT account
|
||||
const char *WIFI_SSID = "";
|
||||
const char *WIFI_PASSWORD = "";
|
||||
|
||||
const char *ALEXA_USERNAME = "";
|
||||
const char *ALEXA_PASSWORD = "";
|
||||
const char *ALEXA_ROOT_TOPIC = "";
|
||||
|
||||
const uint8_t WARM_PIN = 5; // D1 on a Wemos D1 mini, high = lit
|
||||
const uint8_t COLD_PIN = 4; // D2
|
||||
|
||||
// Warm white, soft white, white, daylight white, cool white: the values Alexa sends for these names
|
||||
const int STEPS[] = {2200, 2700, 4000, 5500, 7000};
|
||||
const int STEP_COUNT = sizeof(STEPS) / sizeof(STEPS[0]);
|
||||
|
||||
Alex2ESP alexa;
|
||||
bool lampOn = false;
|
||||
int brightness = 100; // percent
|
||||
int kelvin = 2700;
|
||||
|
||||
// Joins the Wi-Fi network and returns after 30 s at the latest. Without a connection the sketch carries on: the
|
||||
// ESP8266 keeps trying, and alexa.loop() opens the MQTT session once Wi-Fi is up.
|
||||
void connectWiFi()
|
||||
{
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
|
||||
Serial.printf("\n[WIFI] Connecting to \"%s\"\n", WIFI_SSID);
|
||||
|
||||
unsigned long started = millis();
|
||||
while (WiFi.status() != WL_CONNECTED && millis() - started < 30000)
|
||||
{
|
||||
delay(100);
|
||||
}
|
||||
|
||||
if (WiFi.status() == WL_CONNECTED)
|
||||
{
|
||||
Serial.printf("[WIFI] Connected, IP address %s\n", WiFi.localIP().toString().c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.printf("[WIFI] No connection after 30 s (status %d): check WIFI_SSID and WIFI_PASSWORD. Still trying.\n",
|
||||
WiFi.status());
|
||||
}
|
||||
}
|
||||
|
||||
void writeLamp()
|
||||
{
|
||||
int level = lampOn ? brightness : 0;
|
||||
int cold = map(kelvin, STEPS[0], STEPS[STEP_COUNT - 1], 0, level);
|
||||
analogWrite(COLD_PIN, cold);
|
||||
analogWrite(WARM_PIN, level - cold);
|
||||
}
|
||||
|
||||
// The state of the lamp: what the answer to a directive and the answer to ReportState carry
|
||||
void sendState(AlexaStatusMessage message)
|
||||
{
|
||||
message.addHealthProp(EndpointHealth::OK)
|
||||
.addPowerControllerProp(lampOn ? PowerController::ON : PowerController::OFF)
|
||||
.addBrightnessControllerProp(brightness)
|
||||
.addColorTemperatureControllerProp(kelvin)
|
||||
.send();
|
||||
}
|
||||
|
||||
void onDirective(AlexaDirective &directive)
|
||||
{
|
||||
if (directive.isReportState())
|
||||
{
|
||||
sendState(directive.stateReport());
|
||||
return;
|
||||
}
|
||||
|
||||
if (directive.is("TurnOn") || directive.is("TurnOff"))
|
||||
{
|
||||
lampOn = directive.is("TurnOn");
|
||||
}
|
||||
else if (directive.is("SetBrightness"))
|
||||
{
|
||||
brightness = constrain(directive.payload["brightness"] | brightness, 0, 100);
|
||||
}
|
||||
else if (directive.is("AdjustBrightness"))
|
||||
{
|
||||
brightness = constrain(brightness + (directive.payload["brightnessDelta"] | 0), 0, 100);
|
||||
}
|
||||
else if (directive.is("SetColorTemperature"))
|
||||
{
|
||||
kelvin = constrain(directive.payload["colorTemperatureInKelvin"] | kelvin, STEPS[0], STEPS[STEP_COUNT - 1]);
|
||||
}
|
||||
else if (directive.is("IncreaseColorTemperature"))
|
||||
{
|
||||
for (int i = 0; i < STEP_COUNT; i++)
|
||||
{
|
||||
if (STEPS[i] > kelvin)
|
||||
{
|
||||
kelvin = STEPS[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (directive.is("DecreaseColorTemperature"))
|
||||
{
|
||||
for (int i = STEP_COUNT - 1; i >= 0; i--)
|
||||
{
|
||||
if (STEPS[i] < kelvin)
|
||||
{
|
||||
kelvin = STEPS[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
directive.error(AlexaErrorType::INVALID_DIRECTIVE, "This lamp switches, dims and changes its white").send();
|
||||
return;
|
||||
}
|
||||
|
||||
writeLamp();
|
||||
sendState(directive.response());
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(74880);
|
||||
pinMode(WARM_PIN, OUTPUT);
|
||||
pinMode(COLD_PIN, OUTPUT);
|
||||
analogWriteRange(100);
|
||||
writeLamp();
|
||||
|
||||
connectWiFi();
|
||||
|
||||
// MQTT user name, MQTT password, root topic
|
||||
alexa.begin(ALEXA_USERNAME, ALEXA_PASSWORD, ALEXA_ROOT_TOPIC);
|
||||
|
||||
// The name Alexa shows, and the id of the endpoint: every device of an account has its own
|
||||
AlexaDevice *lamp = alexa.getDevice("White Lamp", "esp-white-light");
|
||||
lamp->setDisplayCategory(DisplayCategory::LIGHT);
|
||||
lamp->addCapability(AlexaInterfaces::PowerController);
|
||||
lamp->addCapability(AlexaInterfaces::BrightnessController);
|
||||
lamp->addCapability(AlexaInterfaces::ColorTemperatureController);
|
||||
lamp->addCapability(AlexaInterfaces::EndpointHealth);
|
||||
lamp->onDirective(onDirective);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
alexa.loop();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue