Added MQTT button option

This commit is contained in:
cschwinne 2021-07-01 20:51:52 +02:00
parent e16a67242e
commit 0197d89976
9 changed files with 45 additions and 33 deletions

View File

@ -2,6 +2,10 @@
### Builds after release 0.12.0 ### Builds after release 0.12.0
#### Build 2107011
- Added MQTT button feedback option (PR #2011)
#### Build 2107010 #### Build 2107010
- Added JSON IR codes (PR #1941) - Added JSON IR codes (PR #1941)

View File

@ -19,7 +19,7 @@ void shortPressAction(uint8_t b)
} }
// publish MQTT message // publish MQTT message
if (WLED_MQTT_CONNECTED) { if (buttonPublishMqtt && WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b);
mqtt->publish(subuf, 0, false, "short"); mqtt->publish(subuf, 0, false, "short");
@ -74,7 +74,7 @@ void handleSwitch(uint8_t b)
} }
// publish MQTT message // publish MQTT message
if (WLED_MQTT_CONNECTED) { if (buttonPublishMqtt && WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
if (buttonType[b] == BTN_TYPE_PIR_SENSOR) sprintf_P(subuf, PSTR("%s/motion/%d"), mqttDeviceTopic, (int)b); if (buttonType[b] == BTN_TYPE_PIR_SENSOR) sprintf_P(subuf, PSTR("%s/motion/%d"), mqttDeviceTopic, (int)b);
else sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); else sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b);
@ -199,7 +199,7 @@ void handleButton()
else _setRandomColor(false,true); else _setRandomColor(false,true);
// publish MQTT message // publish MQTT message
if (WLED_MQTT_CONNECTED) { if (buttonPublishMqtt && WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b);
mqtt->publish(subuf, 0, false, "long"); mqtt->publish(subuf, 0, false, "long");
@ -227,7 +227,7 @@ void handleButton()
applyPreset(macroDoublePress[b]); applyPreset(macroDoublePress[b]);
// publish MQTT message // publish MQTT message
if (WLED_MQTT_CONNECTED) { if (buttonPublishMqtt && WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b);
mqtt->publish(subuf, 0, false, "double"); mqtt->publish(subuf, 0, false, "double");

View File

@ -124,7 +124,8 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
if (hw_led["rev"]) busses.getBus(0)->reversed = true; //set 0.11 global reversed setting for first bus if (hw_led["rev"]) busses.getBus(0)->reversed = true; //set 0.11 global reversed setting for first bus
// read multiple button configuration // read multiple button configuration
JsonArray hw_btn_ins = hw[F("btn")][F("ins")]; JsonObject btn_obj = hw["btn"];
JsonArray hw_btn_ins = btn_obj[F("ins")];
if (!hw_btn_ins.isNull()) { if (!hw_btn_ins.isNull()) {
uint8_t s = 0; uint8_t s = 0;
for (JsonObject btn : hw_btn_ins) { for (JsonObject btn : hw_btn_ins) {
@ -136,7 +137,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
} else { } else {
btnPin[s] = -1; btnPin[s] = -1;
} }
JsonArray hw_btn_ins_0_macros = btn[F("macros")]; JsonArray hw_btn_ins_0_macros = btn["macros"];
CJSON(macroButton[s], hw_btn_ins_0_macros[0]); CJSON(macroButton[s], hw_btn_ins_0_macros[0]);
CJSON(macroLongPress[s],hw_btn_ins_0_macros[1]); CJSON(macroLongPress[s],hw_btn_ins_0_macros[1]);
CJSON(macroDoublePress[s], hw_btn_ins_0_macros[2]); CJSON(macroDoublePress[s], hw_btn_ins_0_macros[2]);
@ -161,7 +162,8 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
macroDoublePress[s] = 0; macroDoublePress[s] = 0;
} }
} }
CJSON(touchThreshold,hw[F("btn")][F("tt")]); CJSON(touchThreshold,btn_obj[F("tt")]);
CJSON(buttonPublishMqtt,btn_obj["mqtt"]);
int hw_ir_pin = hw["ir"]["pin"] | -2; // 4 int hw_ir_pin = hw["ir"]["pin"] | -2; // 4
if (hw_ir_pin > -2) { if (hw_ir_pin > -2) {
@ -193,8 +195,8 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
CJSON(briMultiplier, light[F("scale-bri")]); CJSON(briMultiplier, light[F("scale-bri")]);
CJSON(strip.paletteBlend, light[F("pal-mode")]); CJSON(strip.paletteBlend, light[F("pal-mode")]);
float light_gc_bri = light[F("gc")]["bri"]; float light_gc_bri = light["gc"]["bri"];
float light_gc_col = light[F("gc")]["col"]; // 2.8 float light_gc_col = light["gc"]["col"]; // 2.8
if (light_gc_bri > 1.5) strip.gammaCorrectBri = true; if (light_gc_bri > 1.5) strip.gammaCorrectBri = true;
else if (light_gc_bri > 0.5) strip.gammaCorrectBri = false; else if (light_gc_bri > 0.5) strip.gammaCorrectBri = false;
if (light_gc_col > 1.5) strip.gammaCorrectCol = true; if (light_gc_col > 1.5) strip.gammaCorrectCol = true;
@ -213,7 +215,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
if (nightlightDelayMinsDefault != prev) nightlightDelayMins = nightlightDelayMinsDefault; if (nightlightDelayMinsDefault != prev) nightlightDelayMins = nightlightDelayMinsDefault;
CJSON(nightlightTargetBri, light_nl[F("tbri")]); CJSON(nightlightTargetBri, light_nl[F("tbri")]);
CJSON(macroNl, light_nl[F("macro")]); CJSON(macroNl, light_nl["macro"]);
JsonObject def = doc[F("def")]; JsonObject def = doc[F("def")];
CJSON(bootPreset, def[F("ps")]); CJSON(bootPreset, def[F("ps")]);
@ -237,10 +239,10 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
prev = notifyDirectDefault; prev = notifyDirectDefault;
CJSON(notifyDirectDefault, if_sync_send[F("dir")]); CJSON(notifyDirectDefault, if_sync_send[F("dir")]);
if (notifyDirectDefault != prev) notifyDirect = notifyDirectDefault; if (notifyDirectDefault != prev) notifyDirect = notifyDirectDefault;
CJSON(notifyButton, if_sync_send[F("btn")]); CJSON(notifyButton, if_sync_send["btn"]);
CJSON(notifyAlexa, if_sync_send[F("va")]); CJSON(notifyAlexa, if_sync_send["va"]);
CJSON(notifyHue, if_sync_send[F("hue")]); CJSON(notifyHue, if_sync_send["hue"]);
CJSON(notifyMacro, if_sync_send[F("macro")]); CJSON(notifyMacro, if_sync_send["macro"]);
CJSON(notifyTwice, if_sync_send[F("twice")]); CJSON(notifyTwice, if_sync_send[F("twice")]);
JsonObject if_nodes = interfaces["nodes"]; JsonObject if_nodes = interfaces["nodes"];
@ -264,10 +266,10 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
CJSON(arlsDisableGammaCorrection, if_live[F("no-gc")]); // false CJSON(arlsDisableGammaCorrection, if_live[F("no-gc")]); // false
CJSON(arlsOffset, if_live[F("offset")]); // 0 CJSON(arlsOffset, if_live[F("offset")]); // 0
CJSON(alexaEnabled, interfaces[F("va")][F("alexa")]); // false CJSON(alexaEnabled, interfaces["va"][F("alexa")]); // false
CJSON(macroAlexaOn, interfaces[F("va")][F("macros")][0]); CJSON(macroAlexaOn, interfaces["va"]["macros"][0]);
CJSON(macroAlexaOff, interfaces[F("va")][F("macros")][1]); CJSON(macroAlexaOff, interfaces["va"]["macros"][1]);
#ifndef WLED_DISABLE_BLYNK #ifndef WLED_DISABLE_BLYNK
const char* apikey = interfaces["blynk"][F("token")] | "Hidden"; const char* apikey = interfaces["blynk"][F("token")] | "Hidden";
@ -294,7 +296,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
#endif #endif
#ifndef WLED_DISABLE_HUESYNC #ifndef WLED_DISABLE_HUESYNC
JsonObject if_hue = interfaces[F("hue")]; JsonObject if_hue = interfaces["hue"];
CJSON(huePollingEnabled, if_hue["en"]); CJSON(huePollingEnabled, if_hue["en"]);
CJSON(huePollLightId, if_hue["id"]); CJSON(huePollLightId, if_hue["id"]);
tdd = if_hue[F("iv")] | -1; tdd = if_hue[F("iv")] | -1;
@ -342,17 +344,17 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
CJSON(countdownHour, cntdwn_goal[3]); CJSON(countdownHour, cntdwn_goal[3]);
CJSON(countdownMin, cntdwn_goal[4]); CJSON(countdownMin, cntdwn_goal[4]);
CJSON(countdownSec, cntdwn_goal[5]); CJSON(countdownSec, cntdwn_goal[5]);
CJSON(macroCountdown, cntdwn[F("macro")]); CJSON(macroCountdown, cntdwn["macro"]);
setCountdown(); setCountdown();
JsonArray timers = tm[F("ins")]; JsonArray timers = tm["ins"];
uint8_t it = 0; uint8_t it = 0;
for (JsonObject timer : timers) { for (JsonObject timer : timers) {
if (it > 9) break; if (it > 9) break;
if (it<8 && timer[F("hour")]==255) it=8; // hour==255 -> sunrise/sunset if (it<8 && timer[F("hour")]==255) it=8; // hour==255 -> sunrise/sunset
CJSON(timerHours[it], timer[F("hour")]); CJSON(timerHours[it], timer[F("hour")]);
CJSON(timerMinutes[it], timer["min"]); CJSON(timerMinutes[it], timer["min"]);
CJSON(timerMacro[it], timer[F("macro")]); CJSON(timerMacro[it], timer["macro"]);
byte dowPrev = timerWeekday[it]; byte dowPrev = timerWeekday[it];
//note: act is currently only 0 or 1. //note: act is currently only 0 or 1.
@ -541,6 +543,7 @@ void serializeConfig() {
hw_btn_ins_0_macros.add(macroDoublePress[i]); hw_btn_ins_0_macros.add(macroDoublePress[i]);
} }
hw_btn[F("tt")] = touchThreshold; hw_btn[F("tt")] = touchThreshold;
hw_btn["mqtt"] = buttonPublishMqtt;
JsonObject hw_ir = hw.createNestedObject("ir"); JsonObject hw_ir = hw.createNestedObject("ir");
hw_ir["pin"] = irPin; hw_ir["pin"] = irPin;
@ -570,7 +573,7 @@ void serializeConfig() {
light_nl[F("mode")] = nightlightMode; light_nl[F("mode")] = nightlightMode;
light_nl["dur"] = nightlightDelayMinsDefault; light_nl["dur"] = nightlightDelayMinsDefault;
light_nl[F("tbri")] = nightlightTargetBri; light_nl[F("tbri")] = nightlightTargetBri;
light_nl[F("macro")] = macroNl; light_nl["macro"] = macroNl;
JsonObject def = doc.createNestedObject("def"); JsonObject def = doc.createNestedObject("def");
def[F("ps")] = bootPreset; def[F("ps")] = bootPreset;
@ -590,10 +593,10 @@ void serializeConfig() {
JsonObject if_sync_send = if_sync.createNestedObject("send"); JsonObject if_sync_send = if_sync.createNestedObject("send");
if_sync_send[F("dir")] = notifyDirect; if_sync_send[F("dir")] = notifyDirect;
if_sync_send[F("btn")] = notifyButton; if_sync_send["btn"] = notifyButton;
if_sync_send[F("va")] = notifyAlexa; if_sync_send["va"] = notifyAlexa;
if_sync_send[F("hue")] = notifyHue; if_sync_send["hue"] = notifyHue;
if_sync_send[F("macro")] = notifyMacro; if_sync_send["macro"] = notifyMacro;
if_sync_send[F("twice")] = notifyTwice; if_sync_send[F("twice")] = notifyTwice;
JsonObject if_nodes = interfaces.createNestedObject("nodes"); JsonObject if_nodes = interfaces.createNestedObject("nodes");
@ -685,7 +688,7 @@ void serializeConfig() {
JsonArray goal = cntdwn.createNestedArray(F("goal")); JsonArray goal = cntdwn.createNestedArray(F("goal"));
goal.add(countdownYear); goal.add(countdownMonth); goal.add(countdownDay); goal.add(countdownYear); goal.add(countdownMonth); goal.add(countdownDay);
goal.add(countdownHour); goal.add(countdownMin); goal.add(countdownSec); goal.add(countdownHour); goal.add(countdownMin); goal.add(countdownSec);
cntdwn[F("macro")] = macroCountdown; cntdwn["macro"] = macroCountdown;
JsonArray timers_ins = timers.createNestedArray("ins"); JsonArray timers_ins = timers.createNestedArray("ins");
@ -695,7 +698,7 @@ void serializeConfig() {
timers_ins0["en"] = (timerWeekday[i] & 0x01); timers_ins0["en"] = (timerWeekday[i] & 0x01);
timers_ins0[F("hour")] = timerHours[i]; timers_ins0[F("hour")] = timerHours[i];
timers_ins0["min"] = timerMinutes[i]; timers_ins0["min"] = timerMinutes[i];
timers_ins0[F("macro")] = timerMacro[i]; timers_ins0["macro"] = timerMacro[i];
timers_ins0[F("dow")] = timerWeekday[i] >> 1; timers_ins0[F("dow")] = timerWeekday[i] >> 1;
} }
@ -755,7 +758,7 @@ bool deserializeConfigSec() {
#endif #endif
#ifndef WLED_DISABLE_HUESYNC #ifndef WLED_DISABLE_HUESYNC
getStringFromJson(hueApiKey, interfaces[F("hue")][F("key")], 47); getStringFromJson(hueApiKey, interfaces["hue"][F("key")], 47);
#endif #endif
JsonObject ota = doc["ota"]; JsonObject ota = doc["ota"];

View File

@ -83,6 +83,7 @@ Password: <input type="password" name="MQPASS" maxlength="64"><br>
Client ID: <input name="MQCID" maxlength="40"><br> Client ID: <input name="MQCID" maxlength="40"><br>
Device Topic: <input name="MD" maxlength="32"><br> Device Topic: <input name="MD" maxlength="32"><br>
Group Topic: <input name="MG" maxlength="32"><br> Group Topic: <input name="MG" maxlength="32"><br>
Publish on button press: <input type="checkbox" name="BM"><br>
<i>Reboot required to apply changes. </i><a href="https://github.com/Aircoookie/WLED/wiki/MQTT" target="_blank">MQTT info</a> <i>Reboot required to apply changes. </i><a href="https://github.com/Aircoookie/WLED/wiki/MQTT" target="_blank">MQTT info</a>
<h3>Philips Hue</h3> <h3>Philips Hue</h3>
<i>You can find the bridge IP and the light number in the 'About' section of the hue app.</i><br> <i>You can find the bridge IP and the light number in the 'About' section of the hue app.</i><br>

File diff suppressed because one or more lines are too long

View File

@ -161,7 +161,7 @@ void onHueData(void* arg, AsyncClient* client, void *data, size_t len)
hueColormode = 1; hueColormode = 1;
} else //hs mode } else //hs mode
{ {
hueHue = root[F("hue")]; hueHue = root["hue"];
hueSat = root[F("sat")]; hueSat = root[F("sat")];
hueColormode = 2; hueColormode = 2;
} }

View File

@ -259,6 +259,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
strlcpy(mqttClientID, request->arg(F("MQCID")).c_str(), 41); strlcpy(mqttClientID, request->arg(F("MQCID")).c_str(), 41);
strlcpy(mqttDeviceTopic, request->arg(F("MD")).c_str(), 33); strlcpy(mqttDeviceTopic, request->arg(F("MD")).c_str(), 33);
strlcpy(mqttGroupTopic, request->arg(F("MG")).c_str(), 33); strlcpy(mqttGroupTopic, request->arg(F("MG")).c_str(), 33);
buttonPublishMqtt = request->hasArg(F("BM"));
#endif #endif
#ifndef WLED_DISABLE_HUESYNC #ifndef WLED_DISABLE_HUESYNC

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2107010 #define VERSION 2107011
//uncomment this if you have a "my_config.h" file you'd like to use //uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG //#define WLED_USE_MY_CONFIG
@ -442,6 +442,7 @@ WLED_GLOBAL byte briLast _INIT(128); // brightness before turned off. U
WLED_GLOBAL byte whiteLast _INIT(128); // white channel before turned off. Used for toggle function WLED_GLOBAL byte whiteLast _INIT(128); // white channel before turned off. Used for toggle function
// button // button
WLED_GLOBAL bool buttonPublishMqtt _INIT(false);
WLED_GLOBAL bool buttonPressedBefore[WLED_MAX_BUTTONS] _INIT({false}); WLED_GLOBAL bool buttonPressedBefore[WLED_MAX_BUTTONS] _INIT({false});
WLED_GLOBAL bool buttonLongPressed[WLED_MAX_BUTTONS] _INIT({false}); WLED_GLOBAL bool buttonLongPressed[WLED_MAX_BUTTONS] _INIT({false});
WLED_GLOBAL unsigned long buttonPressedTime[WLED_MAX_BUTTONS] _INIT({0}); WLED_GLOBAL unsigned long buttonPressedTime[WLED_MAX_BUTTONS] _INIT({0});

View File

@ -441,6 +441,7 @@ void getSettingsJS(byte subPage, char* dest)
sappends('s',SET_F("MQCID"),mqttClientID); sappends('s',SET_F("MQCID"),mqttClientID);
sappends('s',SET_F("MD"),mqttDeviceTopic); sappends('s',SET_F("MD"),mqttDeviceTopic);
sappends('s',SET_F("MG"),mqttGroupTopic); sappends('s',SET_F("MG"),mqttGroupTopic);
sappend('c',SET_F("BM"),buttonPublishMqtt);
#endif #endif
#ifndef WLED_DISABLE_HUESYNC #ifndef WLED_DISABLE_HUESYNC