Merge remote-tracking branch 'origin/main' into mdev
This commit is contained in:
7
.github/FUNDING.yml
vendored
7
.github/FUNDING.yml
vendored
@@ -1,5 +1,2 @@
|
|||||||
github: [Aircoookie]
|
github: [Aircoookie,blazoncek]
|
||||||
custom: ['https://paypal.me/Aircoookie']
|
custom: ['https://paypal.me/Aircoookie','https://paypal.me/blazoncek']
|
||||||
|
|
||||||
github: [blazoncek]
|
|
||||||
custom: ['https://paypal.me/blazoncek']
|
|
||||||
|
|||||||
11
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
11
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: WLED Discord community
|
||||||
|
url: https://discord.gg/KuqP7NE
|
||||||
|
about: Please ask and answer questions and discuss setup issues here!
|
||||||
|
- name: WLED community forum
|
||||||
|
url: https://wled.discourse.group/
|
||||||
|
about: For issues and ideas that might need longer discussion.
|
||||||
|
- name: kno.wled.ge base
|
||||||
|
url: https://kno.wled.ge/basics/faq/
|
||||||
|
about: Take a look at the frequently asked questions and documentation, perhaps your question is already answered!
|
||||||
19
.github/ISSUE_TEMPLATE/question.md
vendored
19
.github/ISSUE_TEMPLATE/question.md
vendored
@@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
name: Question
|
|
||||||
about: Have a question about using WLED?
|
|
||||||
title: ''
|
|
||||||
labels: question
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Take a look at the wiki and FAQ, perhaps your question is already answered!**
|
|
||||||
[FAQ](https://github.com/Aircoookie/WLED/wiki/FAQ)
|
|
||||||
|
|
||||||
**Please consider asking your question on the WLED forum or Discord**
|
|
||||||
[Forum](https://wled.discourse.group/)
|
|
||||||
[Discord](https://discord.gg/KuqP7NE)
|
|
||||||
[What to post where?](https://github.com/Aircoookie/WLED/issues/658)
|
|
||||||
|
|
||||||
**If you do not like to use these platforms, delete this template and ask away!**
|
|
||||||
Please keep in mind though that the issue section is generally not the preferred place for general questions.
|
|
||||||
@@ -42,7 +42,7 @@ private:
|
|||||||
bool getLuminanceComplete = false;
|
bool getLuminanceComplete = false;
|
||||||
|
|
||||||
// flag set at startup
|
// flag set at startup
|
||||||
bool disabled = false;
|
bool enabled = true;
|
||||||
|
|
||||||
// strings to reduce flash memory usage (used more than twice)
|
// strings to reduce flash memory usage (used more than twice)
|
||||||
static const char _name[];
|
static const char _name[];
|
||||||
@@ -133,7 +133,7 @@ public:
|
|||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
if (disabled || strip.isUpdating())
|
if ((!enabled) || strip.isUpdating())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned long now = millis();
|
unsigned long now = millis();
|
||||||
@@ -205,7 +205,7 @@ public:
|
|||||||
{
|
{
|
||||||
// we add JSON object.
|
// we add JSON object.
|
||||||
JsonObject top = root.createNestedObject(FPSTR(_name)); // usermodname
|
JsonObject top = root.createNestedObject(FPSTR(_name)); // usermodname
|
||||||
top[FPSTR(_enabled)] = !disabled;
|
top[FPSTR(_enabled)] = enabled;
|
||||||
top[FPSTR(_maxReadInterval)] = maxReadingInterval;
|
top[FPSTR(_maxReadInterval)] = maxReadingInterval;
|
||||||
top[FPSTR(_minReadInterval)] = minReadingInterval;
|
top[FPSTR(_minReadInterval)] = minReadingInterval;
|
||||||
top[FPSTR(_HomeAssistantDiscovery)] = HomeAssistantDiscovery;
|
top[FPSTR(_HomeAssistantDiscovery)] = HomeAssistantDiscovery;
|
||||||
@@ -233,7 +233,7 @@ public:
|
|||||||
}
|
}
|
||||||
bool configComplete = !top.isNull();
|
bool configComplete = !top.isNull();
|
||||||
|
|
||||||
configComplete &= getJsonValue(top[FPSTR(_enabled)], disabled, false);
|
configComplete &= getJsonValue(top[FPSTR(_enabled)], enabled, false);
|
||||||
configComplete &= getJsonValue(top[FPSTR(_maxReadInterval)], maxReadingInterval, 10000); //ms
|
configComplete &= getJsonValue(top[FPSTR(_maxReadInterval)], maxReadingInterval, 10000); //ms
|
||||||
configComplete &= getJsonValue(top[FPSTR(_minReadInterval)], minReadingInterval, 500); //ms
|
configComplete &= getJsonValue(top[FPSTR(_minReadInterval)], minReadingInterval, 500); //ms
|
||||||
configComplete &= getJsonValue(top[FPSTR(_HomeAssistantDiscovery)], HomeAssistantDiscovery, false);
|
configComplete &= getJsonValue(top[FPSTR(_HomeAssistantDiscovery)], HomeAssistantDiscovery, false);
|
||||||
|
|||||||
@@ -22,36 +22,20 @@
|
|||||||
*
|
*
|
||||||
* v2 usermods are class inheritance based and can (but don't have to) implement more functions, each of them is shown in this example.
|
* v2 usermods are class inheritance based and can (but don't have to) implement more functions, each of them is shown in this example.
|
||||||
* Multiple v2 usermods can be added to one compilation easily.
|
* Multiple v2 usermods can be added to one compilation easily.
|
||||||
*
|
|
||||||
* Creating a usermod:
|
|
||||||
* This file serves as an example. If you want to create a usermod, it is recommended to use usermod_v2_empty.h from the usermods folder as a template.
|
|
||||||
* Please remember to rename the class and file to a descriptive name.
|
|
||||||
* You may also use multiple .h and .cpp files.
|
|
||||||
*
|
|
||||||
* Using a usermod:
|
|
||||||
* 1. Copy the usermod into the sketch folder (same folder as wled00.ino)
|
|
||||||
* 2. Register the usermod by adding #include "usermod_filename.h" in the top and registerUsermod(new MyUsermodClass()) in the bottom of usermods_list.cpp
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class PIRsensorSwitch : public Usermod
|
class PIRsensorSwitch : public Usermod
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/**
|
// constructor
|
||||||
* constructor
|
|
||||||
*/
|
|
||||||
PIRsensorSwitch() {}
|
PIRsensorSwitch() {}
|
||||||
/**
|
// destructor
|
||||||
* desctructor
|
|
||||||
*/
|
|
||||||
~PIRsensorSwitch() {}
|
~PIRsensorSwitch() {}
|
||||||
|
|
||||||
/**
|
//Enable/Disable the PIR sensor
|
||||||
* Enable/Disable the PIR sensor
|
|
||||||
*/
|
|
||||||
void EnablePIRsensor(bool en) { enabled = en; }
|
void EnablePIRsensor(bool en) { enabled = en; }
|
||||||
/**
|
|
||||||
* Get PIR sensor enabled/disabled state
|
// Get PIR sensor enabled/disabled state
|
||||||
*/
|
|
||||||
bool PIRsensorEnabled() { return enabled; }
|
bool PIRsensorEnabled() { return enabled; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -78,6 +62,9 @@ private:
|
|||||||
bool m_offOnly = false;
|
bool m_offOnly = false;
|
||||||
bool m_offMode = offMode;
|
bool m_offMode = offMode;
|
||||||
|
|
||||||
|
// Home Assistant
|
||||||
|
bool HomeAssistantDiscovery = false; // is HA discovery turned on
|
||||||
|
|
||||||
// strings to reduce flash memory usage (used more than twice)
|
// strings to reduce flash memory usage (used more than twice)
|
||||||
static const char _name[];
|
static const char _name[];
|
||||||
static const char _switchOffDelay[];
|
static const char _switchOffDelay[];
|
||||||
@@ -87,6 +74,7 @@ private:
|
|||||||
static const char _nightTime[];
|
static const char _nightTime[];
|
||||||
static const char _mqttOnly[];
|
static const char _mqttOnly[];
|
||||||
static const char _offOnly[];
|
static const char _offOnly[];
|
||||||
|
static const char _haDiscovery[];
|
||||||
static const char _notify[];
|
static const char _notify[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -167,7 +155,7 @@ private:
|
|||||||
void publishMqtt(const char* state)
|
void publishMqtt(const char* state)
|
||||||
{
|
{
|
||||||
//Check if MQTT Connected, otherwise it will crash the 8266
|
//Check if MQTT Connected, otherwise it will crash the 8266
|
||||||
if (WLED_MQTT_CONNECTED){
|
if (WLED_MQTT_CONNECTED) {
|
||||||
char subuf[64];
|
char subuf[64];
|
||||||
strcpy(subuf, mqttDeviceTopic);
|
strcpy(subuf, mqttDeviceTopic);
|
||||||
strcat_P(subuf, PSTR("/motion"));
|
strcat_P(subuf, PSTR("/motion"));
|
||||||
@@ -175,6 +163,40 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create an MQTT Binary Sensor for Home Assistant Discovery purposes, this includes a pointer to the topic that is published to in the Loop.
|
||||||
|
void publishHomeAssistantAutodiscovery()
|
||||||
|
{
|
||||||
|
if (WLED_MQTT_CONNECTED) {
|
||||||
|
StaticJsonDocument<600> doc;
|
||||||
|
char uid[24], json_str[1024], buf[128];
|
||||||
|
|
||||||
|
sprintf_P(buf, PSTR("%s Motion"), serverDescription); //max length: 33 + 7 = 40
|
||||||
|
doc[F("name")] = buf;
|
||||||
|
sprintf_P(buf, PSTR("%s/motion"), mqttDeviceTopic); //max length: 33 + 7 = 40
|
||||||
|
doc[F("stat_t")] = buf;
|
||||||
|
doc[F("pl_on")] = "on";
|
||||||
|
doc[F("pl_off")] = "off";
|
||||||
|
sprintf_P(uid, PSTR("%s_motion"), escapedMac.c_str());
|
||||||
|
doc[F("uniq_id")] = uid;
|
||||||
|
doc[F("dev_cla")] = F("motion");
|
||||||
|
doc[F("exp_aft")] = 1800;
|
||||||
|
|
||||||
|
JsonObject device = doc.createNestedObject(F("device")); // attach the sensor to the same device
|
||||||
|
device[F("name")] = serverDescription;
|
||||||
|
device[F("ids")] = String(F("wled-sensor-")) + mqttClientID;
|
||||||
|
device[F("mf")] = "WLED";
|
||||||
|
device[F("mdl")] = F("FOSS");
|
||||||
|
device[F("sw")] = versionString;
|
||||||
|
|
||||||
|
sprintf_P(buf, PSTR("homeassistant/binary_sensor/%s/config"), uid);
|
||||||
|
DEBUG_PRINTLN(buf);
|
||||||
|
size_t payload_size = serializeJson(doc, json_str);
|
||||||
|
DEBUG_PRINTLN(json_str);
|
||||||
|
|
||||||
|
mqtt->publish(buf, 0, true, json_str, payload_size); // do we really need to retain?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read and update PIR sensor state.
|
* Read and update PIR sensor state.
|
||||||
* Initilize/reset switch off timer
|
* Initilize/reset switch off timer
|
||||||
@@ -251,6 +273,15 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* onMqttConnect() is called when MQTT connection is established
|
||||||
|
*/
|
||||||
|
void onMqttConnect(bool sessionPresent) {
|
||||||
|
if (HomeAssistantDiscovery) {
|
||||||
|
publishHomeAssistantAutodiscovery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* loop() is called continuously. Here you can check for events, read sensors, etc.
|
* loop() is called continuously. Here you can check for events, read sensors, etc.
|
||||||
*/
|
*/
|
||||||
@@ -371,10 +402,17 @@ public:
|
|||||||
top[FPSTR(_nightTime)] = m_nightTimeOnly;
|
top[FPSTR(_nightTime)] = m_nightTimeOnly;
|
||||||
top[FPSTR(_mqttOnly)] = m_mqttOnly;
|
top[FPSTR(_mqttOnly)] = m_mqttOnly;
|
||||||
top[FPSTR(_offOnly)] = m_offOnly;
|
top[FPSTR(_offOnly)] = m_offOnly;
|
||||||
|
top[FPSTR(_haDiscovery)] = HomeAssistantDiscovery;
|
||||||
top[FPSTR(_notify)] = (NotifyUpdateMode != CALL_MODE_NO_NOTIFY);
|
top[FPSTR(_notify)] = (NotifyUpdateMode != CALL_MODE_NO_NOTIFY);
|
||||||
DEBUG_PRINTLN(F("PIR config saved."));
|
DEBUG_PRINTLN(F("PIR config saved."));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void appendConfigData()
|
||||||
|
{
|
||||||
|
oappend(SET_F("addInfo('PIRsensorSwitch:HA-discovery',1,'HA=Home Assistant');")); // 0 is field type, 1 is actual field
|
||||||
|
oappend(SET_F("addInfo('PIRsensorSwitch:notifications',1,'Periodic WS updates');")); // 0 is field type, 1 is actual field
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* restore the changeable values
|
* restore the changeable values
|
||||||
* readFromConfig() is called before setup() to populate properties from values stored in cfg.json
|
* readFromConfig() is called before setup() to populate properties from values stored in cfg.json
|
||||||
@@ -407,6 +445,7 @@ public:
|
|||||||
m_nightTimeOnly = top[FPSTR(_nightTime)] | m_nightTimeOnly;
|
m_nightTimeOnly = top[FPSTR(_nightTime)] | m_nightTimeOnly;
|
||||||
m_mqttOnly = top[FPSTR(_mqttOnly)] | m_mqttOnly;
|
m_mqttOnly = top[FPSTR(_mqttOnly)] | m_mqttOnly;
|
||||||
m_offOnly = top[FPSTR(_offOnly)] | m_offOnly;
|
m_offOnly = top[FPSTR(_offOnly)] | m_offOnly;
|
||||||
|
HomeAssistantDiscovery = top[FPSTR(_haDiscovery)] | HomeAssistantDiscovery;
|
||||||
|
|
||||||
NotifyUpdateMode = top[FPSTR(_notify)] ? CALL_MODE_DIRECT_CHANGE : CALL_MODE_NO_NOTIFY;
|
NotifyUpdateMode = top[FPSTR(_notify)] ? CALL_MODE_DIRECT_CHANGE : CALL_MODE_NO_NOTIFY;
|
||||||
|
|
||||||
@@ -435,7 +474,7 @@ public:
|
|||||||
DEBUG_PRINTLN(F(" config (re)loaded."));
|
DEBUG_PRINTLN(F(" config (re)loaded."));
|
||||||
}
|
}
|
||||||
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
|
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
|
||||||
return !top[FPSTR(_notify)].isNull();
|
return !top[FPSTR(_haDiscovery)].isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -457,4 +496,5 @@ const char PIRsensorSwitch::_offPreset[] PROGMEM = "off-preset";
|
|||||||
const char PIRsensorSwitch::_nightTime[] PROGMEM = "nighttime-only";
|
const char PIRsensorSwitch::_nightTime[] PROGMEM = "nighttime-only";
|
||||||
const char PIRsensorSwitch::_mqttOnly[] PROGMEM = "mqtt-only";
|
const char PIRsensorSwitch::_mqttOnly[] PROGMEM = "mqtt-only";
|
||||||
const char PIRsensorSwitch::_offOnly[] PROGMEM = "off-only";
|
const char PIRsensorSwitch::_offOnly[] PROGMEM = "off-only";
|
||||||
|
const char PIRsensorSwitch::_haDiscovery[] PROGMEM = "HA-discovery";
|
||||||
const char PIRsensorSwitch::_notify[] PROGMEM = "notifications";
|
const char PIRsensorSwitch::_notify[] PROGMEM = "notifications";
|
||||||
|
|||||||
@@ -4,3 +4,16 @@ By @bwente
|
|||||||
|
|
||||||
See https://www.hackster.io/bwente/word-clock-with-just-two-components-073834 for the hardware guide!
|
See https://www.hackster.io/bwente/word-clock-with-just-two-components-073834 for the hardware guide!
|
||||||
Includes a customizable feature to lower the brightness at night.
|
Includes a customizable feature to lower the brightness at night.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|||||||
338
usermods/word-clock-matrix/usermod_word_clock_matrix.h
Normal file
338
usermods/word-clock-matrix/usermod_word_clock_matrix.h
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "wled.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Things to do...
|
||||||
|
* Turn on ntp clock 24h format
|
||||||
|
* 64 LEDS
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class WordClockMatrix : public Usermod
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
unsigned long lastTime = 0;
|
||||||
|
uint8_t minuteLast = 99;
|
||||||
|
int dayBrightness = 128;
|
||||||
|
int nightBrightness = 16;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.println("Hello from my usermod!");
|
||||||
|
|
||||||
|
//saveMacro(14, "A=128", false);
|
||||||
|
//saveMacro(15, "A=64", false);
|
||||||
|
//saveMacro(16, "A=16", false);
|
||||||
|
|
||||||
|
//saveMacro(1, "&FX=0&R=255&G=255&B=255", false);
|
||||||
|
|
||||||
|
//strip.getSegment(1).setOption(SEG_OPTION_SELECTED, true);
|
||||||
|
|
||||||
|
//select first two segments (background color + FX settable)
|
||||||
|
WS2812FX::Segment &seg = strip.getSegment(0);
|
||||||
|
seg.colors[0] = ((0 << 24) | ((0 & 0xFF) << 16) | ((0 & 0xFF) << 8) | ((0 & 0xFF)));
|
||||||
|
strip.getSegment(0).setOption(0, false);
|
||||||
|
strip.getSegment(0).setOption(2, false);
|
||||||
|
//other segments are text
|
||||||
|
for (int i = 1; i < 10; i++)
|
||||||
|
{
|
||||||
|
WS2812FX::Segment &seg = strip.getSegment(i);
|
||||||
|
seg.colors[0] = ((0 << 24) | ((0 & 0xFF) << 16) | ((190 & 0xFF) << 8) | ((180 & 0xFF)));
|
||||||
|
strip.getSegment(i).setOption(0, true);
|
||||||
|
strip.setBrightness(64);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void connected()
|
||||||
|
{
|
||||||
|
Serial.println("Connected to WiFi!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void selectWordSegments(bool state)
|
||||||
|
{
|
||||||
|
for (int i = 1; i < 10; i++)
|
||||||
|
{
|
||||||
|
//WS2812FX::Segment &seg = strip.getSegment(i);
|
||||||
|
strip.getSegment(i).setOption(0, state);
|
||||||
|
// strip.getSegment(1).setOption(SEG_OPTION_SELECTED, true);
|
||||||
|
//seg.mode = 12;
|
||||||
|
//seg.palette = 1;
|
||||||
|
//strip.setBrightness(255);
|
||||||
|
}
|
||||||
|
strip.getSegment(0).setOption(0, !state);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hourChime()
|
||||||
|
{
|
||||||
|
//strip.resetSegments();
|
||||||
|
selectWordSegments(true);
|
||||||
|
colorUpdated(CALL_MODE_FX_CHANGED);
|
||||||
|
savePreset(13, false);
|
||||||
|
selectWordSegments(false);
|
||||||
|
//strip.getSegment(0).setOption(0, true);
|
||||||
|
strip.getSegment(0).setOption(2, true);
|
||||||
|
applyPreset(12);
|
||||||
|
colorUpdated(CALL_MODE_FX_CHANGED);
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayTime(byte hour, byte minute)
|
||||||
|
{
|
||||||
|
bool isToHour = false; //true if minute > 30
|
||||||
|
strip.setSegment(0, 0, 64); // background
|
||||||
|
strip.setSegment(1, 0, 2); //It is
|
||||||
|
|
||||||
|
strip.setSegment(2, 0, 0);
|
||||||
|
strip.setSegment(3, 0, 0); //disable minutes
|
||||||
|
strip.setSegment(4, 0, 0); //past
|
||||||
|
strip.setSegment(6, 0, 0); //to
|
||||||
|
strip.setSegment(8, 0, 0); //disable o'clock
|
||||||
|
|
||||||
|
if (hour < 24) //valid time, display
|
||||||
|
{
|
||||||
|
if (minute == 30)
|
||||||
|
{
|
||||||
|
strip.setSegment(2, 3, 6); //half
|
||||||
|
strip.setSegment(3, 0, 0); //minutes
|
||||||
|
}
|
||||||
|
else if (minute == 15 || minute == 45)
|
||||||
|
{
|
||||||
|
strip.setSegment(3, 0, 0); //minutes
|
||||||
|
}
|
||||||
|
else if (minute == 10)
|
||||||
|
{
|
||||||
|
//strip.setSegment(5, 6, 8); //ten
|
||||||
|
}
|
||||||
|
else if (minute == 5)
|
||||||
|
{
|
||||||
|
//strip.setSegment(5, 16, 18); //five
|
||||||
|
}
|
||||||
|
else if (minute == 0)
|
||||||
|
{
|
||||||
|
strip.setSegment(3, 0, 0); //minutes
|
||||||
|
//hourChime();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strip.setSegment(3, 18, 22); //minutes
|
||||||
|
}
|
||||||
|
|
||||||
|
//past or to?
|
||||||
|
if (minute == 0)
|
||||||
|
{ //full hour
|
||||||
|
strip.setSegment(3, 0, 0); //disable minutes
|
||||||
|
strip.setSegment(4, 0, 0); //disable past
|
||||||
|
strip.setSegment(6, 0, 0); //disable to
|
||||||
|
strip.setSegment(8, 60, 64); //o'clock
|
||||||
|
}
|
||||||
|
else if (minute > 34)
|
||||||
|
{
|
||||||
|
//strip.setSegment(6, 22, 24); //to
|
||||||
|
//minute = 60 - minute;
|
||||||
|
isToHour = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//strip.setSegment(4, 24, 27); //past
|
||||||
|
//isToHour = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//byte minuteRem = minute %10;
|
||||||
|
|
||||||
|
if (minute <= 4)
|
||||||
|
{
|
||||||
|
strip.setSegment(3, 0, 0); //nothing
|
||||||
|
strip.setSegment(5, 0, 0); //nothing
|
||||||
|
strip.setSegment(6, 0, 0); //nothing
|
||||||
|
strip.setSegment(8, 60, 64); //o'clock
|
||||||
|
}
|
||||||
|
else if (minute <= 9)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 16, 18); // five past
|
||||||
|
strip.setSegment(4, 24, 27); //past
|
||||||
|
}
|
||||||
|
else if (minute <= 14)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 6, 8); // ten past
|
||||||
|
strip.setSegment(4, 24, 27); //past
|
||||||
|
}
|
||||||
|
else if (minute <= 19)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 8, 12); // quarter past
|
||||||
|
strip.setSegment(3, 0, 0); //minutes
|
||||||
|
strip.setSegment(4, 24, 27); //past
|
||||||
|
}
|
||||||
|
else if (minute <= 24)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 12, 16); // twenty past
|
||||||
|
strip.setSegment(4, 24, 27); //past
|
||||||
|
}
|
||||||
|
else if (minute <= 29)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 12, 18); // twenty-five past
|
||||||
|
strip.setSegment(4, 24, 27); //past
|
||||||
|
}
|
||||||
|
else if (minute <= 34)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 3, 6); // half past
|
||||||
|
strip.setSegment(3, 0, 0); //minutes
|
||||||
|
strip.setSegment(4, 24, 27); //past
|
||||||
|
}
|
||||||
|
else if (minute <= 39)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 12, 18); // twenty-five to
|
||||||
|
strip.setSegment(6, 22, 24); //to
|
||||||
|
}
|
||||||
|
else if (minute <= 44)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 12, 16); // twenty to
|
||||||
|
strip.setSegment(6, 22, 24); //to
|
||||||
|
}
|
||||||
|
else if (minute <= 49)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 8, 12); // quarter to
|
||||||
|
strip.setSegment(3, 0, 0); //minutes
|
||||||
|
strip.setSegment(6, 22, 24); //to
|
||||||
|
}
|
||||||
|
else if (minute <= 54)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 6, 8); // ten to
|
||||||
|
strip.setSegment(6, 22, 24); //to
|
||||||
|
}
|
||||||
|
else if (minute <= 59)
|
||||||
|
{
|
||||||
|
strip.setSegment(5, 16, 18); // five to
|
||||||
|
strip.setSegment(6, 22, 24); //to
|
||||||
|
}
|
||||||
|
|
||||||
|
//hours
|
||||||
|
if (hour > 23)
|
||||||
|
return;
|
||||||
|
if (isToHour)
|
||||||
|
hour++;
|
||||||
|
if (hour > 12)
|
||||||
|
hour -= 12;
|
||||||
|
if (hour == 0)
|
||||||
|
hour = 12;
|
||||||
|
|
||||||
|
switch (hour)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
strip.setSegment(7, 27, 29);
|
||||||
|
break; //one
|
||||||
|
case 2:
|
||||||
|
strip.setSegment(7, 35, 37);
|
||||||
|
break; //two
|
||||||
|
case 3:
|
||||||
|
strip.setSegment(7, 29, 32);
|
||||||
|
break; //three
|
||||||
|
case 4:
|
||||||
|
strip.setSegment(7, 32, 35);
|
||||||
|
break; //four
|
||||||
|
case 5:
|
||||||
|
strip.setSegment(7, 37, 40);
|
||||||
|
break; //five
|
||||||
|
case 6:
|
||||||
|
strip.setSegment(7, 43, 45);
|
||||||
|
break; //six
|
||||||
|
case 7:
|
||||||
|
strip.setSegment(7, 40, 43);
|
||||||
|
break; //seven
|
||||||
|
case 8:
|
||||||
|
strip.setSegment(7, 45, 48);
|
||||||
|
break; //eight
|
||||||
|
case 9:
|
||||||
|
strip.setSegment(7, 48, 50);
|
||||||
|
break; //nine
|
||||||
|
case 10:
|
||||||
|
strip.setSegment(7, 54, 56);
|
||||||
|
break; //ten
|
||||||
|
case 11:
|
||||||
|
strip.setSegment(7, 50, 54);
|
||||||
|
break; //eleven
|
||||||
|
case 12:
|
||||||
|
strip.setSegment(7, 56, 60);
|
||||||
|
break; //twelve
|
||||||
|
}
|
||||||
|
|
||||||
|
selectWordSegments(true);
|
||||||
|
applyMacro(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void timeOfDay()
|
||||||
|
{
|
||||||
|
// NOT USED: use timed macros instead
|
||||||
|
//Used to set brightness dependant of time of day - lights dimmed at night
|
||||||
|
|
||||||
|
//monday to thursday and sunday
|
||||||
|
|
||||||
|
if ((weekday(localTime) == 6) | (weekday(localTime) == 7))
|
||||||
|
{
|
||||||
|
if ((hour(localTime) > 0) | (hour(localTime) < 8))
|
||||||
|
{
|
||||||
|
strip.setBrightness(nightBrightness);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strip.setBrightness(dayBrightness);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((hour(localTime) < 6) | (hour(localTime) >= 22))
|
||||||
|
{
|
||||||
|
strip.setBrightness(nightBrightness);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strip.setBrightness(dayBrightness);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//loop. You can use "if (WLED_CONNECTED)" to check for successful connection
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (millis() - lastTime > 1000) {
|
||||||
|
//Serial.println("I'm alive!");
|
||||||
|
Serial.println(hour(localTime));
|
||||||
|
lastTime = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (minute(localTime) != minuteLast)
|
||||||
|
{
|
||||||
|
updateLocalTime();
|
||||||
|
//timeOfDay();
|
||||||
|
minuteLast = minute(localTime);
|
||||||
|
displayTime(hour(localTime), minute(localTime));
|
||||||
|
if (minute(localTime) == 0)
|
||||||
|
{
|
||||||
|
hourChime();
|
||||||
|
}
|
||||||
|
if (minute(localTime) == 1)
|
||||||
|
{
|
||||||
|
//turn off background segment;
|
||||||
|
strip.getSegment(0).setOption(2, false);
|
||||||
|
//applyPreset(13);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addToConfig(JsonObject& root)
|
||||||
|
{
|
||||||
|
JsonObject modName = root.createNestedObject("id");
|
||||||
|
modName["mdns"] = "wled-word-clock";
|
||||||
|
modName["name"] = "WLED WORD CLOCK";
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t getId()
|
||||||
|
{
|
||||||
|
return USERMOD_ID_WORD_CLOCK_MATRIX;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
@@ -14,17 +14,25 @@ void onAlexaChange(EspalexaDevice* dev);
|
|||||||
|
|
||||||
void alexaInit()
|
void alexaInit()
|
||||||
{
|
{
|
||||||
if (alexaEnabled && WLED_CONNECTED)
|
if (!alexaEnabled || !WLED_CONNECTED) return;
|
||||||
{
|
|
||||||
if (espalexaDevice == nullptr) //only init once
|
espalexa.removeAllDevices();
|
||||||
|
// the original configured device for on/off or macros (added first, i.e. index 0)
|
||||||
|
espalexaDevice = new EspalexaDevice(alexaInvocationName, onAlexaChange, EspalexaDeviceType::extendedcolor);
|
||||||
|
espalexa.addDevice(espalexaDevice);
|
||||||
|
|
||||||
|
// up to 9 devices (added second, third, ... i.e. index 1 to 9) serve for switching on up to nine presets (preset IDs 1 to 9 in WLED),
|
||||||
|
// names are identical as the preset names, switching off can be done by switching off any of them
|
||||||
|
if (alexaNumPresets) {
|
||||||
|
String name = "";
|
||||||
|
for (byte presetIndex = 1; presetIndex <= alexaNumPresets; presetIndex++)
|
||||||
{
|
{
|
||||||
espalexaDevice = new EspalexaDevice(alexaInvocationName, onAlexaChange, EspalexaDeviceType::extendedcolor);
|
if (!getPresetName(presetIndex, name)) break; // no more presets
|
||||||
espalexa.addDevice(espalexaDevice);
|
EspalexaDevice* dev = new EspalexaDevice(name.c_str(), onAlexaChange, EspalexaDeviceType::extendedcolor);
|
||||||
espalexa.begin(&server);
|
espalexa.addDevice(dev);
|
||||||
} else {
|
|
||||||
espalexaDevice->setName(alexaInvocationName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
espalexa.begin(&server);
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleAlexa()
|
void handleAlexa()
|
||||||
@@ -35,20 +43,34 @@ void handleAlexa()
|
|||||||
|
|
||||||
void onAlexaChange(EspalexaDevice* dev)
|
void onAlexaChange(EspalexaDevice* dev)
|
||||||
{
|
{
|
||||||
EspalexaDeviceProperty m = espalexaDevice->getLastChangedProperty();
|
EspalexaDeviceProperty m = dev->getLastChangedProperty();
|
||||||
|
|
||||||
if (m == EspalexaDeviceProperty::on)
|
if (m == EspalexaDeviceProperty::on)
|
||||||
{
|
{
|
||||||
if (!macroAlexaOn)
|
if (dev->getId() == 0) // Device 0 is for on/off or macros
|
||||||
{
|
{
|
||||||
if (bri == 0)
|
if (!macroAlexaOn)
|
||||||
{
|
{
|
||||||
bri = briLast;
|
if (bri == 0)
|
||||||
stateUpdated(CALL_MODE_ALEXA);
|
{
|
||||||
|
bri = briLast;
|
||||||
|
stateUpdated(CALL_MODE_ALEXA);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
applyPreset(macroAlexaOn, CALL_MODE_ALEXA);
|
||||||
|
if (bri == 0) dev->setValue(briLast); //stop Alexa from complaining if macroAlexaOn does not actually turn on
|
||||||
}
|
}
|
||||||
} else {
|
} else // switch-on behavior for preset devices
|
||||||
applyPreset(macroAlexaOn, CALL_MODE_ALEXA);
|
{
|
||||||
if (bri == 0) espalexaDevice->setValue(briLast); //stop Alexa from complaining if macroAlexaOn does not actually turn on
|
// turn off other preset devices
|
||||||
|
for (byte i = 1; i < espalexa.getDeviceCount(); i++)
|
||||||
|
{
|
||||||
|
if (i == dev->getId()) continue;
|
||||||
|
espalexa.getDevice(i)->setValue(0); // turn off other presets
|
||||||
|
}
|
||||||
|
|
||||||
|
applyPreset(dev->getId(), CALL_MODE_ALEXA); // in alexaInit() preset 1 device was added second (index 1), preset 2 third (index 2) etc.
|
||||||
}
|
}
|
||||||
} else if (m == EspalexaDeviceProperty::off)
|
} else if (m == EspalexaDeviceProperty::off)
|
||||||
{
|
{
|
||||||
@@ -60,20 +82,25 @@ void onAlexaChange(EspalexaDevice* dev)
|
|||||||
bri = 0;
|
bri = 0;
|
||||||
stateUpdated(CALL_MODE_ALEXA);
|
stateUpdated(CALL_MODE_ALEXA);
|
||||||
}
|
}
|
||||||
} else {
|
} else
|
||||||
|
{
|
||||||
applyPreset(macroAlexaOff, CALL_MODE_ALEXA);
|
applyPreset(macroAlexaOff, CALL_MODE_ALEXA);
|
||||||
if (bri != 0) espalexaDevice->setValue(0); //stop Alexa from complaining if macroAlexaOff does not actually turn off
|
// below for loop stops Alexa from complaining if macroAlexaOff does not actually turn off
|
||||||
|
}
|
||||||
|
for (byte i = 0; i < espalexa.getDeviceCount(); i++)
|
||||||
|
{
|
||||||
|
espalexa.getDevice(i)->setValue(0);
|
||||||
}
|
}
|
||||||
} else if (m == EspalexaDeviceProperty::bri)
|
} else if (m == EspalexaDeviceProperty::bri)
|
||||||
{
|
{
|
||||||
bri = espalexaDevice->getValue();
|
bri = dev->getValue();
|
||||||
stateUpdated(CALL_MODE_ALEXA);
|
stateUpdated(CALL_MODE_ALEXA);
|
||||||
} else //color
|
} else //color
|
||||||
{
|
{
|
||||||
if (espalexaDevice->getColorMode() == EspalexaColorMode::ct) //shade of white
|
if (dev->getColorMode() == EspalexaColorMode::ct) //shade of white
|
||||||
{
|
{
|
||||||
byte rgbw[4];
|
byte rgbw[4];
|
||||||
uint16_t ct = espalexaDevice->getCt();
|
uint16_t ct = dev->getCt();
|
||||||
if (!ct) return;
|
if (!ct) return;
|
||||||
uint16_t k = 1000000 / ct; //mireds to kelvin
|
uint16_t k = 1000000 / ct; //mireds to kelvin
|
||||||
|
|
||||||
@@ -94,7 +121,7 @@ void onAlexaChange(EspalexaDevice* dev)
|
|||||||
}
|
}
|
||||||
strip.setColor(0, RGBW32(rgbw[0], rgbw[1], rgbw[2], rgbw[3]));
|
strip.setColor(0, RGBW32(rgbw[0], rgbw[1], rgbw[2], rgbw[3]));
|
||||||
} else {
|
} else {
|
||||||
uint32_t color = espalexaDevice->getRGB();
|
uint32_t color = dev->getRGB();
|
||||||
strip.setColor(0, color);
|
strip.setColor(0, color);
|
||||||
}
|
}
|
||||||
stateUpdated(CALL_MODE_ALEXA);
|
stateUpdated(CALL_MODE_ALEXA);
|
||||||
|
|||||||
@@ -392,6 +392,8 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
|
|||||||
CJSON(macroAlexaOn, interfaces["va"]["macros"][0]);
|
CJSON(macroAlexaOn, interfaces["va"]["macros"][0]);
|
||||||
CJSON(macroAlexaOff, interfaces["va"]["macros"][1]);
|
CJSON(macroAlexaOff, interfaces["va"]["macros"][1]);
|
||||||
|
|
||||||
|
CJSON(alexaNumPresets, interfaces["va"]["p"]);
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_BLYNK
|
#ifndef WLED_DISABLE_BLYNK
|
||||||
const char* apikey = interfaces["blynk"][F("token")] | "Hidden";
|
const char* apikey = interfaces["blynk"][F("token")] | "Hidden";
|
||||||
tdd = strnlen(apikey, 36);
|
tdd = strnlen(apikey, 36);
|
||||||
@@ -555,11 +557,21 @@ void deserializeConfigFromFS() {
|
|||||||
DEBUG_PRINTLN(F("Reading settings from /cfg.json..."));
|
DEBUG_PRINTLN(F("Reading settings from /cfg.json..."));
|
||||||
|
|
||||||
success = readObjectFromFile("/cfg.json", nullptr, &doc);
|
success = readObjectFromFile("/cfg.json", nullptr, &doc);
|
||||||
if (!success) { //if file does not exist, try reading from EEPROM
|
if (!success) { // if file does not exist, optionally try reading from EEPROM and then save defaults to FS
|
||||||
|
releaseJSONBufferLock();
|
||||||
#ifdef WLED_ADD_EEPROM_SUPPORT
|
#ifdef WLED_ADD_EEPROM_SUPPORT
|
||||||
deEEPSettings();
|
deEEPSettings();
|
||||||
#endif
|
#endif
|
||||||
releaseJSONBufferLock();
|
|
||||||
|
// save default values to /cfg.json
|
||||||
|
// call readFromConfig() with an empty object so that usermods can initialize to defaults prior to saving
|
||||||
|
JsonObject empty = JsonObject();
|
||||||
|
usermods.readFromConfig(empty);
|
||||||
|
serializeConfig();
|
||||||
|
// init Ethernet (in case default type is set at compile time)
|
||||||
|
#ifdef WLED_USE_ETHERNET
|
||||||
|
WLED::instance().initEthernet();
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,7 +580,7 @@ void deserializeConfigFromFS() {
|
|||||||
bool needsSave = deserializeConfig(doc.as<JsonObject>(), true);
|
bool needsSave = deserializeConfig(doc.as<JsonObject>(), true);
|
||||||
releaseJSONBufferLock();
|
releaseJSONBufferLock();
|
||||||
|
|
||||||
if (needsSave) serializeConfig(); // usermods required new prameters
|
if (needsSave) serializeConfig(); // usermods required new parameters
|
||||||
}
|
}
|
||||||
|
|
||||||
void serializeConfig() {
|
void serializeConfig() {
|
||||||
@@ -839,6 +851,8 @@ void serializeConfig() {
|
|||||||
if_va_macros.add(macroAlexaOn);
|
if_va_macros.add(macroAlexaOn);
|
||||||
if_va_macros.add(macroAlexaOff);
|
if_va_macros.add(macroAlexaOff);
|
||||||
|
|
||||||
|
if_va["p"] = alexaNumPresets;
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_BLYNK
|
#ifndef WLED_DISABLE_BLYNK
|
||||||
JsonObject if_blynk = interfaces.createNestedObject("blynk");
|
JsonObject if_blynk = interfaces.createNestedObject("blynk");
|
||||||
if_blynk[F("token")] = strlen(blynkApiKey) ? "Hidden":"";
|
if_blynk[F("token")] = strlen(blynkApiKey) ? "Hidden":"";
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ button {
|
|||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: calc(var(--bh) + 6px);
|
bottom: calc(var(--bh) + 6px);
|
||||||
right: 6px;
|
right: 6px;
|
||||||
color: var(--c-d); /* should remain bright (--c-d) with dark shadow (see below) to be legible on gray background */
|
color: var(--c-8); /* set bright (--c-d) with dark text shadow (see below) to be legible on gray background (in image) */
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
writing-mode: vertical-rl;
|
writing-mode: vertical-rl;
|
||||||
/* transform: rotate(180deg); */
|
/* transform: rotate(180deg); */
|
||||||
@@ -1046,7 +1046,7 @@ textarea {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.qcs, #namelabel { /* text shadow for name to be legible on grey backround */
|
.qcs, #namelabel { /* text shadow for name to be legible on grey backround */
|
||||||
text-shadow: -1px -1px 0 var(--c-4), 1px -1px 0 var(--c-4), -1px 1px 0 var(--c-4), 1px 1px 0 var(--c-4);
|
text-shadow: -1px -1px 0 var(--c-1), 1px -1px 0 var(--c-1), -1px 1px 0 var(--c-1), 1px 1px 0 var(--c-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.psts {
|
.psts {
|
||||||
|
|||||||
@@ -182,6 +182,7 @@ function loadBg(iUrl)
|
|||||||
bg.style.opacity = a;
|
bg.style.opacity = a;
|
||||||
bg.style.backgroundImage = `url(${img.src})`;
|
bg.style.backgroundImage = `url(${img.src})`;
|
||||||
img = null;
|
img = null;
|
||||||
|
gId('namelabel').style.color = "var(--c-c)"; // improve namelabel legibility on background image
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1519,7 +1520,8 @@ function requestJson(command=null)
|
|||||||
if (tn != tr) command.transition = tn;
|
if (tn != tr) command.transition = tn;
|
||||||
}
|
}
|
||||||
req = JSON.stringify(command);
|
req = JSON.stringify(command);
|
||||||
if (req.length > 1430) useWs = false; // do not send very long requests over websocket
|
if (req.length > 1340) useWs = false; // do not send very long requests over websocket
|
||||||
|
if (req.length > 500 && lastinfo && lastinfo.arch == "esp8266") useWs = false; // esp8266 can only handle 500 bytes
|
||||||
};
|
};
|
||||||
|
|
||||||
if (useWs) {
|
if (useWs) {
|
||||||
|
|||||||
@@ -165,7 +165,8 @@ Disable realtime gamma correction: <input type="checkbox" name="RG"><br>
|
|||||||
Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required>
|
Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required>
|
||||||
<h3>Alexa Voice Assistant</h3>
|
<h3>Alexa Voice Assistant</h3>
|
||||||
Emulate Alexa device: <input type="checkbox" name="AL"><br>
|
Emulate Alexa device: <input type="checkbox" name="AL"><br>
|
||||||
Alexa invocation name: <input type="text" name="AI" maxlength="32">
|
Alexa invocation name: <input type="text" name="AI" maxlength="32"><br>
|
||||||
|
Also emulate devices to call the first <input name="AP" type="number" class="s" min="0" max="9" required> presets
|
||||||
<h3>Blynk</h3>
|
<h3>Blynk</h3>
|
||||||
<b>Blynk, MQTT and Hue sync all connect to external hosts!<br>
|
<b>Blynk, MQTT and Hue sync all connect to external hosts!<br>
|
||||||
This may impact the responsiveness of the ESP8266.</b><br>
|
This may impact the responsiveness of the ESP8266.</b><br>
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ inline bool applyTemporaryPreset() {return applyPreset(255);};
|
|||||||
void savePreset(byte index, const char* pname = nullptr, JsonObject saveobj = JsonObject());
|
void savePreset(byte index, const char* pname = nullptr, JsonObject saveobj = JsonObject());
|
||||||
inline void saveTemporaryPreset() {savePreset(255);};
|
inline void saveTemporaryPreset() {savePreset(255);};
|
||||||
void deletePreset(byte index);
|
void deletePreset(byte index);
|
||||||
|
bool getPresetName(byte index, String& name);
|
||||||
|
|
||||||
//set.cpp
|
//set.cpp
|
||||||
bool isAsterisksOnly(const char* str, byte maxLen);
|
bool isAsterisksOnly(const char* str, byte maxLen);
|
||||||
|
|||||||
@@ -1028,8 +1028,9 @@ const uint8_t PAGE_settings_ui[] PROGMEM = {
|
|||||||
|
|
||||||
|
|
||||||
// Autogenerated from wled00/data/settings_sync.htm, do not edit!!
|
// Autogenerated from wled00/data/settings_sync.htm, do not edit!!
|
||||||
const uint16_t PAGE_settings_sync_length = 3153;
|
const uint16_t PAGE_settings_sync_length = 3184;
|
||||||
const uint8_t PAGE_settings_sync[] PROGMEM = {
|
const uint8_t PAGE_settings_sync[] PROGMEM = {
|
||||||
|
<<<<<<< HEAD
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x5a, 0xeb, 0x77, 0xda, 0xb8,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x5a, 0xeb, 0x77, 0xda, 0xb8,
|
||||||
0x12, 0xff, 0xee, 0xbf, 0x42, 0xf1, 0x87, 0x5d, 0xd8, 0x38, 0x60, 0x20, 0xa4, 0x29, 0xc1, 0xee,
|
0x12, 0xff, 0xee, 0xbf, 0x42, 0xf1, 0x87, 0x5d, 0xd8, 0x38, 0x60, 0x20, 0xa4, 0x29, 0xc1, 0xee,
|
||||||
0x0d, 0x21, 0x4d, 0xd8, 0x6d, 0x1a, 0x0a, 0xe9, 0x3e, 0xce, 0xb9, 0xe7, 0xec, 0x11, 0xb6, 0x00,
|
0x0d, 0x21, 0x4d, 0xd8, 0x6d, 0x1a, 0x0a, 0xe9, 0x3e, 0xce, 0xb9, 0xe7, 0xec, 0x11, 0xb6, 0x00,
|
||||||
@@ -1228,6 +1229,207 @@ const uint8_t PAGE_settings_sync[] PROGMEM = {
|
|||||||
0xee, 0xfe, 0x24, 0xf6, 0x23, 0x5f, 0xb7, 0xb4, 0xa5, 0x2f, 0x67, 0xf8, 0x05, 0x0f, 0xfe, 0xe0,
|
0xee, 0xfe, 0x24, 0xf6, 0x23, 0x5f, 0xb7, 0xb4, 0xa5, 0x2f, 0x67, 0xf8, 0x05, 0x0f, 0xfe, 0xe0,
|
||||||
0x57, 0x3e, 0xfc, 0xe4, 0x87, 0xff, 0xa7, 0xe5, 0x7f, 0x3e, 0xc3, 0x8a, 0xee, 0xe3, 0x22, 0x00,
|
0x57, 0x3e, 0xfc, 0xe4, 0x87, 0xff, 0xa7, 0xe5, 0x7f, 0x3e, 0xc3, 0x8a, 0xee, 0xe3, 0x22, 0x00,
|
||||||
0x00
|
0x00
|
||||||
|
=======
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x9d, 0x5a, 0xeb, 0x77, 0xda, 0xb8,
|
||||||
|
0x12, 0xff, 0xee, 0xbf, 0x42, 0xf1, 0x87, 0x5d, 0xd8, 0x10, 0x30, 0x24, 0xa4, 0x29, 0xc1, 0xf4,
|
||||||
|
0x42, 0x48, 0x13, 0x76, 0x9b, 0x86, 0x42, 0xba, 0x8f, 0x73, 0xee, 0x39, 0x7b, 0x84, 0x2d, 0x40,
|
||||||
|
0x89, 0x6d, 0x79, 0x6d, 0x39, 0x8f, 0xd3, 0xed, 0xff, 0x7e, 0x67, 0x24, 0xdb, 0x80, 0x79, 0xf6,
|
||||||
|
0x7e, 0x28, 0xb1, 0x25, 0xcd, 0x68, 0x34, 0x8f, 0xdf, 0xcc, 0xc8, 0x6d, 0x1f, 0xf5, 0xef, 0xaf,
|
||||||
|
0x1e, 0xfe, 0x1a, 0x5e, 0x93, 0xb9, 0xf4, 0xbd, 0x4e, 0x1b, 0x7f, 0x89, 0x47, 0x83, 0x99, 0x6d,
|
||||||
|
0xb2, 0xc0, 0x84, 0x77, 0x46, 0xdd, 0x4e, 0xdb, 0x67, 0x92, 0x92, 0x80, 0xfa, 0xcc, 0x36, 0x9f,
|
||||||
|
0x39, 0x7b, 0x09, 0x45, 0x24, 0x4d, 0xe2, 0x88, 0x40, 0xb2, 0x40, 0xda, 0xe6, 0x0b, 0x77, 0xe5,
|
||||||
|
0xdc, 0x6e, 0x5a, 0x96, 0xd9, 0x31, 0xf4, 0x52, 0xa3, 0x30, 0xe7, 0xb2, 0x67, 0xee, 0xb0, 0x13,
|
||||||
|
0xf5, 0x52, 0xe1, 0x01, 0x97, 0x9c, 0x7a, 0x27, 0xb1, 0x43, 0x3d, 0x66, 0xd7, 0x2b, 0x3e, 0x7d,
|
||||||
|
0xe5, 0x7e, 0xe2, 0xe7, 0xef, 0x49, 0xcc, 0x22, 0xf5, 0x42, 0x27, 0xf0, 0x1e, 0x08, 0x93, 0x18,
|
||||||
|
0x85, 0xad, 0x53, 0x81, 0x9c, 0x39, 0x8d, 0x62, 0x06, 0x9b, 0x24, 0x72, 0x7a, 0x72, 0x01, 0xa3,
|
||||||
|
0x92, 0x4b, 0x8f, 0x75, 0xc6, 0x6f, 0x81, 0x43, 0xc6, 0x4c, 0x4a, 0x1e, 0xcc, 0xe2, 0x76, 0x4d,
|
||||||
|
0x0f, 0xb6, 0x63, 0x27, 0xe2, 0xa1, 0xec, 0x18, 0xcf, 0x34, 0x22, 0x9e, 0x70, 0x78, 0x58, 0x71,
|
||||||
|
0x6d, 0x57, 0x38, 0x89, 0x0f, 0x62, 0x56, 0x60, 0xc0, 0x3e, 0xaa, 0x5f, 0x4e, 0x93, 0xc0, 0x91,
|
||||||
|
0x5c, 0x04, 0x64, 0x36, 0x70, 0x4b, 0xac, 0xfc, 0x2d, 0x62, 0x32, 0x89, 0x02, 0xe2, 0x56, 0x67,
|
||||||
|
0x4c, 0x5e, 0x7b, 0x0c, 0x97, 0xf6, 0xde, 0xd4, 0xd4, 0xf7, 0x7c, 0xe9, 0x6d, 0xa9, 0xfc, 0xed,
|
||||||
|
0x85, 0x07, 0xae, 0x78, 0xa9, 0x8a, 0x90, 0x05, 0x25, 0x73, 0x2e, 0x65, 0x18, 0xb7, 0x6a, 0xb5,
|
||||||
|
0xa7, 0x40, 0x54, 0x5f, 0x3c, 0x86, 0xc4, 0x35, 0x0e, 0xda, 0x88, 0xa6, 0xd4, 0x61, 0x71, 0x2d,
|
||||||
|
0x71, 0xc3, 0x93, 0x40, 0x48, 0x3e, 0xe5, 0x2c, 0xaa, 0x99, 0x4b, 0x8c, 0x7a, 0x45, 0x46, 0xb5,
|
||||||
|
0x38, 0x3d, 0x83, 0x59, 0x31, 0xff, 0x8e, 0x99, 0x37, 0x5d, 0x5e, 0x4d, 0xdd, 0x47, 0x58, 0x7f,
|
||||||
|
0x7e, 0xd6, 0x3c, 0xb3, 0x6d, 0xb7, 0x3a, 0x9e, 0x56, 0xfb, 0x83, 0xea, 0x33, 0xf5, 0x12, 0xf6,
|
||||||
|
0xa1, 0x9e, 0x0e, 0x5c, 0x7f, 0xd5, 0x03, 0x3f, 0xfd, 0x54, 0x5a, 0x79, 0xb7, 0xad, 0x72, 0xab,
|
||||||
|
0xd9, 0x3c, 0xbf, 0x28, 0xd0, 0xc1, 0x32, 0x2b, 0x1b, 0xea, 0xae, 0x52, 0x66, 0xef, 0x76, 0xbd,
|
||||||
|
0x5c, 0xb1, 0xf6, 0x71, 0xaf, 0x97, 0x97, 0xa4, 0xf4, 0x04, 0x75, 0x7f, 0x1d, 0x97, 0x58, 0x45,
|
||||||
|
0xda, 0x47, 0x56, 0xf9, 0x9b, 0xc7, 0x24, 0x11, 0x40, 0xef, 0x44, 0x8c, 0x4a, 0x96, 0x6a, 0xb4,
|
||||||
|
0x64, 0x6a, 0xd3, 0x98, 0xe5, 0x4b, 0x51, 0x85, 0x23, 0x77, 0xa5, 0x8c, 0xf8, 0x24, 0x91, 0x0c,
|
||||||
|
0x26, 0x22, 0xc7, 0xac, 0xb0, 0x72, 0xa5, 0x38, 0x2e, 0xdf, 0x42, 0x06, 0x4a, 0x91, 0xec, 0x55,
|
||||||
|
0xd6, 0x1e, 0xe9, 0x33, 0xcd, 0x18, 0xac, 0x2d, 0xa4, 0x31, 0xf8, 0x82, 0x59, 0x91, 0xe5, 0x8a,
|
||||||
|
0x5b, 0x9d, 0x08, 0xf7, 0xad, 0x4a, 0x43, 0x50, 0xad, 0x7b, 0x35, 0xe7, 0x9e, 0x5b, 0x12, 0xb8,
|
||||||
|
0x9e, 0xba, 0xee, 0xf5, 0x33, 0x48, 0xf1, 0x89, 0xc7, 0xe0, 0xb0, 0x2c, 0x2a, 0x99, 0x28, 0xb3,
|
||||||
|
0x59, 0x29, 0x95, 0xed, 0xce, 0xb7, 0x1b, 0x26, 0x7f, 0x2f, 0x95, 0x2b, 0xe0, 0x4b, 0xbf, 0x53,
|
||||||
|
0xaf, 0x54, 0xfe, 0xbe, 0x99, 0x80, 0x45, 0x91, 0x88, 0x40, 0x4e, 0x20, 0x00, 0xb7, 0x8f, 0x85,
|
||||||
|
0xc7, 0xaa, 0x9e, 0x98, 0x95, 0xcc, 0x6b, 0x1c, 0x27, 0xa9, 0x16, 0xc0, 0x8e, 0x64, 0xca, 0x3d,
|
||||||
|
0xa6, 0xce, 0x03, 0x7e, 0x1e, 0xc1, 0xb9, 0x3f, 0xa5, 0xe3, 0x62, 0x8a, 0xb1, 0x34, 0xe5, 0xb3,
|
||||||
|
0x24, 0xa2, 0x4a, 0x6d, 0xfa, 0x3c, 0x64, 0x4a, 0x39, 0xfa, 0xcf, 0x7f, 0x83, 0x41, 0xe0, 0x08,
|
||||||
|
0x3f, 0x04, 0xed, 0x31, 0x12, 0xd2, 0x19, 0x23, 0x2e, 0x95, 0xf4, 0x08, 0xbc, 0x61, 0x49, 0xd3,
|
||||||
|
0x1f, 0xaf, 0xc0, 0x1d, 0xa6, 0x22, 0x2a, 0x3d, 0xda, 0xd6, 0xe5, 0x63, 0xfb, 0xe2, 0xf2, 0xf1,
|
||||||
|
0xf8, 0xb8, 0x8c, 0x6e, 0x6c, 0xde, 0x98, 0xc7, 0xa5, 0xc7, 0x63, 0x30, 0x4b, 0xd5, 0x99, 0x33,
|
||||||
|
0xe7, 0x89, 0xb9, 0xb6, 0x1e, 0x1e, 0x9b, 0x65, 0x6d, 0xb2, 0x4e, 0xe7, 0xf1, 0xa7, 0x7a, 0x45,
|
||||||
|
0x0d, 0x8e, 0xb6, 0xac, 0x1d, 0xad, 0xac, 0x5d, 0xec, 0x7a, 0x83, 0xbb, 0x62, 0x44, 0x81, 0x57,
|
||||||
|
0x81, 0x8d, 0xad, 0x8a, 0xb0, 0x21, 0x8a, 0x0a, 0x52, 0xb0, 0x63, 0x7b, 0xb3, 0x20, 0xbf, 0x88,
|
||||||
|
0x8a, 0x4c, 0xe7, 0x46, 0x1b, 0xe6, 0xc4, 0x2f, 0x76, 0xe3, 0xb2, 0x20, 0xab, 0xcd, 0x2a, 0x05,
|
||||||
|
0x89, 0x6c, 0xb9, 0x10, 0x67, 0x3c, 0xcc, 0xc5, 0x59, 0xf1, 0x6d, 0xcd, 0xe5, 0x35, 0x04, 0x9a,
|
||||||
|
0x58, 0xbe, 0x81, 0x7d, 0x5c, 0x1e, 0x87, 0x1e, 0x7d, 0xb3, 0x59, 0xc7, 0xfa, 0x60, 0x06, 0x22,
|
||||||
|
0x60, 0x66, 0xcb, 0x9c, 0x00, 0x08, 0x3c, 0x81, 0x79, 0x3a, 0x56, 0xee, 0xd3, 0xc3, 0x6c, 0xd3,
|
||||||
|
0x25, 0x45, 0x67, 0xce, 0xf0, 0x2d, 0x7e, 0xe1, 0xd2, 0x99, 0x97, 0x42, 0xc4, 0xa0, 0x01, 0xb8,
|
||||||
|
0xf1, 0x0a, 0x49, 0xb9, 0xfc, 0xcd, 0xa1, 0x31, 0x23, 0x18, 0x68, 0xad, 0x15, 0x59, 0x6c, 0x1c,
|
||||||
|
0xba, 0x9c, 0x40, 0x04, 0x3c, 0x5d, 0xaa, 0x25, 0x18, 0xc3, 0x85, 0x25, 0x38, 0xb4, 0xbc, 0xe4,
|
||||||
|
0xcc, 0x3a, 0x2b, 0x72, 0xc1, 0xa1, 0xef, 0x78, 0xde, 0x0a, 0x5a, 0x7e, 0x49, 0x3c, 0x90, 0xcc,
|
||||||
|
0x44, 0x47, 0x6b, 0x99, 0xb6, 0x9d, 0xc2, 0x09, 0x1c, 0x4c, 0xf9, 0x55, 0x35, 0x8c, 0x84, 0x14,
|
||||||
|
0x8e, 0xf0, 0xe0, 0x80, 0x0a, 0xf1, 0xac, 0x4a, 0x49, 0x41, 0xa1, 0x8d, 0x2b, 0xbc, 0xb1, 0x14,
|
||||||
|
0x11, 0x78, 0x17, 0x82, 0xdd, 0x40, 0x32, 0x1f, 0x23, 0xc1, 0x19, 0x80, 0xce, 0xca, 0xff, 0xfe,
|
||||||
|
0x9b, 0x2e, 0x03, 0x7a, 0x3f, 0x04, 0xc7, 0xfd, 0x08, 0xfc, 0xc9, 0x9d, 0x70, 0x59, 0x95, 0x0c,
|
||||||
|
0x3d, 0x86, 0x12, 0x32, 0x04, 0x38, 0xf2, 0xc7, 0xa7, 0xeb, 0x3e, 0x19, 0x0c, 0xc1, 0x35, 0x2b,
|
||||||
|
0x2b, 0x1c, 0xe3, 0x55, 0x8e, 0x15, 0xc5, 0xad, 0x5c, 0xc6, 0x55, 0x0a, 0x1f, 0x90, 0xfd, 0x07,
|
||||||
|
0x05, 0x9c, 0x80, 0x9b, 0xe6, 0xb1, 0x9a, 0x6e, 0x99, 0x66, 0xf9, 0x78, 0x81, 0x81, 0xb5, 0xb8,
|
||||||
|
0xfa, 0x18, 0x7f, 0x08, 0xed, 0x33, 0xb3, 0x72, 0x54, 0x2f, 0x7f, 0x37, 0xda, 0xb5, 0x14, 0xd0,
|
||||||
|
0xdb, 0xca, 0xa2, 0x9d, 0xff, 0x70, 0x1f, 0x53, 0x03, 0x49, 0x22, 0x0f, 0x70, 0x43, 0x19, 0xd9,
|
||||||
|
0x89, 0x63, 0xc0, 0x14, 0x58, 0xa8, 0x16, 0xb4, 0x6b, 0x3a, 0x95, 0x21, 0x0c, 0x40, 0x50, 0xe2,
|
||||||
|
0xce, 0xb6, 0x09, 0xda, 0x82, 0xb4, 0x01, 0x0e, 0xeb, 0x1b, 0x84, 0xc3, 0x3b, 0x3e, 0xfd, 0x1d,
|
||||||
|
0x9b, 0x69, 0xaa, 0x1b, 0x4f, 0x4d, 0x02, 0x89, 0x66, 0x2e, 0x60, 0x26, 0x14, 0x31, 0xa4, 0x3c,
|
||||||
|
0x08, 0xef, 0x64, 0xe2, 0x73, 0x48, 0x39, 0xe8, 0xf9, 0x40, 0xea, 0xf2, 0x67, 0xe2, 0x78, 0x34,
|
||||||
|
0x8e, 0x6d, 0x53, 0x0a, 0x50, 0xcf, 0x4b, 0x3a, 0x66, 0xa4, 0x83, 0x73, 0xe6, 0x85, 0x3d, 0x18,
|
||||||
|
0x03, 0x38, 0x92, 0x60, 0x1d, 0x04, 0x2e, 0xdb, 0xd4, 0x2f, 0xc8, 0xcd, 0xf1, 0xb8, 0xf3, 0x64,
|
||||||
|
0x9b, 0xb7, 0xc8, 0xeb, 0x43, 0xbb, 0xa6, 0x27, 0x40, 0x54, 0x60, 0x91, 0xd3, 0x18, 0x5b, 0x88,
|
||||||
|
0x7a, 0x48, 0xd4, 0xa3, 0xce, 0xd3, 0x82, 0x6e, 0x65, 0x17, 0x2d, 0xa9, 0xd9, 0x19, 0xd3, 0x67,
|
||||||
|
0xb6, 0x58, 0x32, 0x8f, 0x20, 0x47, 0x6b, 0xfe, 0xf3, 0x86, 0x4e, 0x95, 0xa0, 0xe2, 0x24, 0x04,
|
||||||
|
0xf5, 0x34, 0x60, 0xe8, 0xb4, 0xa3, 0x6c, 0xd8, 0x8b, 0x40, 0x3d, 0xe0, 0x7a, 0x12, 0x86, 0x4f,
|
||||||
|
0x3b, 0x5f, 0xfb, 0x43, 0x32, 0x04, 0xe5, 0xb6, 0x48, 0x9b, 0x07, 0x61, 0x22, 0x53, 0xf5, 0x7c,
|
||||||
|
0x1d, 0x9a, 0x99, 0x70, 0x41, 0xe2, 0x4f, 0x58, 0x04, 0xda, 0xe2, 0x81, 0x6d, 0xd6, 0xe1, 0x2f,
|
||||||
|
0x7d, 0xb5, 0xcd, 0xf3, 0x66, 0xf3, 0xb4, 0x69, 0x66, 0xea, 0x71, 0xe1, 0x31, 0x62, 0xff, 0x24,
|
||||||
|
0x3c, 0x62, 0x68, 0x85, 0xa8, 0xd3, 0x08, 0xdc, 0x55, 0xae, 0x69, 0x96, 0xff, 0xda, 0x30, 0xc9,
|
||||||
|
0xff, 0xcf, 0x55, 0xfd, 0x5b, 0xe1, 0x07, 0xe0, 0xa1, 0x6c, 0x8b, 0x7f, 0x57, 0xf9, 0x2a, 0xc7,
|
||||||
|
0x00, 0x1e, 0x1a, 0x0c, 0x5a, 0x0a, 0x07, 0x3a, 0xab, 0x67, 0x04, 0x9c, 0xd1, 0xc4, 0xa3, 0xb5,
|
||||||
|
0xb3, 0x6e, 0xa4, 0x6e, 0x4b, 0x2c, 0x5a, 0xb2, 0x39, 0x9f, 0x46, 0x33, 0x1e, 0xb4, 0x2c, 0x42,
|
||||||
|
0x13, 0x29, 0x70, 0x12, 0x64, 0x93, 0x2e, 0x56, 0x47, 0x5e, 0x1c, 0x52, 0x38, 0xd4, 0xfb, 0x9c,
|
||||||
|
0x0d, 0xe6, 0xb2, 0x13, 0xea, 0xf1, 0x59, 0xd0, 0x72, 0x54, 0x30, 0x99, 0xda, 0x38, 0xb3, 0x48,
|
||||||
|
0x24, 0x21, 0x56, 0x31, 0x70, 0xbc, 0x9a, 0xa2, 0x57, 0x3c, 0x3a, 0x7a, 0x04, 0xfe, 0xd5, 0x8d,
|
||||||
|
0xfc, 0xb1, 0x91, 0x3f, 0x9d, 0xe6, 0x4f, 0x67, 0xf9, 0x53, 0x33, 0x7f, 0x3a, 0xcf, 0x9f, 0xde,
|
||||||
|
0xe5, 0x4f, 0x17, 0x8b, 0x2d, 0x8c, 0x6c, 0x8f, 0x31, 0xa4, 0xca, 0x56, 0xbe, 0x22, 0xd5, 0x8b,
|
||||||
|
0x56, 0x82, 0x42, 0xe9, 0x89, 0x78, 0x4d, 0xb5, 0x53, 0xcf, 0x42, 0x06, 0x9e, 0x3a, 0x45, 0x0a,
|
||||||
|
0x63, 0x23, 0x49, 0x23, 0x27, 0x69, 0xac, 0x93, 0x6c, 0xa4, 0x38, 0xcd, 0x0b, 0x41, 0x78, 0x3c,
|
||||||
|
0x8c, 0xe4, 0x2c, 0xdf, 0xe4, 0xec, 0x50, 0xb9, 0x9a, 0x39, 0x49, 0xf3, 0xc0, 0x4d, 0xce, 0x17,
|
||||||
|
0x72, 0x9d, 0x1f, 0x48, 0xf2, 0x2e, 0xdf, 0xe4, 0xdd, 0xa1, 0x72, 0x5d, 0xe4, 0x24, 0x17, 0x19,
|
||||||
|
0xc9, 0xb2, 0x3f, 0x8c, 0x98, 0xc3, 0xf8, 0x33, 0x6b, 0x1d, 0xc4, 0x6c, 0x94, 0xdb, 0x6b, 0x54,
|
||||||
|
0x3f, 0x4c, 0xe2, 0x51, 0x23, 0x3f, 0xe4, 0xe8, 0x40, 0x7b, 0x8d, 0x4e, 0xf3, 0x4d, 0x4e, 0x0f,
|
||||||
|
0x3c, 0xe4, 0x28, 0xb7, 0xd7, 0xe8, 0xec, 0xc0, 0x4d, 0x9a, 0x0b, 0xb9, 0x0e, 0xb4, 0xd7, 0xe8,
|
||||||
|
0x3c, 0xdf, 0xe4, 0xfc, 0x50, 0xb9, 0x72, 0x7b, 0x8d, 0xde, 0x1d, 0xb8, 0xc9, 0xc5, 0x42, 0xae,
|
||||||
|
0x55, 0x7b, 0xd5, 0x14, 0x42, 0x28, 0x9c, 0xca, 0x6d, 0x16, 0x88, 0x97, 0x88, 0x86, 0xdb, 0xf8,
|
||||||
|
0x65, 0x7c, 0x20, 0x8f, 0xf4, 0x22, 0x3e, 0x9b, 0xcb, 0x80, 0xc5, 0x71, 0xa5, 0x5d, 0xcb, 0xa8,
|
||||||
|
0x76, 0x53, 0xa7, 0xc4, 0x57, 0x66, 0xe7, 0x4a, 0x78, 0x22, 0xaa, 0x18, 0x6b, 0x84, 0x14, 0x80,
|
||||||
|
0x78, 0x37, 0xf1, 0x9f, 0x66, 0xe7, 0x7a, 0x3a, 0x65, 0x8e, 0x8c, 0x17, 0xc4, 0x39, 0xce, 0x1a,
|
||||||
|
0x5b, 0xa8, 0xc6, 0xf7, 0x00, 0xa6, 0x63, 0x36, 0xc3, 0x1a, 0x9f, 0x88, 0x10, 0x0b, 0x90, 0xb8,
|
||||||
|
0xb2, 0x7b, 0xa3, 0xf1, 0x0d, 0x74, 0x90, 0x64, 0x22, 0x92, 0xc0, 0x8d, 0x71, 0x03, 0x04, 0x20,
|
||||||
|
0xa2, 0x9b, 0x25, 0x5d, 0xc1, 0xc4, 0x58, 0x4e, 0xbb, 0x00, 0xf6, 0x8e, 0xc4, 0xee, 0x2f, 0x98,
|
||||||
|
0xb1, 0x16, 0xd9, 0xad, 0xb5, 0x71, 0xdf, 0xec, 0x6c, 0x67, 0x95, 0x26, 0xcc, 0x30, 0x02, 0x8d,
|
||||||
|
0x12, 0x28, 0xd6, 0x07, 0xa3, 0xbd, 0xfc, 0x7a, 0x4b, 0xfc, 0xba, 0x1e, 0x7b, 0xa5, 0xab, 0x5c,
|
||||||
|
0x5b, 0x7b, 0x4e, 0xd8, 0xd5, 0xe4, 0x86, 0xa2, 0x1f, 0x42, 0x1f, 0xc2, 0xc3, 0x98, 0xdc, 0x26,
|
||||||
|
0x2c, 0x3d, 0xce, 0x8f, 0x31, 0xbb, 0x5d, 0x66, 0x76, 0x47, 0x9d, 0x48, 0xfc, 0x18, 0xfd, 0x5d,
|
||||||
|
0x4a, 0x8f, 0x09, 0x3e, 0x84, 0x4a, 0x02, 0xda, 0x33, 0x68, 0x79, 0x23, 0x1a, 0xc4, 0x3e, 0x8f,
|
||||||
|
0xe3, 0x15, 0x0e, 0x69, 0x6e, 0x1e, 0x6d, 0xcc, 0xcd, 0x56, 0x9a, 0x9b, 0x4f, 0xe1, 0xc1, 0xd8,
|
||||||
|
0x9d, 0x99, 0xc1, 0xe9, 0x27, 0x42, 0xc8, 0x7c, 0x8a, 0x48, 0x41, 0xa0, 0x29, 0xf3, 0xde, 0x52,
|
||||||
|
0x05, 0xc4, 0xd5, 0x76, 0x8d, 0xab, 0x42, 0xc4, 0x18, 0x04, 0xb1, 0xa4, 0x81, 0xc3, 0x08, 0xb6,
|
||||||
|
0x5a, 0xaa, 0x10, 0xb9, 0x0e, 0x54, 0x76, 0xe5, 0xd9, 0x84, 0x07, 0x13, 0x7b, 0xce, 0xf8, 0xf9,
|
||||||
|
0x53, 0x7a, 0xc6, 0x3b, 0xfa, 0xc4, 0x88, 0x9c, 0xf3, 0x78, 0x41, 0x0e, 0xa9, 0xdb, 0x11, 0xcf,
|
||||||
|
0x2c, 0x42, 0xa6, 0xfb, 0xd8, 0xa0, 0xd9, 0x41, 0x82, 0x11, 0xa3, 0x9e, 0xe4, 0x3e, 0x33, 0x94,
|
||||||
|
0x3c, 0x69, 0x00, 0x13, 0xd4, 0x5f, 0x94, 0xce, 0xec, 0x61, 0x34, 0xea, 0x67, 0x3a, 0x87, 0xaa,
|
||||||
|
0xd9, 0xa7, 0x1c, 0x9a, 0xbd, 0x2c, 0x44, 0x02, 0xef, 0x6d, 0x0f, 0xf1, 0xdd, 0xbd, 0xb9, 0xac,
|
||||||
|
0x4a, 0xe3, 0x33, 0x93, 0x2f, 0x22, 0x7a, 0x22, 0xfd, 0xbb, 0x3f, 0x89, 0xa2, 0x53, 0xba, 0x83,
|
||||||
|
0xc9, 0x07, 0x20, 0x07, 0x5e, 0x31, 0xf3, 0x30, 0x52, 0x34, 0x71, 0x7f, 0xa0, 0x8a, 0x47, 0xa5,
|
||||||
|
0x65, 0xb0, 0x3d, 0xb6, 0x0e, 0xea, 0x12, 0x01, 0x58, 0xea, 0xe8, 0x24, 0x86, 0x6e, 0x2d, 0x4c,
|
||||||
|
0xec, 0x50, 0x20, 0xe2, 0xeb, 0xd5, 0xd3, 0x3a, 0x29, 0xc5, 0xdd, 0xab, 0xcf, 0xe5, 0x76, 0x4d,
|
||||||
|
0x2f, 0xc9, 0x97, 0xa6, 0x2b, 0xb1, 0x51, 0x31, 0x3b, 0xdd, 0x48, 0x9e, 0x80, 0x28, 0x6b, 0x8b,
|
||||||
|
0x32, 0x7e, 0xe0, 0x15, 0x5a, 0x12, 0xe8, 0x27, 0xcd, 0xec, 0x09, 0xf0, 0x28, 0x89, 0xa5, 0xf0,
|
||||||
|
0x09, 0x96, 0xed, 0x0b, 0xd2, 0x9a, 0x9e, 0xd7, 0x47, 0xc4, 0x4a, 0x1a, 0xd1, 0x14, 0x3a, 0xb7,
|
||||||
|
0x8e, 0xb1, 0xa1, 0x02, 0xbd, 0x1e, 0x1e, 0x52, 0x2a, 0x2e, 0x9f, 0x6a, 0x87, 0x7b, 0xaa, 0xa2,
|
||||||
|
0xf8, 0x2e, 0x01, 0x23, 0x62, 0xe1, 0xbb, 0xc7, 0x12, 0xd7, 0x59, 0xe8, 0x8c, 0x25, 0xc5, 0xae,
|
||||||
|
0x23, 0x00, 0x37, 0x80, 0x3e, 0xb0, 0x28, 0xdf, 0xd7, 0x9d, 0xe1, 0x72, 0x7e, 0xfa, 0xfe, 0xfd,
|
||||||
|
0xfb, 0x82, 0x18, 0xc6, 0x7a, 0x88, 0xa8, 0x88, 0x20, 0x57, 0x28, 0x01, 0x11, 0xc0, 0xbb, 0x4d,
|
||||||
|
0xc9, 0x3c, 0x62, 0x53, 0x3b, 0xbf, 0x69, 0x9a, 0x71, 0x39, 0x4f, 0x26, 0x55, 0x47, 0xf8, 0xb5,
|
||||||
|
0x4f, 0xcc, 0xfd, 0xf8, 0xaa, 0x7f, 0xb1, 0x60, 0x85, 0xfa, 0x13, 0xef, 0xc7, 0xfe, 0x9e, 0x78,
|
||||||
|
0x34, 0x78, 0x32, 0x3b, 0x6a, 0xbc, 0x5d, 0xa3, 0x9d, 0x23, 0x05, 0x61, 0x4f, 0x3c, 0x44, 0x86,
|
||||||
|
0x27, 0x62, 0x7a, 0x12, 0xc3, 0x5e, 0x0c, 0x63, 0x42, 0xc3, 0xc0, 0x22, 0xee, 0x8d, 0x2d, 0xe7,
|
||||||
|
0x1f, 0xeb, 0xf3, 0xa3, 0xe7, 0xc5, 0x4a, 0x05, 0xd4, 0x75, 0x11, 0x45, 0x0b, 0x1a, 0xe8, 0x77,
|
||||||
|
0x8b, 0x1a, 0x30, 0x56, 0x4c, 0xd4, 0xac, 0x5b, 0x05, 0x05, 0x20, 0x47, 0x1f, 0x5a, 0xcb, 0x35,
|
||||||
|
0xf7, 0xbd, 0x33, 0x8b, 0xde, 0x87, 0xf7, 0x8d, 0x7d, 0x1e, 0x63, 0xf8, 0xba, 0xdb, 0x3c, 0x14,
|
||||||
|
0xea, 0x9b, 0x31, 0xf4, 0x8f, 0x80, 0x1a, 0xa3, 0x9b, 0xde, 0xb6, 0x45, 0x50, 0xd1, 0x18, 0xe9,
|
||||||
|
0xaa, 0xfe, 0x8e, 0x65, 0xa7, 0x59, 0x1a, 0xdc, 0xb6, 0x00, 0x62, 0x41, 0x39, 0x10, 0xee, 0x65,
|
||||||
|
0x6c, 0x5b, 0x04, 0x65, 0x4a, 0x9f, 0xfb, 0x3e, 0xb4, 0xcb, 0xc7, 0x24, 0x5f, 0xbd, 0x35, 0xc0,
|
||||||
|
0x40, 0xb2, 0x7c, 0xd1, 0x1f, 0x5b, 0xc2, 0x84, 0x12, 0x63, 0xd5, 0x21, 0xb6, 0x5c, 0x3d, 0x32,
|
||||||
|
0x8c, 0xe8, 0x13, 0xd7, 0x7f, 0xad, 0x81, 0x51, 0x0a, 0xae, 0xa1, 0xa3, 0x9d, 0x07, 0x53, 0x81,
|
||||||
|
0xfe, 0x61, 0x28, 0x10, 0x01, 0x34, 0x03, 0xf7, 0x28, 0xfa, 0xf4, 0xc3, 0x9e, 0x98, 0xb3, 0xac,
|
||||||
|
0x65, 0x93, 0x12, 0x5f, 0x65, 0x72, 0xe3, 0xa3, 0x88, 0x1c, 0x04, 0xbc, 0x57, 0x32, 0xc9, 0x6b,
|
||||||
|
0x98, 0x3d, 0x31, 0xf6, 0x31, 0x4d, 0xb5, 0x99, 0x8d, 0x73, 0x88, 0x25, 0x33, 0xea, 0xfb, 0x94,
|
||||||
|
0x38, 0x22, 0xc2, 0x42, 0x00, 0xf4, 0xb1, 0x0f, 0x73, 0x6f, 0x52, 0x46, 0x19, 0x7a, 0x13, 0xec,
|
||||||
|
0x71, 0xc5, 0x74, 0x0a, 0x9d, 0x6f, 0xe1, 0x74, 0x7f, 0xdc, 0x6f, 0x3c, 0xdd, 0x49, 0xa3, 0xd9,
|
||||||
|
0x4c, 0x0f, 0xa8, 0x9e, 0x8c, 0x85, 0xcb, 0x42, 0x1a, 0xd0, 0x65, 0xc0, 0xef, 0x82, 0xc3, 0x09,
|
||||||
|
0xbb, 0x90, 0x37, 0x31, 0xbd, 0xa4, 0x09, 0xcb, 0x4f, 0x3c, 0x2a, 0x59, 0x5a, 0x28, 0xe8, 0x5b,
|
||||||
|
0xf0, 0x7d, 0xa1, 0xd5, 0x4d, 0x33, 0x96, 0xa6, 0xe1, 0xc1, 0x73, 0x7a, 0x7b, 0xa3, 0xa6, 0x0b,
|
||||||
|
0x27, 0xc5, 0xae, 0x31, 0x2f, 0x4d, 0xba, 0x03, 0x25, 0xa2, 0xc7, 0x82, 0x99, 0x9c, 0x83, 0xb7,
|
||||||
|
0x36, 0x32, 0x3e, 0xb1, 0x20, 0x2c, 0x15, 0x44, 0x8b, 0x10, 0x63, 0xd6, 0x75, 0xa8, 0xe7, 0x41,
|
||||||
|
0x42, 0x64, 0x64, 0xca, 0xa3, 0x58, 0x16, 0x9a, 0xf0, 0xee, 0x1a, 0xb2, 0xa6, 0xb8, 0x19, 0x17,
|
||||||
|
0x30, 0x6c, 0x19, 0xbf, 0x54, 0x1d, 0x05, 0xe0, 0x81, 0x3a, 0xe9, 0x79, 0x6f, 0xc1, 0x93, 0xce,
|
||||||
|
0x92, 0xed, 0x89, 0x7e, 0xab, 0x90, 0xbb, 0x2f, 0x0f, 0x0f, 0x04, 0xcb, 0x4d, 0x2c, 0x78, 0xf0,
|
||||||
|
0x6a, 0x96, 0xa0, 0x0c, 0x8e, 0x08, 0x02, 0x8c, 0x73, 0x90, 0x09, 0x8e, 0xc3, 0xa2, 0x80, 0x7a,
|
||||||
|
0x64, 0x2e, 0x62, 0x19, 0x2b, 0x94, 0x32, 0x1e, 0x30, 0x67, 0xfb, 0xf4, 0x8d, 0x70, 0x1f, 0xc0,
|
||||||
|
0x49, 0x2a, 0x91, 0x61, 0x9f, 0x10, 0xaa, 0x13, 0x00, 0xdd, 0x40, 0x55, 0x6e, 0x53, 0x35, 0x7a,
|
||||||
|
0x3d, 0x1e, 0x5e, 0x34, 0xce, 0xcf, 0x01, 0x2f, 0x27, 0x9d, 0xcc, 0xe9, 0xc8, 0x84, 0xc5, 0x08,
|
||||||
|
0xa5, 0x31, 0x04, 0x11, 0x94, 0x9f, 0x98, 0x64, 0x49, 0x02, 0xa9, 0x17, 0xba, 0xf5, 0x94, 0x0c,
|
||||||
|
0x5e, 0x62, 0x16, 0x69, 0xb5, 0x50, 0xc0, 0x31, 0x82, 0x1e, 0x52, 0x55, 0xf4, 0x25, 0x70, 0x17,
|
||||||
|
0x94, 0x47, 0xc2, 0x46, 0xde, 0x5b, 0x25, 0x97, 0x94, 0x02, 0x05, 0x3c, 0xbb, 0xb8, 0x23, 0x8a,
|
||||||
|
0x0d, 0x5c, 0x7c, 0x75, 0x2e, 0xe4, 0x8c, 0x92, 0x60, 0x41, 0x80, 0xe7, 0x2b, 0x67, 0xd9, 0xfa,
|
||||||
|
0x56, 0x60, 0x4a, 0x31, 0x36, 0x18, 0x4f, 0xeb, 0xbb, 0x77, 0xbb, 0x66, 0xbb, 0x4d, 0x57, 0x2e,
|
||||||
|
0xbd, 0xc3, 0xae, 0x5c, 0x52, 0xf0, 0xb8, 0xb0, 0x96, 0xef, 0x49, 0x34, 0xba, 0x2a, 0xfb, 0x93,
|
||||||
|
0x6e, 0x22, 0xe7, 0x20, 0xf8, 0x13, 0x0b, 0x16, 0x42, 0xa5, 0x3b, 0xfc, 0xb6, 0x2a, 0xc8, 0xa9,
|
||||||
|
0x99, 0x55, 0x1b, 0x57, 0x1e, 0xa3, 0x91, 0x3a, 0x9d, 0x22, 0x04, 0xb7, 0x61, 0x9e, 0x2a, 0xdf,
|
||||||
|
0x5c, 0x1d, 0x9e, 0x55, 0xa2, 0xaa, 0x8f, 0x43, 0xc1, 0x68, 0x82, 0x2e, 0xb1, 0x01, 0x88, 0xc6,
|
||||||
|
0x78, 0x1b, 0x95, 0x03, 0x91, 0x2a, 0x04, 0xd1, 0x6d, 0x96, 0xeb, 0x3f, 0x7c, 0xdf, 0x57, 0x29,
|
||||||
|
0x7d, 0xd1, 0x72, 0xf7, 0x22, 0x90, 0x35, 0x2a, 0x86, 0xdc, 0xb2, 0xe6, 0xef, 0xc6, 0x07, 0x69,
|
||||||
|
0xfe, 0xee, 0xcb, 0xf0, 0x7e, 0xf4, 0xb0, 0x3b, 0x99, 0xad, 0x5d, 0x4d, 0xa5, 0xc5, 0x1a, 0xfa,
|
||||||
|
0xb0, 0x96, 0x9a, 0x38, 0x10, 0x27, 0x50, 0xec, 0x71, 0xea, 0x81, 0xb3, 0x45, 0xe8, 0x79, 0x58,
|
||||||
|
0xf9, 0x41, 0xed, 0x00, 0xee, 0x03, 0x55, 0x04, 0xb8, 0x55, 0x82, 0x45, 0x71, 0xea, 0x68, 0x78,
|
||||||
|
0x67, 0xab, 0x1c, 0xf1, 0x33, 0xc3, 0x25, 0x99, 0x77, 0x29, 0x4e, 0x21, 0x6c, 0x02, 0xc5, 0x9f,
|
||||||
|
0x4b, 0xa6, 0x02, 0x89, 0x05, 0x4c, 0x44, 0x99, 0x23, 0x1f, 0x65, 0x11, 0x00, 0x45, 0x66, 0xb4,
|
||||||
|
0x02, 0x1b, 0x9b, 0x14, 0xf0, 0xe5, 0xeb, 0xf8, 0x7a, 0xb4, 0xa2, 0x84, 0x33, 0x4b, 0x8b, 0x3e,
|
||||||
|
0x4c, 0xf7, 0x28, 0x28, 0x3b, 0xdb, 0x3a, 0x47, 0x1e, 0x50, 0x4e, 0x77, 0xbc, 0xaa, 0xc7, 0xf3,
|
||||||
|
0x33, 0xcd, 0xe2, 0xca, 0xe3, 0x78, 0xc4, 0x41, 0x7f, 0x23, 0x72, 0x65, 0xe4, 0x57, 0x83, 0x3e,
|
||||||
|
0x2a, 0x73, 0x5d, 0x82, 0xd4, 0x5f, 0x1f, 0x44, 0xc8, 0x9d, 0x5d, 0x1c, 0xfa, 0x6b, 0x46, 0x54,
|
||||||
|
0x29, 0xec, 0x06, 0x6f, 0xcf, 0xf6, 0x53, 0xdf, 0x6c, 0x04, 0x4e, 0x63, 0x98, 0x4c, 0xa0, 0xc3,
|
||||||
|
0x98, 0x17, 0x1b, 0xc5, 0x3d, 0xae, 0xd7, 0xbb, 0xcb, 0x43, 0xc6, 0xd8, 0xdb, 0xec, 0xfc, 0x58,
|
||||||
|
0xcc, 0xf8, 0xff, 0x48, 0xb9, 0x21, 0x64, 0x94, 0x3f, 0xac, 0x44, 0xcc, 0x52, 0x63, 0xa9, 0x21,
|
||||||
|
0x18, 0x64, 0xf9, 0x4b, 0x24, 0x80, 0xf9, 0x18, 0xb7, 0x00, 0x54, 0xe8, 0x46, 0x90, 0x88, 0x5d,
|
||||||
|
0xe8, 0x38, 0x07, 0x43, 0x05, 0x5d, 0x38, 0xe2, 0x61, 0x66, 0x26, 0xda, 0xb9, 0x81, 0xa1, 0x1a,
|
||||||
|
0xfb, 0xb9, 0x0b, 0xfd, 0xb8, 0xfc, 0x19, 0x11, 0x4f, 0x65, 0xa1, 0x14, 0x6b, 0xe7, 0x80, 0xe0,
|
||||||
|
0x70, 0x94, 0xaa, 0x91, 0xb5, 0x1c, 0x43, 0x01, 0x50, 0x8e, 0xb8, 0xae, 0x99, 0xac, 0x04, 0xcf,
|
||||||
|
0xed, 0xa7, 0x9d, 0x35, 0x03, 0x14, 0xc1, 0x1d, 0x82, 0x1e, 0xfe, 0x56, 0x00, 0xa3, 0xdb, 0xc1,
|
||||||
|
0x66, 0x3a, 0xcb, 0x5a, 0xa9, 0x36, 0xb0, 0xc8, 0xd8, 0x97, 0x55, 0x6f, 0x87, 0xda, 0x2a, 0x10,
|
||||||
|
0x89, 0x41, 0x05, 0x0c, 0xa2, 0x1b, 0xb7, 0x9d, 0x86, 0xbc, 0xbd, 0xc7, 0xdb, 0x88, 0xfb, 0xa0,
|
||||||
|
0x76, 0x3f, 0x9d, 0xee, 0xb9, 0xb8, 0xb8, 0x85, 0x52, 0x85, 0x2c, 0x5d, 0xce, 0x90, 0xa5, 0x3b,
|
||||||
|
0x95, 0x6d, 0x02, 0x5d, 0x01, 0x89, 0xba, 0x92, 0x51, 0xf9, 0x01, 0x14, 0xd7, 0xcb, 0xec, 0xd1,
|
||||||
|
0x5a, 0xba, 0xc4, 0x4e, 0x17, 0x5b, 0x6b, 0xb8, 0xbf, 0x25, 0x1f, 0x63, 0x79, 0xd2, 0x21, 0xd5,
|
||||||
|
0x82, 0xfe, 0xeb, 0x6b, 0xc0, 0xf5, 0x43, 0xe4, 0x8d, 0xfd, 0xc5, 0x80, 0xb1, 0x83, 0xfc, 0xf4,
|
||||||
|
0xc0, 0x5a, 0x42, 0x51, 0x67, 0x90, 0x39, 0x54, 0x77, 0x32, 0xe8, 0x6a, 0x61, 0x12, 0xcf, 0x3d,
|
||||||
|
0x1e, 0x3c, 0x65, 0x41, 0x28, 0x82, 0x25, 0xf7, 0x05, 0x55, 0x4f, 0xf1, 0xd3, 0x93, 0x9c, 0x43,
|
||||||
|
0xee, 0x8e, 0xe9, 0x73, 0xda, 0xe3, 0xe3, 0x67, 0xd2, 0x1c, 0x05, 0x8d, 0xd2, 0xcb, 0x5c, 0x25,
|
||||||
|
0x2c, 0xac, 0x73, 0x32, 0x68, 0x0d, 0x66, 0xe5, 0x4c, 0xf1, 0x50, 0xaf, 0xc9, 0x04, 0x3d, 0x08,
|
||||||
|
0x2f, 0xe5, 0x73, 0xe1, 0x78, 0x88, 0x85, 0xba, 0xee, 0x2e, 0x74, 0x30, 0x00, 0xdf, 0x49, 0xc2,
|
||||||
|
0x3d, 0x17, 0x3f, 0x3e, 0xc1, 0x4a, 0x15, 0x6a, 0x63, 0x16, 0x01, 0x98, 0xab, 0x20, 0xeb, 0xd1,
|
||||||
|
0xc4, 0x25, 0x11, 0x54, 0x59, 0xc5, 0xd6, 0xa5, 0xd7, 0x5f, 0x6b, 0x5d, 0xea, 0xf5, 0x26, 0xa0,
|
||||||
|
0x0c, 0xfe, 0x5a, 0xd6, 0xd6, 0x4e, 0xa1, 0x71, 0x6a, 0x01, 0x8a, 0xe2, 0xaf, 0x65, 0x6d, 0x6d,
|
||||||
|
0x39, 0xce, 0x2d, 0xe8, 0xd5, 0xf1, 0x77, 0x07, 0x23, 0x1d, 0x25, 0xf8, 0xbb, 0x9d, 0x51, 0xf3,
|
||||||
|
0xdd, 0x39, 0xae, 0x81, 0xdf, 0x1d, 0x8c, 0xde, 0x37, 0xea, 0xd0, 0x91, 0xe0, 0xef, 0x76, 0x46,
|
||||||
|
0x75, 0x4b, 0xed, 0xa6, 0xfe, 0xec, 0x60, 0x55, 0xd7, 0x42, 0xd5, 0x8b, 0x52, 0xad, 0x74, 0x36,
|
||||||
|
0x00, 0x5b, 0xbf, 0x31, 0x16, 0x62, 0x5d, 0xa6, 0x75, 0x85, 0x08, 0x8a, 0x69, 0x70, 0xe0, 0x87,
|
||||||
|
0x91, 0x78, 0xae, 0x92, 0xb1, 0x80, 0x6a, 0x7e, 0x22, 0x68, 0xe4, 0xea, 0x1a, 0x11, 0xf2, 0x20,
|
||||||
|
0x89, 0x93, 0x50, 0x7d, 0x0a, 0x9c, 0x43, 0x38, 0x2a, 0x7b, 0x64, 0x77, 0x4a, 0xd8, 0x5d, 0xef,
|
||||||
|
0xfe, 0x10, 0xf7, 0x23, 0xdf, 0xd4, 0x8c, 0xa5, 0xef, 0x75, 0xf8, 0xdd, 0x10, 0xfe, 0xe0, 0xb7,
|
||||||
|
0x45, 0xfc, 0xd0, 0x88, 0xff, 0x93, 0xe6, 0x7f, 0x4b, 0x86, 0xa3, 0xf7, 0x59, 0x23, 0x00, 0x00
|
||||||
|
>>>>>>> main
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1889
wled00/html_ui.h
1889
wled00/html_ui.h
File diff suppressed because it is too large
Load Diff
@@ -75,6 +75,22 @@ static void doSaveState() {
|
|||||||
playlistSave = false;
|
playlistSave = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool getPresetName(byte index, String& name)
|
||||||
|
{
|
||||||
|
if (!requestJSONBufferLock(9)) return false;
|
||||||
|
bool presetExists = false;
|
||||||
|
if (readObjectFromFileUsingId("/presets.json", index, &doc))
|
||||||
|
{
|
||||||
|
JsonObject fdo = doc.as<JsonObject>();
|
||||||
|
if (fdo["n"]) {
|
||||||
|
name = (const char*)(fdo["n"]);
|
||||||
|
presetExists = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
releaseJSONBufferLock();
|
||||||
|
return presetExists;
|
||||||
|
}
|
||||||
|
|
||||||
bool applyPreset(byte index, byte callMode)
|
bool applyPreset(byte index, byte callMode)
|
||||||
{
|
{
|
||||||
DEBUG_PRINT(F("Request to apply preset: "));
|
DEBUG_PRINT(F("Request to apply preset: "));
|
||||||
|
|||||||
@@ -277,6 +277,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
|
|
||||||
alexaEnabled = request->hasArg(F("AL"));
|
alexaEnabled = request->hasArg(F("AL"));
|
||||||
strlcpy(alexaInvocationName, request->arg(F("AI")).c_str(), 33);
|
strlcpy(alexaInvocationName, request->arg(F("AI")).c_str(), 33);
|
||||||
|
t = request->arg(F("AP")).toInt();
|
||||||
|
if (t >= 0 && t <= 9) alexaNumPresets = t;
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_BLYNK
|
#ifndef WLED_DISABLE_BLYNK
|
||||||
strlcpy(blynkHost, request->arg("BH").c_str(), 33);
|
strlcpy(blynkHost, request->arg("BH").c_str(), 33);
|
||||||
@@ -503,7 +505,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
} else {
|
} else {
|
||||||
// there is no Wire.end()
|
// there is no Wire.end()
|
||||||
DEBUG_PRINTLN(F("Could not allocate I2C pins."));
|
DEBUG_PRINTLN(F("Could not allocate I2C pins."));
|
||||||
uint8_t i2c[2] = { i2c_scl, i2c_sda };
|
uint8_t i2c[2] = { static_cast<uint8_t>(i2c_scl), static_cast<uint8_t>(i2c_sda) };
|
||||||
pinManager.deallocateMultiplePins(i2c, 2, PinOwner::HW_I2C); // just in case deallocation of old pins
|
pinManager.deallocateMultiplePins(i2c, 2, PinOwner::HW_I2C); // just in case deallocation of old pins
|
||||||
i2c_sda = -1;
|
i2c_sda = -1;
|
||||||
i2c_scl = -1;
|
i2c_scl = -1;
|
||||||
@@ -532,7 +534,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
} else {
|
} else {
|
||||||
//SPI.end();
|
//SPI.end();
|
||||||
DEBUG_PRINTLN(F("Could not allocate SPI pins."));
|
DEBUG_PRINTLN(F("Could not allocate SPI pins."));
|
||||||
uint8_t spi[3] = { spi_mosi, spi_miso, spi_sclk };
|
uint8_t spi[3] = { static_cast<uint8_t>(spi_mosi), static_cast<uint8_t>(spi_miso), static_cast<uint8_t>(spi_sclk) };
|
||||||
pinManager.deallocateMultiplePins(spi, 3, PinOwner::HW_SPI); // just in case deallocation of old pins
|
pinManager.deallocateMultiplePins(spi, 3, PinOwner::HW_SPI); // just in case deallocation of old pins
|
||||||
spi_mosi = -1;
|
spi_mosi = -1;
|
||||||
spi_miso = -1;
|
spi_miso = -1;
|
||||||
|
|||||||
@@ -359,6 +359,11 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get device count, function only in WLED version of Espalexa
|
||||||
|
uint8_t getDeviceCount() {
|
||||||
|
return currentDeviceCount;
|
||||||
|
}
|
||||||
|
|
||||||
//service loop
|
//service loop
|
||||||
void loop() {
|
void loop() {
|
||||||
#ifndef ESPALEXA_ASYNC
|
#ifndef ESPALEXA_ASYNC
|
||||||
@@ -393,6 +398,13 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function only in WLED version of Espalexa, does not actually release memory for names
|
||||||
|
void removeAllDevices()
|
||||||
|
{
|
||||||
|
currentDeviceCount=0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// returns device index or 0 on failure
|
// returns device index or 0 on failure
|
||||||
uint8_t addDevice(EspalexaDevice* d)
|
uint8_t addDevice(EspalexaDevice* d)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -113,7 +113,7 @@
|
|||||||
#ifndef WLED_DISABLE_ALEXA
|
#ifndef WLED_DISABLE_ALEXA
|
||||||
#define ESPALEXA_ASYNC
|
#define ESPALEXA_ASYNC
|
||||||
#define ESPALEXA_NO_SUBPAGE
|
#define ESPALEXA_NO_SUBPAGE
|
||||||
#define ESPALEXA_MAXDEVICES 1
|
#define ESPALEXA_MAXDEVICES 10
|
||||||
// #define ESPALEXA_DEBUG
|
// #define ESPALEXA_DEBUG
|
||||||
#include "src/dependencies/espalexa/Espalexa.h"
|
#include "src/dependencies/espalexa/Espalexa.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -358,6 +358,7 @@ WLED_GLOBAL uint8_t udpNumRetries _INIT(0); // Number of t
|
|||||||
|
|
||||||
WLED_GLOBAL bool alexaEnabled _INIT(false); // enable device discovery by Amazon Echo
|
WLED_GLOBAL bool alexaEnabled _INIT(false); // enable device discovery by Amazon Echo
|
||||||
WLED_GLOBAL char alexaInvocationName[33] _INIT("Light"); // speech control name of device. Choose something voice-to-text can understand
|
WLED_GLOBAL char alexaInvocationName[33] _INIT("Light"); // speech control name of device. Choose something voice-to-text can understand
|
||||||
|
WLED_GLOBAL byte alexaNumPresets _INIT(0); // number of presets to expose to Alexa, starting from preset 1, up to 9
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_BLYNK
|
#ifndef WLED_DISABLE_BLYNK
|
||||||
WLED_GLOBAL char blynkApiKey[36] _INIT(""); // Auth token for Blynk server. If empty, no connection will be made
|
WLED_GLOBAL char blynkApiKey[36] _INIT(""); // Auth token for Blynk server. If empty, no connection will be made
|
||||||
|
|||||||
@@ -467,11 +467,5 @@ void deEEPSettings() {
|
|||||||
EEPROM.begin(EEPSIZE);
|
EEPROM.begin(EEPSIZE);
|
||||||
loadSettingsFromEEPROM();
|
loadSettingsFromEEPROM();
|
||||||
EEPROM.end();
|
EEPROM.end();
|
||||||
|
|
||||||
//call readFromConfig() with an empty object so that usermods can initialize to defaults prior to saving
|
|
||||||
JsonObject empty = JsonObject();
|
|
||||||
usermods.readFromConfig(empty);
|
|
||||||
|
|
||||||
serializeConfig();
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t
|
|||||||
if (!index) {
|
if (!index) {
|
||||||
String finalname = filename;
|
String finalname = filename;
|
||||||
if (finalname.charAt(0) != '/') {
|
if (finalname.charAt(0) != '/') {
|
||||||
finalname = "/" + finalname; // prepend slash if missing
|
finalname = '/' + finalname; // prepend slash if missing
|
||||||
}
|
}
|
||||||
|
|
||||||
request->_tempFile = WLED_FS.open(finalname, "w");
|
request->_tempFile = WLED_FS.open(finalname, "w");
|
||||||
DEBUG_PRINT("Uploading ");
|
DEBUG_PRINT(F("Uploading "));
|
||||||
DEBUG_PRINTLN(finalname);
|
DEBUG_PRINTLN(finalname);
|
||||||
if (finalname.equals("/presets.json")) presetsModifiedTime = toki.second(); // WLEDSR
|
if (finalname.equals("/presets.json")) presetsModifiedTime = toki.second(); // WLEDSR
|
||||||
}
|
}
|
||||||
@@ -622,4 +622,4 @@ void serveSettings(AsyncWebServerRequest* request, bool post)
|
|||||||
response->addHeader(FPSTR(s_content_enc),"gzip");
|
response->addHeader(FPSTR(s_content_enc),"gzip");
|
||||||
setStaticContentCacheHeaders(response);
|
setStaticContentCacheHeaders(response);
|
||||||
request->send(response);
|
request->send(response);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -509,6 +509,7 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
sappend('c',SET_F("AL"),alexaEnabled);
|
sappend('c',SET_F("AL"),alexaEnabled);
|
||||||
sappends('s',SET_F("AI"),alexaInvocationName);
|
sappends('s',SET_F("AI"),alexaInvocationName);
|
||||||
sappend('c',SET_F("SA"),notifyAlexa);
|
sappend('c',SET_F("SA"),notifyAlexa);
|
||||||
|
sappend('v',SET_F("AP"),alexaNumPresets);
|
||||||
sappends('s',SET_F("BK"),(char*)((blynkEnabled)?SET_F("Hidden"):""));
|
sappends('s',SET_F("BK"),(char*)((blynkEnabled)?SET_F("Hidden"):""));
|
||||||
#ifndef WLED_DISABLE_BLYNK
|
#ifndef WLED_DISABLE_BLYNK
|
||||||
sappends('s',SET_F("BH"),blynkHost);
|
sappends('s',SET_F("BH"),blynkHost);
|
||||||
|
|||||||
Reference in New Issue
Block a user