diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index ff649b19d..00d4920c5 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -229,7 +229,7 @@ const MqttSettingsForm: FC = () => { doc; // doc is 787 typically so 1024 should be enough + StaticJsonDocument doc; // 1024 is not enough doc["~"] = mqtt_base_; doc["uniq_id"] = uniq_id_s; @@ -1444,22 +1445,23 @@ void Mqtt::add_avty_to_doc(const char * state_t, const JsonObject & doc, const c snprintf(tpl, sizeof(tpl), tpl_draft, "value == 'online'"); avty_json["val_tpl"] = tpl; avty.add(avty_json); - avty.clear(); - + avty_json.clear(); avty_json["t"] = state_t; snprintf(tpl, sizeof(tpl), tpl_draft, cond1 == nullptr ? "value is defined" : cond1); avty_json["val_tpl"] = tpl; avty.add(avty_json); if (cond2 != nullptr) { - avty.clear(); + avty_json.clear(); + avty_json["t"] = state_t; snprintf(tpl, sizeof(tpl), tpl_draft, cond2); avty_json["val_tpl"] = tpl; avty.add(avty_json); } if (negcond != nullptr) { - avty.clear(); + avty_json.clear(); + avty_json["t"] = state_t; snprintf(tpl, sizeof(tpl), "{{'offline' if %s else 'online'}}", negcond); avty_json["val_tpl"] = tpl; avty.add(avty_json); diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 201ffcaff..8a9cfe5ae 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -128,6 +128,74 @@ bool WebSchedulerService::command_setvalue(const char * value, const std::string return false; } +// process json output for info/commands and value_info +bool WebSchedulerService::get_value_info(JsonObject & output, const char * cmd) { + EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); + if (scheduleItems->size() == 0) { + return false; + } + if (Helpers::toLower(cmd) == "commands") { + output["info"] = "lists all values"; + output["commands"] = "lists all commands"; + for (const ScheduleItem & scheduleItem : *scheduleItems) { + if (!scheduleItem.name.empty()) { + output[scheduleItem.name] = "activate schedule"; + } + } + return true; + } + if (strlen(cmd) == 0 || Helpers::toLower(cmd) == "values" || Helpers::toLower(cmd) == "info") { + // list all names + for (const ScheduleItem & scheduleItem : *scheduleItems) { + if (!scheduleItem.name.empty()) { + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { + output[scheduleItem.name] = scheduleItem.active; + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + output[scheduleItem.name] = scheduleItem.active ? 1 : 0; + } else { + char result[12]; + output[scheduleItem.name] = Helpers::render_boolean(result, scheduleItem.active); + } + } + } + return (output.size() > 0); + } + char command_s[30]; + strlcpy(command_s, cmd, sizeof(command_s)); + char * attribute_s = nullptr; + + // check specific attribute to fetch instead of the complete record + char * breakp = strchr(command_s, '/'); + if (breakp) { + *breakp = '\0'; + attribute_s = breakp + 1; + } + JsonVariant data; + for (const ScheduleItem & scheduleItem : *scheduleItems) { + if (Helpers::toLower(scheduleItem.name) == Helpers::toLower(command_s)) { + if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { + output[scheduleItem.name] = scheduleItem.active; + } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { + output[scheduleItem.name] = scheduleItem.active ? 1 : 0; + } else { + char result[12]; + output[scheduleItem.name] = Helpers::render_boolean(result, scheduleItem.active); + } + data = output[scheduleItem.name]; + } + } + if (attribute_s && !strcmp(attribute_s, "value")) { + output.clear(); + output["api_data"] = data; + } + if (output.size()) { + return true; + } + output["message"] = "unknown command"; + return false; +} + +// publish single value void WebSchedulerService::publish_single(const char * name, const bool state) { if (!Mqtt::publish_single() || name == nullptr || name[0] == '\0') { return; @@ -213,7 +281,9 @@ void WebSchedulerService::publish(const bool force) { } } } - Mqtt::queue_publish("scheduler_data", doc.as()); + if (doc.size() > 0) { + Mqtt::queue_publish("scheduler_data", doc.as()); + } } bool WebSchedulerService::has_commands() { diff --git a/src/web/WebSchedulerService.h b/src/web/WebSchedulerService.h index 52341d8e4..e723185e4 100644 --- a/src/web/WebSchedulerService.h +++ b/src/web/WebSchedulerService.h @@ -58,6 +58,7 @@ class WebSchedulerService : public StatefulService { void publish(const bool force = false); bool has_commands(); bool command_setvalue(const char * value, const std::string name); + bool get_value_info(JsonObject & output, const char * cmd); private: bool command(const char * cmd, const char * data);