From 83d5b919d68c557dc0f3072caefbac71022b8f12 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 25 Sep 2024 18:47:09 +0200 Subject: [PATCH] show emsesp-devices in system info, add common fields to value_info #2033 --- src/analogsensor.cpp | 4 ++++ src/analogsensor.h | 2 +- src/system.cpp | 32 +++++++++++++++++++++++++++--- src/temperaturesensor.cpp | 7 +++++-- src/temperaturesensor.h | 2 +- src/web/WebCustomEntityService.cpp | 16 ++++----------- src/web/WebCustomEntityService.h | 1 - src/web/WebSchedulerService.cpp | 20 +++++++++---------- src/web/WebSchedulerService.h | 4 ++-- src/web/WebStatusService.cpp | 4 ++-- 10 files changed, 57 insertions(+), 35 deletions(-) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index abf7195f4..e839fec13 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -665,11 +665,15 @@ bool AnalogSensor::get_value_info(JsonObject output, const char * cmd, const int } void AnalogSensor::get_value_json(JsonObject output, const Sensor & sensor) { + output["name"] = sensor.name(); + output["fullname"] = sensor.name(); output["gpio"] = sensor.gpio(); output["type"] = F_(number); output["analog"] = FL_(list_sensortype)[sensor.type()]; output["value"] = sensor.value(); + output["readable"] = true; output["writeable"] = sensor.type() == AnalogType::COUNTER || (sensor.type() >= AnalogType::DIGITAL_OUT && sensor.type() <= AnalogType::PWM_2); + output["visible"] = true; if (sensor.type() == AnalogType::COUNTER) { output["min"] = 0; output["max"] = 4000000; diff --git a/src/analogsensor.h b/src/analogsensor.h index 8599a97d0..23cb72668 100644 --- a/src/analogsensor.h +++ b/src/analogsensor.h @@ -153,7 +153,7 @@ class AnalogSensor { return (!sensors_.empty()); } - size_t no_sensors() const { + size_t count_entities() const { return sensors_.size(); } diff --git a/src/system.cpp b/src/system.cpp index f40ef7b2d..f796514d8 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1593,12 +1593,12 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output // Sensor Status node = output["sensor"].to(); if (EMSESP::sensor_enabled()) { - node["temperatureSensors"] = EMSESP::temperaturesensor_.no_sensors(); + node["temperatureSensors"] = EMSESP::temperaturesensor_.count_entities(); node["temperatureSensorReads"] = EMSESP::temperaturesensor_.reads(); node["temperatureSensorFails"] = EMSESP::temperaturesensor_.fails(); } if (EMSESP::analog_enabled()) { - node["analogSensors"] = EMSESP::analogsensor_.no_sensors(); + node["analogSensors"] = EMSESP::analogsensor_.count_entities(); node["analogSensorReads"] = EMSESP::analogsensor_.reads(); node["analogSensorFails"] = EMSESP::analogsensor_.fails(); } @@ -1691,8 +1691,8 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output }); // Devices - show EMS devices if we have any + JsonArray devices = output["devices"].to(); if (!EMSESP::emsdevices.empty()) { - JsonArray devices = output["devices"].to(); for (const auto & device_class : EMSFactory::device_handlers()) { for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice && (emsdevice->device_type() == device_class.first)) { @@ -1725,6 +1725,32 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output } } } + // Also show EMSESP devices if we have any + if (EMSESP::temperaturesensor_.count_entities()) { + JsonObject obj = devices.add(); + obj["type"] = F_(temperaturesensor); + obj["name"] = F_(temperaturesensor); + obj["entities"] = EMSESP::temperaturesensor_.count_entities(); + } + // if (EMSESP::analog_enabled()) { + if (EMSESP::analogsensor_.count_entities()) { + JsonObject obj = devices.add(); + obj["type"] = F_(analogsensor); + obj["name"] = F_(analogsensor); + obj["entities"] = EMSESP::analogsensor_.count_entities(); + } + if (EMSESP::webSchedulerService.count_entities()) { + JsonObject obj = devices.add(); + obj["type"] = F_(scheduler); + obj["name"] = F_(scheduler); + obj["entities"] = EMSESP::webSchedulerService.count_entities(); + } + if (EMSESP::webCustomEntityService.count_entities()) { + JsonObject obj = devices.add(); + obj["type"] = F_(custom); + obj["name"] = F_(custom); + obj["entities"] = EMSESP::webCustomEntityService.count_entities(); + } return true; // this function always returns true! } diff --git a/src/temperaturesensor.cpp b/src/temperaturesensor.cpp index 8567cbe43..c647b82a4 100644 --- a/src/temperaturesensor.cpp +++ b/src/temperaturesensor.cpp @@ -380,8 +380,9 @@ bool TemperatureSensor::get_value_info(JsonObject output, const char * cmd, cons } void TemperatureSensor::get_value_json(JsonObject output, const Sensor & sensor) { - output["id"] = sensor.id(); - output["name"] = sensor.name(); + output["id"] = sensor.id(); + output["name"] = sensor.name(); + output["fullname"] = sensor.name(); if (Helpers::hasValue(sensor.temperature_c)) { char val[10]; output["value"] = serialized(Helpers::render_value(val, sensor.temperature_c, 10, EMSESP::system_.fahrenheit() ? 2 : 0)); @@ -389,7 +390,9 @@ void TemperatureSensor::get_value_json(JsonObject output, const Sensor & sensor) output["type"] = F_(number); output["uom"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); + output["readable"] = true; output["writeable"] = false; + output["visible"] = true; } diff --git a/src/temperaturesensor.h b/src/temperaturesensor.h index 90f5bd46e..1d9e4d364 100644 --- a/src/temperaturesensor.h +++ b/src/temperaturesensor.h @@ -106,7 +106,7 @@ class TemperatureSensor { return (!sensors_.empty()); } - size_t no_sensors() { + size_t count_entities() { return sensors_.size(); } diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp index e4e9bbecf..0a0a56061 100644 --- a/src/web/WebCustomEntityService.cpp +++ b/src/web/WebCustomEntityService.cpp @@ -320,9 +320,10 @@ bool WebCustomEntityService::get_value_info(JsonObject output, const char * cmd) // build the json for specific entity void WebCustomEntityService::get_value_json(JsonObject output, const CustomEntityItem & entity) { - output["name"] = entity.name; - output["storage"] = entity.ram ? "ram" : "ems"; - output["type"] = entity.value_type == DeviceValueType::BOOL ? "boolean" : entity.value_type == DeviceValueType::STRING ? "string" : F_(number); + output["name"] = entity.name; + output["fullname"] = entity.name; + output["storage"] = entity.ram ? "ram" : "ems"; + output["type"] = entity.value_type == DeviceValueType::BOOL ? "boolean" : entity.value_type == DeviceValueType::STRING ? "string" : F_(number); if (entity.uom > 0) { output["uom"] = EMSdevice::uom_to_string(entity.uom); } @@ -471,15 +472,6 @@ uint8_t WebCustomEntityService::count_entities() { return count; } -uint8_t WebCustomEntityService::has_commands() { - uint8_t count = 0; - for (const CustomEntityItem & entity : *customEntityItems_) { - count += entity.writeable ? 1 : 0; - } - - return count; -} - // send to dashboard, msgpack don't like serialized, use number void WebCustomEntityService::generate_value_web(JsonObject output) { JsonArray data = output["data"].to(); diff --git a/src/web/WebCustomEntityService.h b/src/web/WebCustomEntityService.h index 16d6a96d8..15db79c7e 100644 --- a/src/web/WebCustomEntityService.h +++ b/src/web/WebCustomEntityService.h @@ -67,7 +67,6 @@ class WebCustomEntityService : public StatefulService { void generate_value_web(JsonObject output); uint8_t count_entities(); - uint8_t has_commands(); void ha_reset() { ha_registered_ = false; } diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 8b9a3241b..167a0f654 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -178,8 +178,9 @@ bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) { // build the json for specific entity void WebSchedulerService::get_value_json(JsonObject output, const ScheduleItem & scheduleItem) { - output["name"] = scheduleItem.name; - output["type"] = "boolean"; + output["name"] = scheduleItem.name; + output["fullname"] = scheduleItem.name; + output["type"] = "boolean"; if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { output["value"] = scheduleItem.active; } else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) { @@ -299,18 +300,15 @@ void WebSchedulerService::publish(const bool force) { } } -bool WebSchedulerService::has_commands() { - if (scheduleItems_->size() == 0) { - return false; - } - +// count number of entries, default: only named items +uint8_t WebSchedulerService::count_entities(bool cmd_only) { + uint8_t count = 0; for (const ScheduleItem & scheduleItem : *scheduleItems_) { - if (!scheduleItem.name.empty()) { - return true; + if (!scheduleItem.name.empty() || !cmd_only) { + count++; } } - - return false; + return count; } #include "shuntingYard.hpp" diff --git a/src/web/WebSchedulerService.h b/src/web/WebSchedulerService.h index 6f208ddf5..3cd1b8c88 100644 --- a/src/web/WebSchedulerService.h +++ b/src/web/WebSchedulerService.h @@ -65,14 +65,14 @@ class WebSchedulerService : public StatefulService { void loop(); void publish_single(const char * name, const bool state); void publish(const bool force = false); - bool has_commands(); 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, const ScheduleItem & scheduleItem); void ha_reset() { ha_registered_ = false; } - bool onChange(const char * cmd); + uint8_t count_entities(bool cmd_only = false); + bool onChange(const char * cmd); #if defined(EMSESP_TEST) void test(); diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 503bf1a94..8ea907161 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -51,8 +51,8 @@ void WebStatusService::systemStatus(AsyncWebServerRequest * request) { root["bus_status"] = EMSESP::bus_status(); // 0, 1 or 2 root["bus_uptime"] = EMSbus::bus_uptime(); root["num_devices"] = EMSESP::count_devices(); - root["num_sensors"] = EMSESP::temperaturesensor_.no_sensors(); - root["num_analogs"] = EMSESP::analogsensor_.no_sensors(); + root["num_sensors"] = EMSESP::temperaturesensor_.count_entities(); + root["num_analogs"] = EMSESP::analogsensor_.count_entities(); root["free_heap"] = EMSESP::system_.getHeapMem(); root["uptime"] = uuid::get_uptime_sec(); root["mqtt_status"] = EMSESP::mqtt_.connected();