Services back to the Blueprint

Moving service calls back to the blueprint as latest HA requires user's permissions to call HA services from ESPHome.
This still have to be used for Alarm calls due to security concerns.
This commit is contained in:
Edward Firmo
2023-07-10 13:55:55 +02:00
parent 9c3ae7a4f5
commit 7104cbf0e9
2 changed files with 143 additions and 61 deletions

View File

@@ -900,6 +900,7 @@ text_sensor:
std::string value = doc["value"];
std::string entity = doc["entity"];
int embedded = doc["embedded"];
std::string service = "";
if (${verbose_log})
{
ESP_LOGD("text_sensor.localevent", "domain=%s", domain.c_str());
@@ -909,7 +910,7 @@ text_sensor:
ESP_LOGD("text_sensor.localevent", "embedded=%i", embedded);
}
id(is_embedded_thermostat_visible) = (domain == "climate" and embedded == 1);
if (id(is_embedded_thermostat_visible) and (not ${embedded_thermostat_disabled}))
if (id(is_embedded_thermostat_visible))
{
if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "Embedded thermostat is visible");
auto call = id(thermostat_embedded).make_call();
@@ -927,68 +928,77 @@ text_sensor:
}
else if (entity != "" and not entity.empty() and entity != "embedded_climate")
{
HomeassistantServiceResponse resp;
HomeassistantServiceMap resp_kv;
if (domain == "climate")
if (domain == "alarm_control_panel")
{
if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "HA controlled climate");
if (key == "set_temperature")
{
resp.service = "climate.set_temperature";
resp_kv.key = "temperature";
resp_kv.value = to_string(stof(value) / 10);
if (${verbose_log})
{
ESP_LOGD("text_sensor.localevent", "resp.service=%s", resp.service.c_str());
ESP_LOGD("text_sensor.localevent", "resp_kv.key=%s", resp_kv.key.c_str());
ESP_LOGD("text_sensor.localevent", "resp_kv.value=%s", resp_kv.value.c_str());
}
resp.data.push_back(resp_kv);
}
else if (key == "hvac_mode")
{
resp.service = "climate.set_hvac_mode";
resp_kv.key = "hvac_mode";
resp_kv.value = value;
resp.data.push_back(resp_kv);
}
}
else if (domain == "cover")
{
if (key == "position")
{
resp.service = "cover.set_cover_position";
resp_kv.key = key;
resp_kv.value = value;
resp.data.push_back(resp_kv);
}
else resp.service = std::string("cover.") + key.c_str();
}
else if (domain == "fan")
{
if (key == "stop")
{
resp.service = "fan.turn_off";
}
else
{
resp.service = "fan.turn_on";
resp_kv.key = key;
resp_kv.value = value;
resp.data.push_back(resp_kv);
}
}
else if (domain == "light")
{
resp.service = "light.turn_on";
resp_kv.key = key;
if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "ESPHome remote service call - Alarm control panel");
HomeassistantServiceResponse resp;
HomeassistantServiceMap resp_kv;
resp.service = "alarm_control_panel.XXXX"; // DEBUG
resp_kv.key = "entity_id";
resp_kv.value = entity;
resp.data.push_back(resp_kv);
resp_kv.key = "pin"; // DEBUG
resp_kv.value = value;
resp.data.push_back(resp_kv);
id(api_server).send_homeassistant_service_call(resp);
}
else
{
if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "Blueprint controlled service");
auto ha_event = new esphome::api::CustomAPIDevice();
if (domain == "climate")
{
if (key == "set_temperature")
{
service = "climate.set_temperature";
value = to_string(stof(value) / 10);
}
else if (key == "hvac_mode")
{
service = "climate.set_hvac_mode";
}
}
else if (domain == "cover")
{
if (key == "position")
{
service = "cover.set_cover_position";
}
else
{
service = std::string("cover.") + key.c_str();
key = "";
value = "";
}
}
else if (domain == "fan")
{
if (key == "stop")
{
service = "fan.turn_off";
key = "";
value = "";
}
else
{
service = "fan.turn_on";
}
}
else if (domain == "light")
{
service = "light.turn_on";
}
if (${verbose_log}) ESP_LOGD("text_sensor.localevent", "Service=%s", service.c_str());
if (service != "" and not service.empty())
ha_event->fire_homeassistant_event("esphome.nspanel_service_call",
{
{"service", service},
{"entity", entity},
{"key", key},
{"value", value}
});
}
resp_kv.key = "entity_id";
resp_kv.value = entity;
resp.data.push_back(resp_kv);
id(api_server).send_homeassistant_service_call(resp);
}
##### touchevent sensor, Reset the page timeout #####