mirror of
https://github.com/esphome/esphome.git
synced 2024-11-26 08:55:22 +01:00
web_server support for home assistant like styling (#5854)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
a97fc4f758
commit
8e674990b0
1 changed files with 24 additions and 14 deletions
|
@ -397,19 +397,21 @@ void WebServer::handle_js_request(AsyncWebServerRequest *request) {
|
||||||
|
|
||||||
#define set_json_id(root, obj, sensor, start_config) \
|
#define set_json_id(root, obj, sensor, start_config) \
|
||||||
(root)["id"] = sensor; \
|
(root)["id"] = sensor; \
|
||||||
if (((start_config) == DETAIL_ALL)) \
|
if (((start_config) == DETAIL_ALL)) { \
|
||||||
(root)["name"] = (obj)->get_name();
|
(root)["name"] = (obj)->get_name(); \
|
||||||
|
(root)["icon"] = (obj)->get_icon(); \
|
||||||
|
(root)["entity_category"] = (obj)->get_entity_category(); \
|
||||||
|
if ((obj)->is_disabled_by_default()) \
|
||||||
|
(root)["is_disabled_by_default"] = (obj)->is_disabled_by_default(); \
|
||||||
|
}
|
||||||
|
|
||||||
#define set_json_value(root, obj, sensor, value, start_config) \
|
#define set_json_value(root, obj, sensor, value, start_config) \
|
||||||
set_json_id((root), (obj), sensor, start_config)(root)["value"] = value;
|
set_json_id((root), (obj), sensor, start_config); \
|
||||||
|
(root)["value"] = value;
|
||||||
#define set_json_state_value(root, obj, sensor, state, value, start_config) \
|
|
||||||
set_json_value(root, obj, sensor, value, start_config)(root)["state"] = state;
|
|
||||||
|
|
||||||
#define set_json_icon_state_value(root, obj, sensor, state, value, start_config) \
|
#define set_json_icon_state_value(root, obj, sensor, state, value, start_config) \
|
||||||
set_json_value(root, obj, sensor, value, start_config)(root)["state"] = state; \
|
set_json_value(root, obj, sensor, value, start_config); \
|
||||||
if (((start_config) == DETAIL_ALL)) \
|
(root)["state"] = state;
|
||||||
(root)["icon"] = (obj)->get_icon();
|
|
||||||
|
|
||||||
#ifdef USE_SENSOR
|
#ifdef USE_SENSOR
|
||||||
void WebServer::on_sensor_update(sensor::Sensor *obj, float state) {
|
void WebServer::on_sensor_update(sensor::Sensor *obj, float state) {
|
||||||
|
@ -436,6 +438,10 @@ std::string WebServer::sensor_json(sensor::Sensor *obj, float value, JsonDetail
|
||||||
state += " " + obj->get_unit_of_measurement();
|
state += " " + obj->get_unit_of_measurement();
|
||||||
}
|
}
|
||||||
set_json_icon_state_value(root, obj, "sensor-" + obj->get_object_id(), state, value, start_config);
|
set_json_icon_state_value(root, obj, "sensor-" + obj->get_object_id(), state, value, start_config);
|
||||||
|
if (start_config == DETAIL_ALL) {
|
||||||
|
if (!obj->get_unit_of_measurement().empty())
|
||||||
|
root["uom"] = obj->get_unit_of_measurement();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -529,7 +535,8 @@ void WebServer::on_binary_sensor_update(binary_sensor::BinarySensor *obj, bool s
|
||||||
}
|
}
|
||||||
std::string WebServer::binary_sensor_json(binary_sensor::BinarySensor *obj, bool value, JsonDetail start_config) {
|
std::string WebServer::binary_sensor_json(binary_sensor::BinarySensor *obj, bool value, JsonDetail start_config) {
|
||||||
return json::build_json([obj, value, start_config](JsonObject root) {
|
return json::build_json([obj, value, start_config](JsonObject root) {
|
||||||
set_json_state_value(root, obj, "binary_sensor-" + obj->get_object_id(), value ? "ON" : "OFF", value, start_config);
|
set_json_icon_state_value(root, obj, "binary_sensor-" + obj->get_object_id(), value ? "ON" : "OFF", value,
|
||||||
|
start_config);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
void WebServer::handle_binary_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match) {
|
void WebServer::handle_binary_sensor_request(AsyncWebServerRequest *request, const UrlMatch &match) {
|
||||||
|
@ -548,7 +555,8 @@ void WebServer::handle_binary_sensor_request(AsyncWebServerRequest *request, con
|
||||||
void WebServer::on_fan_update(fan::Fan *obj) { this->events_.send(this->fan_json(obj, DETAIL_STATE).c_str(), "state"); }
|
void WebServer::on_fan_update(fan::Fan *obj) { this->events_.send(this->fan_json(obj, DETAIL_STATE).c_str(), "state"); }
|
||||||
std::string WebServer::fan_json(fan::Fan *obj, JsonDetail start_config) {
|
std::string WebServer::fan_json(fan::Fan *obj, JsonDetail start_config) {
|
||||||
return json::build_json([obj, start_config](JsonObject root) {
|
return json::build_json([obj, start_config](JsonObject root) {
|
||||||
set_json_state_value(root, obj, "fan-" + obj->get_object_id(), obj->state ? "ON" : "OFF", obj->state, start_config);
|
set_json_icon_state_value(root, obj, "fan-" + obj->get_object_id(), obj->state ? "ON" : "OFF", obj->state,
|
||||||
|
start_config);
|
||||||
const auto traits = obj->get_traits();
|
const auto traits = obj->get_traits();
|
||||||
if (traits.supports_speed()) {
|
if (traits.supports_speed()) {
|
||||||
root["speed_level"] = obj->speed;
|
root["speed_level"] = obj->speed;
|
||||||
|
@ -773,7 +781,7 @@ void WebServer::handle_cover_request(AsyncWebServerRequest *request, const UrlMa
|
||||||
}
|
}
|
||||||
std::string WebServer::cover_json(cover::Cover *obj, JsonDetail start_config) {
|
std::string WebServer::cover_json(cover::Cover *obj, JsonDetail start_config) {
|
||||||
return json::build_json([obj, start_config](JsonObject root) {
|
return json::build_json([obj, start_config](JsonObject root) {
|
||||||
set_json_state_value(root, obj, "cover-" + obj->get_object_id(), obj->is_fully_closed() ? "CLOSED" : "OPEN",
|
set_json_icon_state_value(root, obj, "cover-" + obj->get_object_id(), obj->is_fully_closed() ? "CLOSED" : "OPEN",
|
||||||
obj->position, start_config);
|
obj->position, start_config);
|
||||||
root["current_operation"] = cover::cover_operation_to_str(obj->current_operation);
|
root["current_operation"] = cover::cover_operation_to_str(obj->current_operation);
|
||||||
|
|
||||||
|
@ -824,6 +832,8 @@ std::string WebServer::number_json(number::Number *obj, float value, JsonDetail
|
||||||
root["max_value"] = obj->traits.get_max_value();
|
root["max_value"] = obj->traits.get_max_value();
|
||||||
root["step"] = obj->traits.get_step();
|
root["step"] = obj->traits.get_step();
|
||||||
root["mode"] = (int) obj->traits.get_mode();
|
root["mode"] = (int) obj->traits.get_mode();
|
||||||
|
if (!obj->traits.get_unit_of_measurement().empty())
|
||||||
|
root["uom"] = obj->traits.get_unit_of_measurement();
|
||||||
}
|
}
|
||||||
if (std::isnan(value)) {
|
if (std::isnan(value)) {
|
||||||
root["value"] = "\"NaN\"";
|
root["value"] = "\"NaN\"";
|
||||||
|
@ -930,7 +940,7 @@ void WebServer::handle_select_request(AsyncWebServerRequest *request, const UrlM
|
||||||
}
|
}
|
||||||
std::string WebServer::select_json(select::Select *obj, const std::string &value, JsonDetail start_config) {
|
std::string WebServer::select_json(select::Select *obj, const std::string &value, JsonDetail start_config) {
|
||||||
return json::build_json([obj, value, start_config](JsonObject root) {
|
return json::build_json([obj, value, start_config](JsonObject root) {
|
||||||
set_json_state_value(root, obj, "select-" + obj->get_object_id(), value, value, start_config);
|
set_json_icon_state_value(root, obj, "select-" + obj->get_object_id(), value, value, start_config);
|
||||||
if (start_config == DETAIL_ALL) {
|
if (start_config == DETAIL_ALL) {
|
||||||
JsonArray opt = root.createNestedArray("option");
|
JsonArray opt = root.createNestedArray("option");
|
||||||
for (auto &option : obj->traits.get_options()) {
|
for (auto &option : obj->traits.get_options()) {
|
||||||
|
|
Loading…
Reference in a new issue