mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2026-01-26 16:49:11 +03:00
Merge branch 'dev' of https://github.com/emsesp/EMS-ESP32 into dev
This commit is contained in:
@@ -65,7 +65,7 @@
|
||||
"typescript-eslint": "^8.50.0",
|
||||
"vite": "^7.3.0",
|
||||
"vite-plugin-imagemin": "^0.6.1",
|
||||
"vite-tsconfig-paths": "^6.0.2"
|
||||
"vite-tsconfig-paths": "^6.0.3"
|
||||
},
|
||||
"packageManager": "pnpm@10.26.0+sha512.3b3f6c725ebe712506c0ab1ad4133cf86b1f4b687effce62a9b38b4d72e3954242e643190fc51fa1642949c735f403debd44f5cb0edd657abe63a8b6a7e1e402"
|
||||
"packageManager": "pnpm@10.26.1+sha512.664074abc367d2c9324fdc18037097ce0a8f126034160f709928e9e9f95d98714347044e5c3164d65bd5da6c59c6be362b107546292a8eecb7999196e5ce58fa"
|
||||
}
|
||||
|
||||
26
interface/pnpm-lock.yaml
generated
26
interface/pnpm-lock.yaml
generated
@@ -127,8 +127,8 @@ importers:
|
||||
specifier: ^0.6.1
|
||||
version: 0.6.1(vite@7.3.0(@types/node@25.0.3)(terser@5.44.1))
|
||||
vite-tsconfig-paths:
|
||||
specifier: ^6.0.2
|
||||
version: 6.0.2(typescript@5.9.3)(vite@7.3.0(@types/node@25.0.3)(terser@5.44.1))
|
||||
specifier: ^6.0.3
|
||||
version: 6.0.3(typescript@5.9.3)(vite@7.3.0(@types/node@25.0.3)(terser@5.44.1))
|
||||
|
||||
packages:
|
||||
|
||||
@@ -1027,8 +1027,8 @@ packages:
|
||||
base64-js@1.5.1:
|
||||
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
||||
|
||||
baseline-browser-mapping@2.9.9:
|
||||
resolution: {integrity: sha512-V8fbOCSeOFvlDj7LLChUcqbZrdKD9RU/VR260piF1790vT0mfLSwGc/Qzxv3IqiTukOpNtItePa0HBpMAj7MDg==}
|
||||
baseline-browser-mapping@2.9.11:
|
||||
resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==}
|
||||
hasBin: true
|
||||
|
||||
bin-build@3.0.0:
|
||||
@@ -1117,8 +1117,8 @@ packages:
|
||||
resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
caniuse-lite@1.0.30001760:
|
||||
resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==}
|
||||
caniuse-lite@1.0.30001761:
|
||||
resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==}
|
||||
|
||||
caw@2.0.1:
|
||||
resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==}
|
||||
@@ -2988,8 +2988,8 @@ packages:
|
||||
peerDependencies:
|
||||
vite: 5.x || 6.x || 7.x
|
||||
|
||||
vite-tsconfig-paths@6.0.2:
|
||||
resolution: {integrity: sha512-c06LOO8fWB5RuEPpEIHXU9t7Dt4DoiPIljnKws9UygIaQo6PoFKawTftz5/QVcO+6pOs/HHWycnq4UrZkWVYnQ==}
|
||||
vite-tsconfig-paths@6.0.3:
|
||||
resolution: {integrity: sha512-7bL7FPX/DSviaZGYUKowWF1AiDVWjMjxNbE8lyaVGDezkedWqfGhlnQ4BZXre0ZN5P4kAgIJfAlgFDVyjrCIyg==}
|
||||
peerDependencies:
|
||||
vite: '*'
|
||||
peerDependenciesMeta:
|
||||
@@ -3958,7 +3958,7 @@ snapshots:
|
||||
|
||||
base64-js@1.5.1: {}
|
||||
|
||||
baseline-browser-mapping@2.9.9: {}
|
||||
baseline-browser-mapping@2.9.11: {}
|
||||
|
||||
bin-build@3.0.0:
|
||||
dependencies:
|
||||
@@ -4015,8 +4015,8 @@ snapshots:
|
||||
|
||||
browserslist@4.28.1:
|
||||
dependencies:
|
||||
baseline-browser-mapping: 2.9.9
|
||||
caniuse-lite: 1.0.30001760
|
||||
baseline-browser-mapping: 2.9.11
|
||||
caniuse-lite: 1.0.30001761
|
||||
electron-to-chromium: 1.5.267
|
||||
node-releases: 2.0.27
|
||||
update-browserslist-db: 1.2.3(browserslist@4.28.1)
|
||||
@@ -4075,7 +4075,7 @@ snapshots:
|
||||
|
||||
camelcase@2.1.1: {}
|
||||
|
||||
caniuse-lite@1.0.30001760: {}
|
||||
caniuse-lite@1.0.30001761: {}
|
||||
|
||||
caw@2.0.1:
|
||||
dependencies:
|
||||
@@ -6002,7 +6002,7 @@ snapshots:
|
||||
stack-trace: 1.0.0-pre2
|
||||
vite: 7.3.0(@types/node@25.0.3)(terser@5.44.1)
|
||||
|
||||
vite-tsconfig-paths@6.0.2(typescript@5.9.3)(vite@7.3.0(@types/node@25.0.3)(terser@5.44.1)):
|
||||
vite-tsconfig-paths@6.0.3(typescript@5.9.3)(vite@7.3.0(@types/node@25.0.3)(terser@5.44.1)):
|
||||
dependencies:
|
||||
debug: 4.4.3
|
||||
globrex: 0.1.2
|
||||
|
||||
@@ -15,5 +15,5 @@
|
||||
"itty-router": "^5.0.22",
|
||||
"prettier": "^3.7.4"
|
||||
},
|
||||
"packageManager": "pnpm@10.26.0+sha512.3b3f6c725ebe712506c0ab1ad4133cf86b1f4b687effce62a9b38b4d72e3954242e643190fc51fa1642949c735f403debd44f5cb0edd657abe63a8b6a7e1e402"
|
||||
"packageManager": "pnpm@10.26.1+sha512.664074abc367d2c9324fdc18037097ce0a8f126034160f709928e9e9f95d98714347044e5c3164d65bd5da6c59c6be362b107546292a8eecb7999196e5ce58fa"
|
||||
}
|
||||
|
||||
@@ -806,7 +806,7 @@ void AnalogSensor::publish_values(const bool force) {
|
||||
|
||||
Mqtt::add_ha_classes(config.as<JsonObject>(), EMSdevice::DeviceType::ANALOGSENSOR, valueType, sensor.uom());
|
||||
// dev section with model is only created on the 1st sensor
|
||||
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Analog Sensors", nullptr, "EMS-ESP", EMSESP_APP_VERSION, !ha_dev_created);
|
||||
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Analog Sensors", !ha_dev_created);
|
||||
Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond);
|
||||
|
||||
sensor.ha_registered = Mqtt::queue_ha(topic, config.as<JsonObject>());
|
||||
|
||||
@@ -646,6 +646,8 @@ void EMSESP::reset_mqtt_ha() {
|
||||
// force the re-creating of the temperature and analog sensor topics (for HA)
|
||||
temperaturesensor_.reload();
|
||||
analogsensor_.reload();
|
||||
|
||||
// rebuild MQTT HA config topics for shower, custom entities and scheduler
|
||||
shower_.ha_reset();
|
||||
webSchedulerService.ha_reset();
|
||||
webCustomEntityService.ha_reset();
|
||||
|
||||
@@ -1106,14 +1106,14 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
|
||||
// add origin
|
||||
JsonObject origin_json = doc["o"].to<JsonObject>();
|
||||
origin_json["name"] = "EMS-ESP";
|
||||
origin_json["sw"] = EMSESP_APP_VERSION;
|
||||
origin_json["sw"] = "v" + std::string(EMSESP_APP_VERSION);
|
||||
origin_json["url"] = "https://emsesp.org";
|
||||
|
||||
// add dev section
|
||||
if (device_type == EMSdevice::DeviceType::SYSTEM) {
|
||||
add_ha_dev_section(doc.as<JsonObject>(), nullptr, nullptr, nullptr, nullptr, false);
|
||||
add_ha_dev_section(doc.as<JsonObject>());
|
||||
} else {
|
||||
add_ha_dev_section(doc.as<JsonObject>(), EMSdevice::device_type_2_device_name(device_type), model, brand, version, create_device_config);
|
||||
add_ha_dev_section(doc.as<JsonObject>(), EMSdevice::device_type_2_device_name(device_type), create_device_config, model, brand, version);
|
||||
}
|
||||
|
||||
return queue_ha(topic, doc.as<JsonObject>());
|
||||
@@ -1414,8 +1414,8 @@ bool Mqtt::publish_ha_climate_config(const DeviceValue & dv, const bool has_room
|
||||
doc["ic"] = icon;
|
||||
}
|
||||
|
||||
add_ha_dev_section(doc.as<JsonObject>(), devicename, nullptr, nullptr, nullptr, false); // add dev section
|
||||
add_ha_avty_section(doc.as<JsonObject>(), topic_t, seltemp_cond, has_roomtemp ? currtemp_cond : nullptr, hc_mode_cond); // add availability section
|
||||
add_ha_dev_section(doc.as<JsonObject>(), devicename);
|
||||
add_ha_avty_section(doc.as<JsonObject>(), topic_t, seltemp_cond, has_roomtemp ? currtemp_cond : nullptr, hc_mode_cond);
|
||||
|
||||
return queue_ha(topic, doc.as<JsonObject>()); // publish the config payload with retain flag
|
||||
}
|
||||
@@ -1442,40 +1442,42 @@ std::string Mqtt::tag_to_topic(uint8_t device_type, int8_t tag) {
|
||||
// add devs section to an existing doc, only for HA
|
||||
// under devs node it will create ids and name and optional mf, mdl, via_device
|
||||
// name could be EMSdevice::device_type_2_device_name(dv.device_type));
|
||||
void Mqtt::add_ha_dev_section(JsonObject doc, const char * name, const char * model, const char * brand, const char * version, const bool create_model) {
|
||||
void Mqtt::add_ha_dev_section(JsonObject doc, const char * name, const bool create_model, const char * model, const char * brand, const char * version) {
|
||||
// only works for HA
|
||||
if (discovery_type() != discoveryType::HOMEASSISTANT) {
|
||||
return;
|
||||
}
|
||||
|
||||
// create dev section
|
||||
JsonObject dev_json = doc["dev"].to<JsonObject>();
|
||||
JsonObject dev_json = doc["dev"].to<JsonObject>(); // create dev section
|
||||
|
||||
// add ids and name - capitalize first letter of the name
|
||||
// add ids - capitalize first letter of the name if there is one
|
||||
JsonArray ids = dev_json["ids"].to<JsonArray>(); // ids, it is an array with a single element
|
||||
if (name != nullptr) {
|
||||
// for ids, replace all spaces with -
|
||||
// for ids, replace all spaces with - and add to the basename
|
||||
std::string lower_name_str(name);
|
||||
std::replace(lower_name_str.begin(), lower_name_str.end(), ' ', '-');
|
||||
ids.add(Mqtt::basename() + "-" + Helpers::toLower(lower_name_str));
|
||||
|
||||
auto cap_name = strdup(name);
|
||||
Helpers::CharToUpperUTF8(cap_name); // capitalize first letter
|
||||
dev_json["name"] = Mqtt::basename() + " " + cap_name;
|
||||
free(cap_name);
|
||||
} else {
|
||||
ids.add(Mqtt::basename()); // no name, assign it to the main EMS-ESP device in HA
|
||||
}
|
||||
|
||||
// create the model, manufacturer and version
|
||||
// create the name, model, manufacturer and version
|
||||
if (create_model) {
|
||||
if (name != nullptr) {
|
||||
auto cap_name = strdup(name);
|
||||
Helpers::CharToUpperUTF8(cap_name); // capitalize first letter
|
||||
dev_json["name"] = Mqtt::basename() + " " + cap_name;
|
||||
free(cap_name);
|
||||
} else {
|
||||
dev_json["name"] = Mqtt::basename();
|
||||
}
|
||||
|
||||
// add mf (manufacturer/brand), mdl (model), sw (software version) and via_device
|
||||
dev_json["mf"] = brand != nullptr ? brand : "EMS-ESP";
|
||||
if (model != nullptr) {
|
||||
dev_json["mdl"] = model;
|
||||
}
|
||||
if (version != nullptr) {
|
||||
dev_json["sw"] = version;
|
||||
}
|
||||
dev_json["sw"] = version != nullptr ? version : "v" + std::string(EMSESP_APP_VERSION);
|
||||
dev_json["via_device"] = Mqtt::basename();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,7 +259,12 @@ class Mqtt {
|
||||
|
||||
static void
|
||||
add_ha_classes(JsonObject doc, const uint8_t device_type, const uint8_t type, const uint8_t uom, const char * entity = nullptr, bool is_discovery = true);
|
||||
static void add_ha_dev_section(JsonObject doc, const char * name, const char * model, const char * brand, const char * version, const bool create_model);
|
||||
static void add_ha_dev_section(JsonObject doc,
|
||||
const char * name = nullptr,
|
||||
const bool create_model = false,
|
||||
const char * model = nullptr,
|
||||
const char * brand = nullptr,
|
||||
const char * version = nullptr);
|
||||
static void add_ha_avty_section(JsonObject doc,
|
||||
const char * state_t = nullptr,
|
||||
const char * cond1 = nullptr,
|
||||
|
||||
@@ -210,7 +210,7 @@ void Shower::create_ha_discovery() {
|
||||
doc["stat_t"] = "~/shower_active";
|
||||
|
||||
Mqtt::add_ha_bool(doc.as<JsonObject>());
|
||||
Mqtt::add_ha_dev_section(doc.as<JsonObject>(), "Shower Sensors", nullptr, nullptr, nullptr, false);
|
||||
Mqtt::add_ha_dev_section(doc.as<JsonObject>(), "Shower Sensors", true);
|
||||
Mqtt::add_ha_avty_section(doc.as<JsonObject>()); // no conditions
|
||||
|
||||
snprintf(topic, sizeof(topic), "binary_sensor/%s/shower_active/config", Mqtt::basename().c_str());
|
||||
@@ -239,7 +239,7 @@ void Shower::create_ha_discovery() {
|
||||
doc["dev_cla"] = "duration";
|
||||
// doc["ent_cat"] = "diagnostic";
|
||||
|
||||
Mqtt::add_ha_dev_section(doc.as<JsonObject>(), "Shower Sensors", nullptr, "EMS-ESP", EMSESP_APP_VERSION, true);
|
||||
Mqtt::add_ha_dev_section(doc.as<JsonObject>(), "Shower Sensors");
|
||||
Mqtt::add_ha_avty_section(doc.as<JsonObject>(), "~/shower_data", "value_json.duration is defined");
|
||||
|
||||
snprintf(topic, sizeof(topic), "sensor/%s/shower_duration/config", Mqtt::basename().c_str());
|
||||
|
||||
@@ -547,7 +547,7 @@ void TemperatureSensor::publish_values(const bool force) {
|
||||
config["dev_cla"] = "temperature";
|
||||
|
||||
// dev section with model is only created on the 1st sensor
|
||||
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Temperature Sensors", nullptr, "EMS-ESP", EMSESP_APP_VERSION, !ha_dev_created);
|
||||
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Temperature Sensors", !ha_dev_created);
|
||||
Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond);
|
||||
|
||||
char topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
||||
|
||||
@@ -1 +1 @@
|
||||
#define EMSESP_APP_VERSION "3.7.3-dev.38"
|
||||
#define EMSESP_APP_VERSION "3.7.3-dev.39"
|
||||
|
||||
@@ -378,27 +378,14 @@ void WebCustomEntityService::publish_single(CustomEntityItem & entity) {
|
||||
}
|
||||
|
||||
// publish to Mqtt
|
||||
void WebCustomEntityService::publish(const bool force) {
|
||||
if (force) {
|
||||
ha_registered_ = false;
|
||||
}
|
||||
|
||||
if (!Mqtt::enabled()) {
|
||||
void WebCustomEntityService::publish() {
|
||||
if (!Mqtt::enabled() || customEntityItems_->empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (customEntityItems_->empty()) {
|
||||
return;
|
||||
}
|
||||
if (Mqtt::publish_single() && force) {
|
||||
for (CustomEntityItem & entityItem : *customEntityItems_) {
|
||||
publish_single(entityItem);
|
||||
}
|
||||
}
|
||||
|
||||
JsonDocument doc;
|
||||
JsonObject output = doc.to<JsonObject>();
|
||||
bool ha_created = ha_registered_;
|
||||
bool ha_created = ha_configdone_;
|
||||
|
||||
for (CustomEntityItem & entityItem : *customEntityItems_) {
|
||||
if (entityItem.hide) {
|
||||
@@ -406,7 +393,7 @@ void WebCustomEntityService::publish(const bool force) {
|
||||
}
|
||||
render_value(output, entityItem);
|
||||
// create HA config
|
||||
if (Mqtt::ha_enabled() && !ha_registered_) {
|
||||
if (Mqtt::ha_enabled() && !ha_configdone_) {
|
||||
JsonDocument config;
|
||||
config["~"] = Mqtt::base();
|
||||
|
||||
@@ -464,15 +451,15 @@ void WebCustomEntityService::publish(const bool force) {
|
||||
config["def_ent_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_s;
|
||||
|
||||
Mqtt::add_ha_classes(config.as<JsonObject>(), EMSdevice::DeviceType::SYSTEM, entityItem.value_type, entityItem.uom);
|
||||
|
||||
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Custom Entities", nullptr, "EMS-ESP", EMSESP_APP_VERSION, !ha_created);
|
||||
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Custom Entities", !ha_created);
|
||||
Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond);
|
||||
|
||||
ha_created |= Mqtt::queue_ha(topic, config.as<JsonObject>());
|
||||
}
|
||||
}
|
||||
|
||||
ha_registered_ = ha_created;
|
||||
ha_configdone_ = ha_created;
|
||||
|
||||
if (output.size() > 0) {
|
||||
char topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
||||
snprintf(topic, sizeof(topic), "%s_data", F_(custom));
|
||||
|
||||
@@ -58,7 +58,7 @@ class WebCustomEntityService : public StatefulService<WebCustomEntity> {
|
||||
|
||||
void begin();
|
||||
void publish_single(CustomEntityItem & entity);
|
||||
void publish(const bool force = false);
|
||||
void publish();
|
||||
bool command_setvalue(const char * value, const int8_t id, const char * name);
|
||||
bool get_value_info(JsonObject output, const char * cmd);
|
||||
void get_value_json(JsonObject output, CustomEntityItem const & entity);
|
||||
@@ -70,7 +70,7 @@ class WebCustomEntityService : public StatefulService<WebCustomEntity> {
|
||||
|
||||
uint8_t count_entities();
|
||||
void ha_reset() {
|
||||
ha_registered_ = false;
|
||||
ha_configdone_ = false;
|
||||
}
|
||||
|
||||
#if defined(EMSESP_TEST)
|
||||
@@ -85,7 +85,7 @@ class WebCustomEntityService : public StatefulService<WebCustomEntity> {
|
||||
|
||||
std::list<CustomEntityItem, AllocatorPSRAM<CustomEntityItem>> * customEntityItems_; // pointer to the list of entity items
|
||||
|
||||
bool ha_registered_ = false;
|
||||
bool ha_configdone_ = false;
|
||||
};
|
||||
|
||||
} // namespace emsesp
|
||||
|
||||
@@ -106,7 +106,8 @@ StateUpdateResult WebScheduler::update(JsonObject root, WebScheduler & webSchedu
|
||||
}
|
||||
}
|
||||
|
||||
EMSESP::webSchedulerService.publish(true);
|
||||
EMSESP::webSchedulerService.ha_reset();
|
||||
EMSESP::webSchedulerService.publish();
|
||||
|
||||
return StateUpdateResult::CHANGED;
|
||||
}
|
||||
@@ -217,14 +218,10 @@ void WebSchedulerService::publish_single(const char * name, const bool state) {
|
||||
// publish to Mqtt
|
||||
void WebSchedulerService::publish(const bool force) {
|
||||
if (force) {
|
||||
ha_registered_ = false;
|
||||
ha_configdone_ = false;
|
||||
}
|
||||
|
||||
if (!Mqtt::enabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (scheduleItems_->empty()) {
|
||||
if (!Mqtt::enabled() || scheduleItems_->empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -236,13 +233,13 @@ void WebSchedulerService::publish(const bool force) {
|
||||
|
||||
JsonDocument doc;
|
||||
JsonObject output = doc.to<JsonObject>();
|
||||
bool ha_created = ha_registered_;
|
||||
bool ha_created = ha_configdone_;
|
||||
for (const ScheduleItem & scheduleItem : *scheduleItems_) {
|
||||
if (scheduleItem.name[0] != '\0' && !output[scheduleItem.name].is<JsonVariantConst>()) {
|
||||
Mqtt::add_value_bool(output, (const char *)scheduleItem.name, scheduleItem.active);
|
||||
|
||||
// create HA config
|
||||
if (Mqtt::ha_enabled() && !ha_registered_) {
|
||||
if (Mqtt::ha_enabled() && !ha_configdone_) {
|
||||
JsonDocument config;
|
||||
config["~"] = Mqtt::base();
|
||||
|
||||
@@ -276,7 +273,7 @@ void WebSchedulerService::publish(const bool force) {
|
||||
config["cmd_t"] = command_topic;
|
||||
|
||||
Mqtt::add_ha_bool(config.as<JsonObject>());
|
||||
Mqtt::add_ha_dev_section(config.as<JsonObject>(), F_(scheduler), nullptr, "EMS-ESP", EMSESP_APP_VERSION, !ha_created);
|
||||
Mqtt::add_ha_dev_section(config.as<JsonObject>(), F_(scheduler), !ha_created);
|
||||
Mqtt::add_ha_avty_section(config.as<JsonObject>(), stat_t, val_cond);
|
||||
|
||||
ha_created |= Mqtt::queue_ha(topic, config.as<JsonObject>());
|
||||
@@ -284,7 +281,7 @@ void WebSchedulerService::publish(const bool force) {
|
||||
}
|
||||
}
|
||||
|
||||
ha_registered_ = ha_created;
|
||||
ha_configdone_ = ha_created;
|
||||
|
||||
if (!doc.isNull()) {
|
||||
char topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
||||
|
||||
@@ -83,7 +83,7 @@ class WebSchedulerService : public StatefulService<WebScheduler> {
|
||||
bool get_value_info(JsonObject output, const char * cmd);
|
||||
void get_value_json(JsonObject output, const ScheduleItem & scheduleItem);
|
||||
void ha_reset() {
|
||||
ha_registered_ = false;
|
||||
ha_configdone_ = false;
|
||||
}
|
||||
uint8_t count_entities(bool cmd_only = false);
|
||||
bool onChange(const char * cmd);
|
||||
@@ -106,7 +106,7 @@ class WebSchedulerService : public StatefulService<WebScheduler> {
|
||||
|
||||
HttpEndpoint<WebScheduler> _httpEndpoint;
|
||||
FSPersistence<WebScheduler> _fsPersistence;
|
||||
bool ha_registered_ = false;
|
||||
bool ha_configdone_ = false;
|
||||
|
||||
std::list<ScheduleItem, AllocatorPSRAM<ScheduleItem>> * scheduleItems_; // pointer to the list of schedule events
|
||||
std::list<ScheduleItem *, AllocatorPSRAM<ScheduleItem *>> cmd_changed_; // pointer to commands in list that are triggered by change
|
||||
|
||||
Reference in New Issue
Block a user