mirror of
https://github.com/esphome/esphome.git
synced 2025-09-26 07:02:21 +01:00
Merge remote-tracking branch 'upstream/dev' into integration
This commit is contained in:
@@ -769,7 +769,7 @@ message HomeassistantServiceMap {
|
|||||||
string value = 2 [(no_zero_copy) = true];
|
string value = 2 [(no_zero_copy) = true];
|
||||||
}
|
}
|
||||||
|
|
||||||
message HomeassistantServiceResponse {
|
message HomeassistantActionRequest {
|
||||||
option (id) = 35;
|
option (id) = 35;
|
||||||
option (source) = SOURCE_SERVER;
|
option (source) = SOURCE_SERVER;
|
||||||
option (no_delay) = true;
|
option (no_delay) = true;
|
||||||
|
@@ -10,8 +10,8 @@
|
|||||||
#include "esphome/core/component.h"
|
#include "esphome/core/component.h"
|
||||||
#include "esphome/core/entity_base.h"
|
#include "esphome/core/entity_base.h"
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace esphome::api {
|
namespace esphome::api {
|
||||||
|
|
||||||
@@ -132,10 +132,10 @@ class APIConnection final : public APIServerConnection {
|
|||||||
#endif
|
#endif
|
||||||
bool try_send_log_message(int level, const char *tag, const char *line, size_t message_len);
|
bool try_send_log_message(int level, const char *tag, const char *line, size_t message_len);
|
||||||
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
||||||
void send_homeassistant_service_call(const HomeassistantServiceResponse &call) {
|
void send_homeassistant_action(const HomeassistantActionRequest &call) {
|
||||||
if (!this->flags_.service_call_subscription)
|
if (!this->flags_.service_call_subscription)
|
||||||
return;
|
return;
|
||||||
this->send_message(call, HomeassistantServiceResponse::MESSAGE_TYPE);
|
this->send_message(call, HomeassistantActionRequest::MESSAGE_TYPE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_BLUETOOTH_PROXY
|
#ifdef USE_BLUETOOTH_PROXY
|
||||||
|
@@ -872,7 +872,7 @@ void HomeassistantServiceMap::calculate_size(ProtoSize &size) const {
|
|||||||
size.add_length(1, this->key_ref_.size());
|
size.add_length(1, this->key_ref_.size());
|
||||||
size.add_length(1, this->value.size());
|
size.add_length(1, this->value.size());
|
||||||
}
|
}
|
||||||
void HomeassistantServiceResponse::encode(ProtoWriteBuffer buffer) const {
|
void HomeassistantActionRequest::encode(ProtoWriteBuffer buffer) const {
|
||||||
buffer.encode_string(1, this->service_ref_);
|
buffer.encode_string(1, this->service_ref_);
|
||||||
for (auto &it : this->data) {
|
for (auto &it : this->data) {
|
||||||
buffer.encode_message(2, it, true);
|
buffer.encode_message(2, it, true);
|
||||||
@@ -885,7 +885,7 @@ void HomeassistantServiceResponse::encode(ProtoWriteBuffer buffer) const {
|
|||||||
}
|
}
|
||||||
buffer.encode_bool(5, this->is_event);
|
buffer.encode_bool(5, this->is_event);
|
||||||
}
|
}
|
||||||
void HomeassistantServiceResponse::calculate_size(ProtoSize &size) const {
|
void HomeassistantActionRequest::calculate_size(ProtoSize &size) const {
|
||||||
size.add_length(1, this->service_ref_.size());
|
size.add_length(1, this->service_ref_.size());
|
||||||
size.add_repeated_message(1, this->data);
|
size.add_repeated_message(1, this->data);
|
||||||
size.add_repeated_message(1, this->data_template);
|
size.add_repeated_message(1, this->data_template);
|
||||||
|
@@ -1100,12 +1100,12 @@ class HomeassistantServiceMap final : public ProtoMessage {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
};
|
};
|
||||||
class HomeassistantServiceResponse final : public ProtoMessage {
|
class HomeassistantActionRequest final : public ProtoMessage {
|
||||||
public:
|
public:
|
||||||
static constexpr uint8_t MESSAGE_TYPE = 35;
|
static constexpr uint8_t MESSAGE_TYPE = 35;
|
||||||
static constexpr uint8_t ESTIMATED_SIZE = 113;
|
static constexpr uint8_t ESTIMATED_SIZE = 113;
|
||||||
#ifdef HAS_PROTO_MESSAGE_DUMP
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
const char *message_name() const override { return "homeassistant_service_response"; }
|
const char *message_name() const override { return "homeassistant_action_request"; }
|
||||||
#endif
|
#endif
|
||||||
StringRef service_ref_{};
|
StringRef service_ref_{};
|
||||||
void set_service(const StringRef &ref) { this->service_ref_ = ref; }
|
void set_service(const StringRef &ref) { this->service_ref_ = ref; }
|
||||||
|
@@ -1101,8 +1101,8 @@ void HomeassistantServiceMap::dump_to(std::string &out) const {
|
|||||||
dump_field(out, "key", this->key_ref_);
|
dump_field(out, "key", this->key_ref_);
|
||||||
dump_field(out, "value", this->value);
|
dump_field(out, "value", this->value);
|
||||||
}
|
}
|
||||||
void HomeassistantServiceResponse::dump_to(std::string &out) const {
|
void HomeassistantActionRequest::dump_to(std::string &out) const {
|
||||||
MessageDumpHelper helper(out, "HomeassistantServiceResponse");
|
MessageDumpHelper helper(out, "HomeassistantActionRequest");
|
||||||
dump_field(out, "service", this->service_ref_);
|
dump_field(out, "service", this->service_ref_);
|
||||||
for (const auto &it : this->data) {
|
for (const auto &it : this->data) {
|
||||||
out.append(" data: ");
|
out.append(" data: ");
|
||||||
|
@@ -371,9 +371,9 @@ void APIServer::set_password(const std::string &password) { this->password_ = pa
|
|||||||
void APIServer::set_batch_delay(uint16_t batch_delay) { this->batch_delay_ = batch_delay; }
|
void APIServer::set_batch_delay(uint16_t batch_delay) { this->batch_delay_ = batch_delay; }
|
||||||
|
|
||||||
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
||||||
void APIServer::send_homeassistant_service_call(const HomeassistantServiceResponse &call) {
|
void APIServer::send_homeassistant_action(const HomeassistantActionRequest &call) {
|
||||||
for (auto &client : this->clients_) {
|
for (auto &client : this->clients_) {
|
||||||
client->send_homeassistant_service_call(call);
|
client->send_homeassistant_action(call);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -107,7 +107,8 @@ class APIServer : public Component, public Controller {
|
|||||||
void on_media_player_update(media_player::MediaPlayer *obj) override;
|
void on_media_player_update(media_player::MediaPlayer *obj) override;
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
||||||
void send_homeassistant_service_call(const HomeassistantServiceResponse &call);
|
void send_homeassistant_action(const HomeassistantActionRequest &call);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_API_SERVICES
|
#ifdef USE_API_SERVICES
|
||||||
void register_user_service(UserServiceDescriptor *descriptor) { this->user_services_.push_back(descriptor); }
|
void register_user_service(UserServiceDescriptor *descriptor) { this->user_services_.push_back(descriptor); }
|
||||||
|
@@ -179,9 +179,9 @@ class CustomAPIDevice {
|
|||||||
* @param service_name The service to call.
|
* @param service_name The service to call.
|
||||||
*/
|
*/
|
||||||
void call_homeassistant_service(const std::string &service_name) {
|
void call_homeassistant_service(const std::string &service_name) {
|
||||||
HomeassistantServiceResponse resp;
|
HomeassistantActionRequest resp;
|
||||||
resp.set_service(StringRef(service_name));
|
resp.set_service(StringRef(service_name));
|
||||||
global_api_server->send_homeassistant_service_call(resp);
|
global_api_server->send_homeassistant_action(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Call a Home Assistant service from ESPHome.
|
/** Call a Home Assistant service from ESPHome.
|
||||||
@@ -199,7 +199,7 @@ class CustomAPIDevice {
|
|||||||
* @param data The data for the service call, mapping from string to string.
|
* @param data The data for the service call, mapping from string to string.
|
||||||
*/
|
*/
|
||||||
void call_homeassistant_service(const std::string &service_name, const std::map<std::string, std::string> &data) {
|
void call_homeassistant_service(const std::string &service_name, const std::map<std::string, std::string> &data) {
|
||||||
HomeassistantServiceResponse resp;
|
HomeassistantActionRequest resp;
|
||||||
resp.set_service(StringRef(service_name));
|
resp.set_service(StringRef(service_name));
|
||||||
for (auto &it : data) {
|
for (auto &it : data) {
|
||||||
resp.data.emplace_back();
|
resp.data.emplace_back();
|
||||||
@@ -207,7 +207,7 @@ class CustomAPIDevice {
|
|||||||
kv.set_key(StringRef(it.first));
|
kv.set_key(StringRef(it.first));
|
||||||
kv.value = it.second;
|
kv.value = it.second;
|
||||||
}
|
}
|
||||||
global_api_server->send_homeassistant_service_call(resp);
|
global_api_server->send_homeassistant_action(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Fire an ESPHome event in Home Assistant.
|
/** Fire an ESPHome event in Home Assistant.
|
||||||
@@ -221,10 +221,10 @@ class CustomAPIDevice {
|
|||||||
* @param event_name The event to fire.
|
* @param event_name The event to fire.
|
||||||
*/
|
*/
|
||||||
void fire_homeassistant_event(const std::string &event_name) {
|
void fire_homeassistant_event(const std::string &event_name) {
|
||||||
HomeassistantServiceResponse resp;
|
HomeassistantActionRequest resp;
|
||||||
resp.set_service(StringRef(event_name));
|
resp.set_service(StringRef(event_name));
|
||||||
resp.is_event = true;
|
resp.is_event = true;
|
||||||
global_api_server->send_homeassistant_service_call(resp);
|
global_api_server->send_homeassistant_action(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Fire an ESPHome event in Home Assistant.
|
/** Fire an ESPHome event in Home Assistant.
|
||||||
@@ -241,7 +241,7 @@ class CustomAPIDevice {
|
|||||||
* @param data The data for the event, mapping from string to string.
|
* @param data The data for the event, mapping from string to string.
|
||||||
*/
|
*/
|
||||||
void fire_homeassistant_event(const std::string &service_name, const std::map<std::string, std::string> &data) {
|
void fire_homeassistant_event(const std::string &service_name, const std::map<std::string, std::string> &data) {
|
||||||
HomeassistantServiceResponse resp;
|
HomeassistantActionRequest resp;
|
||||||
resp.set_service(StringRef(service_name));
|
resp.set_service(StringRef(service_name));
|
||||||
resp.is_event = true;
|
resp.is_event = true;
|
||||||
for (auto &it : data) {
|
for (auto &it : data) {
|
||||||
@@ -250,7 +250,7 @@ class CustomAPIDevice {
|
|||||||
kv.set_key(StringRef(it.first));
|
kv.set_key(StringRef(it.first));
|
||||||
kv.value = it.second;
|
kv.value = it.second;
|
||||||
}
|
}
|
||||||
global_api_server->send_homeassistant_service_call(resp);
|
global_api_server->send_homeassistant_action(resp);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
template<typename T = void> void call_homeassistant_service(const std::string &service_name) {
|
template<typename T = void> void call_homeassistant_service(const std::string &service_name) {
|
||||||
|
@@ -3,10 +3,10 @@
|
|||||||
#include "api_server.h"
|
#include "api_server.h"
|
||||||
#ifdef USE_API
|
#ifdef USE_API
|
||||||
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
||||||
|
#include <vector>
|
||||||
#include "api_pb2.h"
|
#include "api_pb2.h"
|
||||||
#include "esphome/core/automation.h"
|
#include "esphome/core/automation.h"
|
||||||
#include "esphome/core/helpers.h"
|
#include "esphome/core/helpers.h"
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace esphome::api {
|
namespace esphome::api {
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ template<typename... Ts> class HomeAssistantServiceCallAction : public Action<Ts
|
|||||||
}
|
}
|
||||||
|
|
||||||
void play(Ts... x) override {
|
void play(Ts... x) override {
|
||||||
HomeassistantServiceResponse resp;
|
HomeassistantActionRequest resp;
|
||||||
std::string service_value = this->service_.value(x...);
|
std::string service_value = this->service_.value(x...);
|
||||||
resp.set_service(StringRef(service_value));
|
resp.set_service(StringRef(service_value));
|
||||||
resp.is_event = this->is_event_;
|
resp.is_event = this->is_event_;
|
||||||
@@ -84,7 +84,7 @@ template<typename... Ts> class HomeAssistantServiceCallAction : public Action<Ts
|
|||||||
kv.set_key(StringRef(it.key));
|
kv.set_key(StringRef(it.key));
|
||||||
kv.value = it.value.value(x...);
|
kv.value = it.value.value(x...);
|
||||||
}
|
}
|
||||||
this->parent_->send_homeassistant_service_call(resp);
|
this->parent_->send_homeassistant_action(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@@ -87,7 +87,7 @@ void HomeassistantNumber::control(float value) {
|
|||||||
static constexpr auto ENTITY_ID_KEY = StringRef::from_lit("entity_id");
|
static constexpr auto ENTITY_ID_KEY = StringRef::from_lit("entity_id");
|
||||||
static constexpr auto VALUE_KEY = StringRef::from_lit("value");
|
static constexpr auto VALUE_KEY = StringRef::from_lit("value");
|
||||||
|
|
||||||
api::HomeassistantServiceResponse resp;
|
api::HomeassistantActionRequest resp;
|
||||||
resp.set_service(SERVICE_NAME);
|
resp.set_service(SERVICE_NAME);
|
||||||
|
|
||||||
resp.data.emplace_back();
|
resp.data.emplace_back();
|
||||||
@@ -100,7 +100,7 @@ void HomeassistantNumber::control(float value) {
|
|||||||
entity_value.set_key(VALUE_KEY);
|
entity_value.set_key(VALUE_KEY);
|
||||||
entity_value.value = to_string(value);
|
entity_value.value = to_string(value);
|
||||||
|
|
||||||
api::global_api_server->send_homeassistant_service_call(resp);
|
api::global_api_server->send_homeassistant_action(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace homeassistant
|
} // namespace homeassistant
|
||||||
|
@@ -44,7 +44,7 @@ void HomeassistantSwitch::write_state(bool state) {
|
|||||||
static constexpr auto SERVICE_OFF = StringRef::from_lit("homeassistant.turn_off");
|
static constexpr auto SERVICE_OFF = StringRef::from_lit("homeassistant.turn_off");
|
||||||
static constexpr auto ENTITY_ID_KEY = StringRef::from_lit("entity_id");
|
static constexpr auto ENTITY_ID_KEY = StringRef::from_lit("entity_id");
|
||||||
|
|
||||||
api::HomeassistantServiceResponse resp;
|
api::HomeassistantActionRequest resp;
|
||||||
if (state) {
|
if (state) {
|
||||||
resp.set_service(SERVICE_ON);
|
resp.set_service(SERVICE_ON);
|
||||||
} else {
|
} else {
|
||||||
@@ -56,7 +56,7 @@ void HomeassistantSwitch::write_state(bool state) {
|
|||||||
entity_id_kv.set_key(ENTITY_ID_KEY);
|
entity_id_kv.set_key(ENTITY_ID_KEY);
|
||||||
entity_id_kv.value = this->entity_id_;
|
entity_id_kv.value = this->entity_id_;
|
||||||
|
|
||||||
api::global_api_server->send_homeassistant_service_call(resp);
|
api::global_api_server->send_homeassistant_action(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace homeassistant
|
} // namespace homeassistant
|
||||||
|
Reference in New Issue
Block a user