mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 06:33:51 +00: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:
		| @@ -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,8 +781,8 @@ 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); | ||||||
|  |  | ||||||
|     if (obj->get_traits().get_supports_tilt()) |     if (obj->get_traits().get_supports_tilt()) | ||||||
| @@ -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()) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user