1
0
mirror of https://github.com/esphome/esphome.git synced 2025-11-03 16:41:50 +00:00

Compare commits

...

8 Commits

Author SHA1 Message Date
Otto Winter
2ff2750628 Fix stack trace decode for latest platformio (#830) 2019-11-02 21:19:36 +01:00
Otto Winter
eae5c17b87 Bump version to v1.14.1 2019-11-02 21:00:05 +01:00
Otto Winter
a59cde91ad Add servo missing restore option to codegen (#829)
See also https://github.com/esphome/issues/issues/609
2019-11-02 20:59:56 +01:00
Otto Winter
1f243ae37e Remove PCF8574 input_pullup mode and cleanup (#828)
Fixes https://github.com/esphome/issues/issues/755
Closes https://github.com/esphome/esphome/pull/822
Fixes https://github.com/esphome/issues/issues/667
Closes https://github.com/esphome/esphome/pull/808

Co-Authored-By: Amish Vishwakarma <amishv@users.noreply.github.com>
Co-Authored-By: S-Przybylski <s-przybylski@users.noreply.github.com>
2019-11-02 20:59:56 +01:00
Otto Winter
603f82977e Fix update-all input in dashboard (#826)
Fixes https://github.com/esphome/issues/issues/798
2019-11-02 20:59:56 +01:00
Otto Winter
2d70422a6f Move native API enums to new namespace (#825)
Fixes https://github.com/esphome/issues/issues/801
2019-11-02 20:59:55 +01:00
Otto Winter
e2c8b21195 Fix wizard mkdir (#824)
* Fix CLI wizard mkdir_p with empty path

Fixes https://github.com/esphome/issues/issues/796

* Cleanup

* Lint
2019-11-02 20:59:55 +01:00
Alexander Leisentritt
7adaeacd0b refactored xiaomi ble data parsing (#823) 2019-11-02 20:59:55 +01:00
19 changed files with 243 additions and 191 deletions

View File

@@ -371,7 +371,8 @@ def command_update_all(args):
print("Updating {}".format(color('cyan', f)))
print('-' * twidth)
print()
rc = run_external_process('esphome', '--dashboard', f, 'run', '--no-logs')
rc = run_external_process('esphome', '--dashboard', f, 'run', '--no-logs', '--upload-port',
'OTA')
if rc == 0:
print_bar("[{}] {}".format(color('bold_green', 'SUCCESS'), f))
success[f] = True

View File

@@ -185,11 +185,12 @@ bool APIConnection::send_cover_state(cover::Cover *cover) {
auto traits = cover->get_traits();
CoverStateResponse resp{};
resp.key = cover->get_object_id_hash();
resp.legacy_state = (cover->position == cover::COVER_OPEN) ? LEGACY_COVER_STATE_OPEN : LEGACY_COVER_STATE_CLOSED;
resp.legacy_state =
(cover->position == cover::COVER_OPEN) ? enums::LEGACY_COVER_STATE_OPEN : enums::LEGACY_COVER_STATE_CLOSED;
resp.position = cover->position;
if (traits.get_supports_tilt())
resp.tilt = cover->tilt;
resp.current_operation = static_cast<EnumCoverOperation>(cover->current_operation);
resp.current_operation = static_cast<enums::CoverOperation>(cover->current_operation);
return this->send_cover_state_response(resp);
}
bool APIConnection::send_cover_info(cover::Cover *cover) {
@@ -213,13 +214,13 @@ void APIConnection::cover_command(const CoverCommandRequest &msg) {
auto call = cover->make_call();
if (msg.has_legacy_command) {
switch (msg.legacy_command) {
case LEGACY_COVER_COMMAND_OPEN:
case enums::LEGACY_COVER_COMMAND_OPEN:
call.set_command_open();
break;
case LEGACY_COVER_COMMAND_CLOSE:
case enums::LEGACY_COVER_COMMAND_CLOSE:
call.set_command_close();
break;
case LEGACY_COVER_COMMAND_STOP:
case enums::LEGACY_COVER_COMMAND_STOP:
call.set_command_stop();
break;
}
@@ -246,7 +247,7 @@ bool APIConnection::send_fan_state(fan::FanState *fan) {
if (traits.supports_oscillation())
resp.oscillating = fan->oscillating;
if (traits.supports_speed())
resp.speed = static_cast<EnumFanSpeed>(fan->speed);
resp.speed = static_cast<enums::FanSpeed>(fan->speed);
return this->send_fan_state_response(resp);
}
bool APIConnection::send_fan_info(fan::FanState *fan) {
@@ -441,8 +442,8 @@ bool APIConnection::send_climate_state(climate::Climate *climate) {
auto traits = climate->get_traits();
ClimateStateResponse resp{};
resp.key = climate->get_object_id_hash();
resp.mode = static_cast<EnumClimateMode>(climate->mode);
resp.action = static_cast<EnumClimateAction>(climate->action);
resp.mode = static_cast<enums::ClimateMode>(climate->mode);
resp.action = static_cast<enums::ClimateAction>(climate->action);
if (traits.get_supports_current_temperature())
resp.current_temperature = climate->current_temperature;
if (traits.get_supports_two_point_target_temperature()) {
@@ -467,7 +468,7 @@ bool APIConnection::send_climate_info(climate::Climate *climate) {
for (auto mode : {climate::CLIMATE_MODE_AUTO, climate::CLIMATE_MODE_OFF, climate::CLIMATE_MODE_COOL,
climate::CLIMATE_MODE_HEAT}) {
if (traits.supports_mode(mode))
msg.supported_modes.push_back(static_cast<EnumClimateMode>(mode));
msg.supported_modes.push_back(static_cast<enums::ClimateMode>(mode));
}
msg.visual_min_temperature = traits.get_visual_min_temperature();
msg.visual_max_temperature = traits.get_visual_max_temperature();

View File

@@ -4,115 +4,115 @@
namespace esphome {
namespace api {
template<> const char *proto_enum_to_string<EnumLegacyCoverState>(EnumLegacyCoverState value) {
template<> const char *proto_enum_to_string<enums::LegacyCoverState>(enums::LegacyCoverState value) {
switch (value) {
case LEGACY_COVER_STATE_OPEN:
case enums::LEGACY_COVER_STATE_OPEN:
return "LEGACY_COVER_STATE_OPEN";
case LEGACY_COVER_STATE_CLOSED:
case enums::LEGACY_COVER_STATE_CLOSED:
return "LEGACY_COVER_STATE_CLOSED";
default:
return "UNKNOWN";
}
}
template<> const char *proto_enum_to_string<EnumCoverOperation>(EnumCoverOperation value) {
template<> const char *proto_enum_to_string<enums::CoverOperation>(enums::CoverOperation value) {
switch (value) {
case COVER_OPERATION_IDLE:
case enums::COVER_OPERATION_IDLE:
return "COVER_OPERATION_IDLE";
case COVER_OPERATION_IS_OPENING:
case enums::COVER_OPERATION_IS_OPENING:
return "COVER_OPERATION_IS_OPENING";
case COVER_OPERATION_IS_CLOSING:
case enums::COVER_OPERATION_IS_CLOSING:
return "COVER_OPERATION_IS_CLOSING";
default:
return "UNKNOWN";
}
}
template<> const char *proto_enum_to_string<EnumLegacyCoverCommand>(EnumLegacyCoverCommand value) {
template<> const char *proto_enum_to_string<enums::LegacyCoverCommand>(enums::LegacyCoverCommand value) {
switch (value) {
case LEGACY_COVER_COMMAND_OPEN:
case enums::LEGACY_COVER_COMMAND_OPEN:
return "LEGACY_COVER_COMMAND_OPEN";
case LEGACY_COVER_COMMAND_CLOSE:
case enums::LEGACY_COVER_COMMAND_CLOSE:
return "LEGACY_COVER_COMMAND_CLOSE";
case LEGACY_COVER_COMMAND_STOP:
case enums::LEGACY_COVER_COMMAND_STOP:
return "LEGACY_COVER_COMMAND_STOP";
default:
return "UNKNOWN";
}
}
template<> const char *proto_enum_to_string<EnumFanSpeed>(EnumFanSpeed value) {
template<> const char *proto_enum_to_string<enums::FanSpeed>(enums::FanSpeed value) {
switch (value) {
case FAN_SPEED_LOW:
case enums::FAN_SPEED_LOW:
return "FAN_SPEED_LOW";
case FAN_SPEED_MEDIUM:
case enums::FAN_SPEED_MEDIUM:
return "FAN_SPEED_MEDIUM";
case FAN_SPEED_HIGH:
case enums::FAN_SPEED_HIGH:
return "FAN_SPEED_HIGH";
default:
return "UNKNOWN";
}
}
template<> const char *proto_enum_to_string<EnumLogLevel>(EnumLogLevel value) {
template<> const char *proto_enum_to_string<enums::LogLevel>(enums::LogLevel value) {
switch (value) {
case LOG_LEVEL_NONE:
case enums::LOG_LEVEL_NONE:
return "LOG_LEVEL_NONE";
case LOG_LEVEL_ERROR:
case enums::LOG_LEVEL_ERROR:
return "LOG_LEVEL_ERROR";
case LOG_LEVEL_WARN:
case enums::LOG_LEVEL_WARN:
return "LOG_LEVEL_WARN";
case LOG_LEVEL_INFO:
case enums::LOG_LEVEL_INFO:
return "LOG_LEVEL_INFO";
case LOG_LEVEL_DEBUG:
case enums::LOG_LEVEL_DEBUG:
return "LOG_LEVEL_DEBUG";
case LOG_LEVEL_VERBOSE:
case enums::LOG_LEVEL_VERBOSE:
return "LOG_LEVEL_VERBOSE";
case LOG_LEVEL_VERY_VERBOSE:
case enums::LOG_LEVEL_VERY_VERBOSE:
return "LOG_LEVEL_VERY_VERBOSE";
default:
return "UNKNOWN";
}
}
template<> const char *proto_enum_to_string<EnumServiceArgType>(EnumServiceArgType value) {
template<> const char *proto_enum_to_string<enums::ServiceArgType>(enums::ServiceArgType value) {
switch (value) {
case SERVICE_ARG_TYPE_BOOL:
case enums::SERVICE_ARG_TYPE_BOOL:
return "SERVICE_ARG_TYPE_BOOL";
case SERVICE_ARG_TYPE_INT:
case enums::SERVICE_ARG_TYPE_INT:
return "SERVICE_ARG_TYPE_INT";
case SERVICE_ARG_TYPE_FLOAT:
case enums::SERVICE_ARG_TYPE_FLOAT:
return "SERVICE_ARG_TYPE_FLOAT";
case SERVICE_ARG_TYPE_STRING:
case enums::SERVICE_ARG_TYPE_STRING:
return "SERVICE_ARG_TYPE_STRING";
case SERVICE_ARG_TYPE_BOOL_ARRAY:
case enums::SERVICE_ARG_TYPE_BOOL_ARRAY:
return "SERVICE_ARG_TYPE_BOOL_ARRAY";
case SERVICE_ARG_TYPE_INT_ARRAY:
case enums::SERVICE_ARG_TYPE_INT_ARRAY:
return "SERVICE_ARG_TYPE_INT_ARRAY";
case SERVICE_ARG_TYPE_FLOAT_ARRAY:
case enums::SERVICE_ARG_TYPE_FLOAT_ARRAY:
return "SERVICE_ARG_TYPE_FLOAT_ARRAY";
case SERVICE_ARG_TYPE_STRING_ARRAY:
case enums::SERVICE_ARG_TYPE_STRING_ARRAY:
return "SERVICE_ARG_TYPE_STRING_ARRAY";
default:
return "UNKNOWN";
}
}
template<> const char *proto_enum_to_string<EnumClimateMode>(EnumClimateMode value) {
template<> const char *proto_enum_to_string<enums::ClimateMode>(enums::ClimateMode value) {
switch (value) {
case CLIMATE_MODE_OFF:
case enums::CLIMATE_MODE_OFF:
return "CLIMATE_MODE_OFF";
case CLIMATE_MODE_AUTO:
case enums::CLIMATE_MODE_AUTO:
return "CLIMATE_MODE_AUTO";
case CLIMATE_MODE_COOL:
case enums::CLIMATE_MODE_COOL:
return "CLIMATE_MODE_COOL";
case CLIMATE_MODE_HEAT:
case enums::CLIMATE_MODE_HEAT:
return "CLIMATE_MODE_HEAT";
default:
return "UNKNOWN";
}
}
template<> const char *proto_enum_to_string<EnumClimateAction>(EnumClimateAction value) {
template<> const char *proto_enum_to_string<enums::ClimateAction>(enums::ClimateAction value) {
switch (value) {
case CLIMATE_ACTION_OFF:
case enums::CLIMATE_ACTION_OFF:
return "CLIMATE_ACTION_OFF";
case CLIMATE_ACTION_COOLING:
case enums::CLIMATE_ACTION_COOLING:
return "CLIMATE_ACTION_COOLING";
case CLIMATE_ACTION_HEATING:
case enums::CLIMATE_ACTION_HEATING:
return "CLIMATE_ACTION_HEATING";
default:
return "UNKNOWN";
@@ -535,11 +535,11 @@ void ListEntitiesCoverResponse::dump_to(std::string &out) const {
bool CoverStateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
switch (field_id) {
case 2: {
this->legacy_state = value.as_enum<EnumLegacyCoverState>();
this->legacy_state = value.as_enum<enums::LegacyCoverState>();
return true;
}
case 5: {
this->current_operation = value.as_enum<EnumCoverOperation>();
this->current_operation = value.as_enum<enums::CoverOperation>();
return true;
}
default:
@@ -566,10 +566,10 @@ bool CoverStateResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
}
void CoverStateResponse::encode(ProtoWriteBuffer buffer) const {
buffer.encode_fixed32(1, this->key);
buffer.encode_enum<EnumLegacyCoverState>(2, this->legacy_state);
buffer.encode_enum<enums::LegacyCoverState>(2, this->legacy_state);
buffer.encode_float(3, this->position);
buffer.encode_float(4, this->tilt);
buffer.encode_enum<EnumCoverOperation>(5, this->current_operation);
buffer.encode_enum<enums::CoverOperation>(5, this->current_operation);
}
void CoverStateResponse::dump_to(std::string &out) const {
char buffer[64];
@@ -580,7 +580,7 @@ void CoverStateResponse::dump_to(std::string &out) const {
out.append("\n");
out.append(" legacy_state: ");
out.append(proto_enum_to_string<EnumLegacyCoverState>(this->legacy_state));
out.append(proto_enum_to_string<enums::LegacyCoverState>(this->legacy_state));
out.append("\n");
out.append(" position: ");
@@ -594,7 +594,7 @@ void CoverStateResponse::dump_to(std::string &out) const {
out.append("\n");
out.append(" current_operation: ");
out.append(proto_enum_to_string<EnumCoverOperation>(this->current_operation));
out.append(proto_enum_to_string<enums::CoverOperation>(this->current_operation));
out.append("\n");
out.append("}");
}
@@ -605,7 +605,7 @@ bool CoverCommandRequest::decode_varint(uint32_t field_id, ProtoVarInt value) {
return true;
}
case 3: {
this->legacy_command = value.as_enum<EnumLegacyCoverCommand>();
this->legacy_command = value.as_enum<enums::LegacyCoverCommand>();
return true;
}
case 4: {
@@ -645,7 +645,7 @@ bool CoverCommandRequest::decode_32bit(uint32_t field_id, Proto32Bit value) {
void CoverCommandRequest::encode(ProtoWriteBuffer buffer) const {
buffer.encode_fixed32(1, this->key);
buffer.encode_bool(2, this->has_legacy_command);
buffer.encode_enum<EnumLegacyCoverCommand>(3, this->legacy_command);
buffer.encode_enum<enums::LegacyCoverCommand>(3, this->legacy_command);
buffer.encode_bool(4, this->has_position);
buffer.encode_float(5, this->position);
buffer.encode_bool(6, this->has_tilt);
@@ -665,7 +665,7 @@ void CoverCommandRequest::dump_to(std::string &out) const {
out.append("\n");
out.append(" legacy_command: ");
out.append(proto_enum_to_string<EnumLegacyCoverCommand>(this->legacy_command));
out.append(proto_enum_to_string<enums::LegacyCoverCommand>(this->legacy_command));
out.append("\n");
out.append(" has_position: ");
@@ -781,7 +781,7 @@ bool FanStateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
return true;
}
case 4: {
this->speed = value.as_enum<EnumFanSpeed>();
this->speed = value.as_enum<enums::FanSpeed>();
return true;
}
default:
@@ -802,7 +802,7 @@ void FanStateResponse::encode(ProtoWriteBuffer buffer) const {
buffer.encode_fixed32(1, this->key);
buffer.encode_bool(2, this->state);
buffer.encode_bool(3, this->oscillating);
buffer.encode_enum<EnumFanSpeed>(4, this->speed);
buffer.encode_enum<enums::FanSpeed>(4, this->speed);
}
void FanStateResponse::dump_to(std::string &out) const {
char buffer[64];
@@ -821,7 +821,7 @@ void FanStateResponse::dump_to(std::string &out) const {
out.append("\n");
out.append(" speed: ");
out.append(proto_enum_to_string<EnumFanSpeed>(this->speed));
out.append(proto_enum_to_string<enums::FanSpeed>(this->speed));
out.append("\n");
out.append("}");
}
@@ -840,7 +840,7 @@ bool FanCommandRequest::decode_varint(uint32_t field_id, ProtoVarInt value) {
return true;
}
case 5: {
this->speed = value.as_enum<EnumFanSpeed>();
this->speed = value.as_enum<enums::FanSpeed>();
return true;
}
case 6: {
@@ -870,7 +870,7 @@ void FanCommandRequest::encode(ProtoWriteBuffer buffer) const {
buffer.encode_bool(2, this->has_state);
buffer.encode_bool(3, this->state);
buffer.encode_bool(4, this->has_speed);
buffer.encode_enum<EnumFanSpeed>(5, this->speed);
buffer.encode_enum<enums::FanSpeed>(5, this->speed);
buffer.encode_bool(6, this->has_oscillating);
buffer.encode_bool(7, this->oscillating);
}
@@ -895,7 +895,7 @@ void FanCommandRequest::dump_to(std::string &out) const {
out.append("\n");
out.append(" speed: ");
out.append(proto_enum_to_string<EnumFanSpeed>(this->speed));
out.append(proto_enum_to_string<enums::FanSpeed>(this->speed));
out.append("\n");
out.append(" has_oscillating: ");
@@ -1740,7 +1740,7 @@ void TextSensorStateResponse::dump_to(std::string &out) const {
bool SubscribeLogsRequest::decode_varint(uint32_t field_id, ProtoVarInt value) {
switch (field_id) {
case 1: {
this->level = value.as_enum<EnumLogLevel>();
this->level = value.as_enum<enums::LogLevel>();
return true;
}
case 2: {
@@ -1752,14 +1752,14 @@ bool SubscribeLogsRequest::decode_varint(uint32_t field_id, ProtoVarInt value) {
}
}
void SubscribeLogsRequest::encode(ProtoWriteBuffer buffer) const {
buffer.encode_enum<EnumLogLevel>(1, this->level);
buffer.encode_enum<enums::LogLevel>(1, this->level);
buffer.encode_bool(2, this->dump_config);
}
void SubscribeLogsRequest::dump_to(std::string &out) const {
char buffer[64];
out.append("SubscribeLogsRequest {\n");
out.append(" level: ");
out.append(proto_enum_to_string<EnumLogLevel>(this->level));
out.append(proto_enum_to_string<enums::LogLevel>(this->level));
out.append("\n");
out.append(" dump_config: ");
@@ -1770,7 +1770,7 @@ void SubscribeLogsRequest::dump_to(std::string &out) const {
bool SubscribeLogsResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
switch (field_id) {
case 1: {
this->level = value.as_enum<EnumLogLevel>();
this->level = value.as_enum<enums::LogLevel>();
return true;
}
case 4: {
@@ -1796,7 +1796,7 @@ bool SubscribeLogsResponse::decode_length(uint32_t field_id, ProtoLengthDelimite
}
}
void SubscribeLogsResponse::encode(ProtoWriteBuffer buffer) const {
buffer.encode_enum<EnumLogLevel>(1, this->level);
buffer.encode_enum<enums::LogLevel>(1, this->level);
buffer.encode_string(2, this->tag);
buffer.encode_string(3, this->message);
buffer.encode_bool(4, this->send_failed);
@@ -1805,7 +1805,7 @@ void SubscribeLogsResponse::dump_to(std::string &out) const {
char buffer[64];
out.append("SubscribeLogsResponse {\n");
out.append(" level: ");
out.append(proto_enum_to_string<EnumLogLevel>(this->level));
out.append(proto_enum_to_string<enums::LogLevel>(this->level));
out.append("\n");
out.append(" tag: ");
@@ -2010,7 +2010,7 @@ void GetTimeResponse::dump_to(std::string &out) const {
bool ListEntitiesServicesArgument::decode_varint(uint32_t field_id, ProtoVarInt value) {
switch (field_id) {
case 2: {
this->type = value.as_enum<EnumServiceArgType>();
this->type = value.as_enum<enums::ServiceArgType>();
return true;
}
default:
@@ -2029,7 +2029,7 @@ bool ListEntitiesServicesArgument::decode_length(uint32_t field_id, ProtoLengthD
}
void ListEntitiesServicesArgument::encode(ProtoWriteBuffer buffer) const {
buffer.encode_string(1, this->name);
buffer.encode_enum<EnumServiceArgType>(2, this->type);
buffer.encode_enum<enums::ServiceArgType>(2, this->type);
}
void ListEntitiesServicesArgument::dump_to(std::string &out) const {
char buffer[64];
@@ -2039,7 +2039,7 @@ void ListEntitiesServicesArgument::dump_to(std::string &out) const {
out.append("\n");
out.append(" type: ");
out.append(proto_enum_to_string<EnumServiceArgType>(this->type));
out.append(proto_enum_to_string<enums::ServiceArgType>(this->type));
out.append("\n");
out.append("}");
}
@@ -2408,7 +2408,7 @@ bool ListEntitiesClimateResponse::decode_varint(uint32_t field_id, ProtoVarInt v
return true;
}
case 7: {
this->supported_modes.push_back(value.as_enum<EnumClimateMode>());
this->supported_modes.push_back(value.as_enum<enums::ClimateMode>());
return true;
}
case 11: {
@@ -2471,7 +2471,7 @@ void ListEntitiesClimateResponse::encode(ProtoWriteBuffer buffer) const {
buffer.encode_bool(5, this->supports_current_temperature);
buffer.encode_bool(6, this->supports_two_point_target_temperature);
for (auto &it : this->supported_modes) {
buffer.encode_enum<EnumClimateMode>(7, it, true);
buffer.encode_enum<enums::ClimateMode>(7, it, true);
}
buffer.encode_float(8, this->visual_min_temperature);
buffer.encode_float(9, this->visual_max_temperature);
@@ -2509,7 +2509,7 @@ void ListEntitiesClimateResponse::dump_to(std::string &out) const {
for (const auto &it : this->supported_modes) {
out.append(" supported_modes: ");
out.append(proto_enum_to_string<EnumClimateMode>(it));
out.append(proto_enum_to_string<enums::ClimateMode>(it));
out.append("\n");
}
@@ -2540,7 +2540,7 @@ void ListEntitiesClimateResponse::dump_to(std::string &out) const {
bool ClimateStateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
switch (field_id) {
case 2: {
this->mode = value.as_enum<EnumClimateMode>();
this->mode = value.as_enum<enums::ClimateMode>();
return true;
}
case 7: {
@@ -2548,7 +2548,7 @@ bool ClimateStateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
return true;
}
case 8: {
this->action = value.as_enum<EnumClimateAction>();
this->action = value.as_enum<enums::ClimateAction>();
return true;
}
default:
@@ -2583,13 +2583,13 @@ bool ClimateStateResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
}
void ClimateStateResponse::encode(ProtoWriteBuffer buffer) const {
buffer.encode_fixed32(1, this->key);
buffer.encode_enum<EnumClimateMode>(2, this->mode);
buffer.encode_enum<enums::ClimateMode>(2, this->mode);
buffer.encode_float(3, this->current_temperature);
buffer.encode_float(4, this->target_temperature);
buffer.encode_float(5, this->target_temperature_low);
buffer.encode_float(6, this->target_temperature_high);
buffer.encode_bool(7, this->away);
buffer.encode_enum<EnumClimateAction>(8, this->action);
buffer.encode_enum<enums::ClimateAction>(8, this->action);
}
void ClimateStateResponse::dump_to(std::string &out) const {
char buffer[64];
@@ -2600,7 +2600,7 @@ void ClimateStateResponse::dump_to(std::string &out) const {
out.append("\n");
out.append(" mode: ");
out.append(proto_enum_to_string<EnumClimateMode>(this->mode));
out.append(proto_enum_to_string<enums::ClimateMode>(this->mode));
out.append("\n");
out.append(" current_temperature: ");
@@ -2628,7 +2628,7 @@ void ClimateStateResponse::dump_to(std::string &out) const {
out.append("\n");
out.append(" action: ");
out.append(proto_enum_to_string<EnumClimateAction>(this->action));
out.append(proto_enum_to_string<enums::ClimateAction>(this->action));
out.append("\n");
out.append("}");
}
@@ -2639,7 +2639,7 @@ bool ClimateCommandRequest::decode_varint(uint32_t field_id, ProtoVarInt value)
return true;
}
case 3: {
this->mode = value.as_enum<EnumClimateMode>();
this->mode = value.as_enum<enums::ClimateMode>();
return true;
}
case 4: {
@@ -2691,7 +2691,7 @@ bool ClimateCommandRequest::decode_32bit(uint32_t field_id, Proto32Bit value) {
void ClimateCommandRequest::encode(ProtoWriteBuffer buffer) const {
buffer.encode_fixed32(1, this->key);
buffer.encode_bool(2, this->has_mode);
buffer.encode_enum<EnumClimateMode>(3, this->mode);
buffer.encode_enum<enums::ClimateMode>(3, this->mode);
buffer.encode_bool(4, this->has_target_temperature);
buffer.encode_float(5, this->target_temperature);
buffer.encode_bool(6, this->has_target_temperature_low);
@@ -2714,7 +2714,7 @@ void ClimateCommandRequest::dump_to(std::string &out) const {
out.append("\n");
out.append(" mode: ");
out.append(proto_enum_to_string<EnumClimateMode>(this->mode));
out.append(proto_enum_to_string<enums::ClimateMode>(this->mode));
out.append("\n");
out.append(" has_target_temperature: ");

View File

@@ -5,26 +5,28 @@
namespace esphome {
namespace api {
enum EnumLegacyCoverState : uint32_t {
namespace enums {
enum LegacyCoverState : uint32_t {
LEGACY_COVER_STATE_OPEN = 0,
LEGACY_COVER_STATE_CLOSED = 1,
};
enum EnumCoverOperation : uint32_t {
enum CoverOperation : uint32_t {
COVER_OPERATION_IDLE = 0,
COVER_OPERATION_IS_OPENING = 1,
COVER_OPERATION_IS_CLOSING = 2,
};
enum EnumLegacyCoverCommand : uint32_t {
enum LegacyCoverCommand : uint32_t {
LEGACY_COVER_COMMAND_OPEN = 0,
LEGACY_COVER_COMMAND_CLOSE = 1,
LEGACY_COVER_COMMAND_STOP = 2,
};
enum EnumFanSpeed : uint32_t {
enum FanSpeed : uint32_t {
FAN_SPEED_LOW = 0,
FAN_SPEED_MEDIUM = 1,
FAN_SPEED_HIGH = 2,
};
enum EnumLogLevel : uint32_t {
enum LogLevel : uint32_t {
LOG_LEVEL_NONE = 0,
LOG_LEVEL_ERROR = 1,
LOG_LEVEL_WARN = 2,
@@ -33,7 +35,7 @@ enum EnumLogLevel : uint32_t {
LOG_LEVEL_VERBOSE = 5,
LOG_LEVEL_VERY_VERBOSE = 6,
};
enum EnumServiceArgType : uint32_t {
enum ServiceArgType : uint32_t {
SERVICE_ARG_TYPE_BOOL = 0,
SERVICE_ARG_TYPE_INT = 1,
SERVICE_ARG_TYPE_FLOAT = 2,
@@ -43,17 +45,20 @@ enum EnumServiceArgType : uint32_t {
SERVICE_ARG_TYPE_FLOAT_ARRAY = 6,
SERVICE_ARG_TYPE_STRING_ARRAY = 7,
};
enum EnumClimateMode : uint32_t {
enum ClimateMode : uint32_t {
CLIMATE_MODE_OFF = 0,
CLIMATE_MODE_AUTO = 1,
CLIMATE_MODE_COOL = 2,
CLIMATE_MODE_HEAT = 3,
};
enum EnumClimateAction : uint32_t {
enum ClimateAction : uint32_t {
CLIMATE_ACTION_OFF = 0,
CLIMATE_ACTION_COOLING = 2,
CLIMATE_ACTION_HEATING = 3,
};
} // namespace enums
class HelloRequest : public ProtoMessage {
public:
std::string client_info{}; // NOLINT
@@ -213,10 +218,10 @@ class ListEntitiesCoverResponse : public ProtoMessage {
class CoverStateResponse : public ProtoMessage {
public:
uint32_t key{0}; // NOLINT
EnumLegacyCoverState legacy_state{}; // NOLINT
enums::LegacyCoverState legacy_state{}; // NOLINT
float position{0.0f}; // NOLINT
float tilt{0.0f}; // NOLINT
EnumCoverOperation current_operation{}; // NOLINT
enums::CoverOperation current_operation{}; // NOLINT
void encode(ProtoWriteBuffer buffer) const override;
void dump_to(std::string &out) const override;
@@ -228,7 +233,7 @@ class CoverCommandRequest : public ProtoMessage {
public:
uint32_t key{0}; // NOLINT
bool has_legacy_command{false}; // NOLINT
EnumLegacyCoverCommand legacy_command{}; // NOLINT
enums::LegacyCoverCommand legacy_command{}; // NOLINT
bool has_position{false}; // NOLINT
float position{0.0f}; // NOLINT
bool has_tilt{false}; // NOLINT
@@ -262,7 +267,7 @@ class FanStateResponse : public ProtoMessage {
uint32_t key{0}; // NOLINT
bool state{false}; // NOLINT
bool oscillating{false}; // NOLINT
EnumFanSpeed speed{}; // NOLINT
enums::FanSpeed speed{}; // NOLINT
void encode(ProtoWriteBuffer buffer) const override;
void dump_to(std::string &out) const override;
@@ -276,7 +281,7 @@ class FanCommandRequest : public ProtoMessage {
bool has_state{false}; // NOLINT
bool state{false}; // NOLINT
bool has_speed{false}; // NOLINT
EnumFanSpeed speed{}; // NOLINT
enums::FanSpeed speed{}; // NOLINT
bool has_oscillating{false}; // NOLINT
bool oscillating{false}; // NOLINT
void encode(ProtoWriteBuffer buffer) const override;
@@ -448,7 +453,7 @@ class TextSensorStateResponse : public ProtoMessage {
};
class SubscribeLogsRequest : public ProtoMessage {
public:
EnumLogLevel level{}; // NOLINT
enums::LogLevel level{}; // NOLINT
bool dump_config{false}; // NOLINT
void encode(ProtoWriteBuffer buffer) const override;
void dump_to(std::string &out) const override;
@@ -458,7 +463,7 @@ class SubscribeLogsRequest : public ProtoMessage {
};
class SubscribeLogsResponse : public ProtoMessage {
public:
EnumLogLevel level{}; // NOLINT
enums::LogLevel level{}; // NOLINT
std::string tag{}; // NOLINT
std::string message{}; // NOLINT
bool send_failed{false}; // NOLINT
@@ -545,7 +550,7 @@ class GetTimeResponse : public ProtoMessage {
class ListEntitiesServicesArgument : public ProtoMessage {
public:
std::string name{}; // NOLINT
EnumServiceArgType type{}; // NOLINT
enums::ServiceArgType type{}; // NOLINT
void encode(ProtoWriteBuffer buffer) const override;
void dump_to(std::string &out) const override;
@@ -639,7 +644,7 @@ class ListEntitiesClimateResponse : public ProtoMessage {
std::string unique_id{}; // NOLINT
bool supports_current_temperature{false}; // NOLINT
bool supports_two_point_target_temperature{false}; // NOLINT
std::vector<EnumClimateMode> supported_modes{}; // NOLINT
std::vector<enums::ClimateMode> supported_modes{}; // NOLINT
float visual_min_temperature{0.0f}; // NOLINT
float visual_max_temperature{0.0f}; // NOLINT
float visual_temperature_step{0.0f}; // NOLINT
@@ -656,13 +661,13 @@ class ListEntitiesClimateResponse : public ProtoMessage {
class ClimateStateResponse : public ProtoMessage {
public:
uint32_t key{0}; // NOLINT
EnumClimateMode mode{}; // NOLINT
enums::ClimateMode mode{}; // NOLINT
float current_temperature{0.0f}; // NOLINT
float target_temperature{0.0f}; // NOLINT
float target_temperature_low{0.0f}; // NOLINT
float target_temperature_high{0.0f}; // NOLINT
bool away{false}; // NOLINT
EnumClimateAction action{}; // NOLINT
enums::ClimateAction action{}; // NOLINT
void encode(ProtoWriteBuffer buffer) const override;
void dump_to(std::string &out) const override;
@@ -674,7 +679,7 @@ class ClimateCommandRequest : public ProtoMessage {
public:
uint32_t key{0}; // NOLINT
bool has_mode{false}; // NOLINT
EnumClimateMode mode{}; // NOLINT
enums::ClimateMode mode{}; // NOLINT
bool has_target_temperature{false}; // NOLINT
float target_temperature{0.0f}; // NOLINT
bool has_target_temperature_low{false}; // NOLINT

View File

@@ -25,14 +25,18 @@ template<> std::vector<std::string> get_execute_arg_value<std::vector<std::strin
return arg.string_array;
}
template<> EnumServiceArgType to_service_arg_type<bool>() { return SERVICE_ARG_TYPE_BOOL; }
template<> EnumServiceArgType to_service_arg_type<int>() { return SERVICE_ARG_TYPE_INT; }
template<> EnumServiceArgType to_service_arg_type<float>() { return SERVICE_ARG_TYPE_FLOAT; }
template<> EnumServiceArgType to_service_arg_type<std::string>() { return SERVICE_ARG_TYPE_STRING; }
template<> EnumServiceArgType to_service_arg_type<std::vector<bool>>() { return SERVICE_ARG_TYPE_BOOL_ARRAY; }
template<> EnumServiceArgType to_service_arg_type<std::vector<int>>() { return SERVICE_ARG_TYPE_INT_ARRAY; }
template<> EnumServiceArgType to_service_arg_type<std::vector<float>>() { return SERVICE_ARG_TYPE_FLOAT_ARRAY; }
template<> EnumServiceArgType to_service_arg_type<std::vector<std::string>>() { return SERVICE_ARG_TYPE_STRING_ARRAY; }
template<> enums::ServiceArgType to_service_arg_type<bool>() { return enums::SERVICE_ARG_TYPE_BOOL; }
template<> enums::ServiceArgType to_service_arg_type<int>() { return enums::SERVICE_ARG_TYPE_INT; }
template<> enums::ServiceArgType to_service_arg_type<float>() { return enums::SERVICE_ARG_TYPE_FLOAT; }
template<> enums::ServiceArgType to_service_arg_type<std::string>() { return enums::SERVICE_ARG_TYPE_STRING; }
template<> enums::ServiceArgType to_service_arg_type<std::vector<bool>>() { return enums::SERVICE_ARG_TYPE_BOOL_ARRAY; }
template<> enums::ServiceArgType to_service_arg_type<std::vector<int>>() { return enums::SERVICE_ARG_TYPE_INT_ARRAY; }
template<> enums::ServiceArgType to_service_arg_type<std::vector<float>>() {
return enums::SERVICE_ARG_TYPE_FLOAT_ARRAY;
}
template<> enums::ServiceArgType to_service_arg_type<std::vector<std::string>>() {
return enums::SERVICE_ARG_TYPE_STRING_ARRAY;
}
} // namespace api
} // namespace esphome

View File

@@ -16,7 +16,7 @@ class UserServiceDescriptor {
template<typename T> T get_execute_arg_value(const ExecuteServiceArgument &arg);
template<typename T> EnumServiceArgType to_service_arg_type();
template<typename T> enums::ServiceArgType to_service_arg_type();
template<typename... Ts> class UserServiceBase : public UserServiceDescriptor {
public:
@@ -29,7 +29,7 @@ template<typename... Ts> class UserServiceBase : public UserServiceDescriptor {
ListEntitiesServicesResponse msg;
msg.name = this->name_;
msg.key = this->key_;
std::array<EnumServiceArgType, sizeof...(Ts)> arg_types = {to_service_arg_type<Ts>()...};
std::array<enums::ServiceArgType, sizeof...(Ts)> arg_types = {to_service_arg_type<Ts>()...};
for (int i = 0; i < sizeof...(Ts); i++) {
ListEntitiesServicesArgument arg;
arg.type = arg_types[i];

View File

@@ -11,7 +11,6 @@ pcf8574_ns = cg.esphome_ns.namespace('pcf8574')
PCF8574GPIOMode = pcf8574_ns.enum('PCF8574GPIOMode')
PCF8674_GPIO_MODES = {
'INPUT': PCF8574GPIOMode.PCF8574_INPUT,
'INPUT_PULLUP': PCF8574GPIOMode.PCF8574_INPUT_PULLUP,
'OUTPUT': PCF8574GPIOMode.PCF8574_OUTPUT,
}
@@ -33,16 +32,24 @@ def to_code(config):
cg.add(var.set_pcf8575(config[CONF_PCF8575]))
def validate_pcf8574_gpio_mode(value):
value = cv.string(value)
if value.upper() == 'INPUT_PULLUP':
raise cv.Invalid("INPUT_PULLUP mode has been removed in 1.14 and been combined into "
"INPUT mode (they were the same thing). Please use INPUT instead.")
return cv.enum(PCF8674_GPIO_MODES, upper=True)(value)
PCF8574_OUTPUT_PIN_SCHEMA = cv.Schema({
cv.Required(CONF_PCF8574): cv.use_id(PCF8574Component),
cv.Required(CONF_NUMBER): cv.int_,
cv.Optional(CONF_MODE, default="OUTPUT"): cv.enum(PCF8674_GPIO_MODES, upper=True),
cv.Optional(CONF_MODE, default="OUTPUT"): validate_pcf8574_gpio_mode,
cv.Optional(CONF_INVERTED, default=False): cv.boolean,
})
PCF8574_INPUT_PIN_SCHEMA = cv.Schema({
cv.Required(CONF_PCF8574): cv.use_id(PCF8574Component),
cv.Required(CONF_NUMBER): cv.int_,
cv.Optional(CONF_MODE, default="INPUT"): cv.enum(PCF8674_GPIO_MODES, upper=True),
cv.Optional(CONF_MODE, default="INPUT"): validate_pcf8574_gpio_mode,
cv.Optional(CONF_INVERTED, default=False): cv.boolean,
})

View File

@@ -31,9 +31,9 @@ bool PCF8574Component::digital_read(uint8_t pin) {
}
void PCF8574Component::digital_write(uint8_t pin, bool value) {
if (value) {
this->port_mask_ |= (1 << pin);
this->output_mask_ |= (1 << pin);
} else {
this->port_mask_ &= ~(1 << pin);
this->output_mask_ &= ~(1 << pin);
}
this->write_gpio_();
@@ -41,16 +41,14 @@ void PCF8574Component::digital_write(uint8_t pin, bool value) {
void PCF8574Component::pin_mode(uint8_t pin, uint8_t mode) {
switch (mode) {
case PCF8574_INPUT:
this->ddr_mask_ &= ~(1 << pin);
this->port_mask_ &= ~(1 << pin);
break;
case PCF8574_INPUT_PULLUP:
this->ddr_mask_ &= ~(1 << pin);
this->port_mask_ |= (1 << pin);
// Clear mode mask bit
this->mode_mask_ &= ~(1 << pin);
// Write GPIO to enable input mode
this->write_gpio_();
break;
case PCF8574_OUTPUT:
this->ddr_mask_ |= (1 << pin);
this->port_mask_ &= ~(1 << pin);
// Set mode mask bit
this->mode_mask_ |= 1 << pin;
break;
default:
break;
@@ -59,21 +57,20 @@ void PCF8574Component::pin_mode(uint8_t pin, uint8_t mode) {
bool PCF8574Component::read_gpio_() {
if (this->is_failed())
return false;
bool success;
uint8_t data[2];
if (this->pcf8575_) {
if (!this->parent_->raw_receive_16(this->address_, &this->input_mask_, 1)) {
this->status_set_warning();
return false;
}
success = this->read_bytes_raw(data, 2);
this->input_mask_ = (uint16_t(data[1]) << 8) | (uint16_t(data[0]) << 0);
} else {
uint8_t data;
if (!this->parent_->raw_receive(this->address_, &data, 1)) {
this->status_set_warning();
return false;
}
this->input_mask_ = data;
success = this->read_bytes_raw(data, 1);
this->input_mask_ = data[0];
}
if (!success) {
this->status_set_warning();
return false;
}
this->status_clear_warning();
return true;
}
@@ -81,20 +78,20 @@ bool PCF8574Component::write_gpio_() {
if (this->is_failed())
return false;
uint16_t value = (this->input_mask_ & ~this->ddr_mask_) | this->port_mask_;
uint16_t value = 0;
// Pins in OUTPUT mode and where pin is HIGH.
value |= this->mode_mask_ & this->output_mask_;
// Pins in INPUT mode must also be set here
value |= ~this->mode_mask_;
this->parent_->raw_begin_transmission(this->address_);
uint8_t data = value & 0xFF;
this->parent_->raw_write(this->address_, &data, 1);
if (this->pcf8575_) {
data = (value >> 8) & 0xFF;
this->parent_->raw_write(this->address_, &data, 1);
}
if (!this->parent_->raw_end_transmission(this->address_)) {
uint8_t data[2];
data[0] = value;
data[1] = value >> 8;
if (!this->write_bytes_raw(data, this->pcf8575_ ? 2 : 1)) {
this->status_set_warning();
return false;
}
this->status_clear_warning();
return true;
}

View File

@@ -10,7 +10,6 @@ namespace pcf8574 {
/// Modes for PCF8574 pins
enum PCF8574GPIOMode : uint8_t {
PCF8574_INPUT = INPUT,
PCF8574_INPUT_PULLUP = INPUT_PULLUP,
PCF8574_OUTPUT = OUTPUT,
};
@@ -38,9 +37,12 @@ class PCF8574Component : public Component, public i2c::I2CDevice {
bool write_gpio_();
uint16_t ddr_mask_{0x00};
/// Mask for the pin mode - 1 means output, 0 means input
uint16_t mode_mask_{0x00};
/// The mask to write as output state - 1 means HIGH, 0 means LOW
uint16_t output_mask_{0x00};
/// The state read in read_gpio_ - 1 means HIGH, 0 means LOW
uint16_t input_mask_{0x00};
uint16_t port_mask_{0x00};
bool pcf8575_; ///< TRUE->16-channel PCF8575, FALSE->8-channel PCF8574
};

View File

@@ -4,7 +4,7 @@ from esphome import automation
from esphome.automation import maybe_simple_id
from esphome.components.output import FloatOutput
from esphome.const import CONF_ID, CONF_IDLE_LEVEL, CONF_MAX_LEVEL, CONF_MIN_LEVEL, CONF_OUTPUT, \
CONF_LEVEL
CONF_LEVEL, CONF_RESTORE
servo_ns = cg.esphome_ns.namespace('servo')
Servo = servo_ns.class_('Servo', cg.Component)
@@ -18,6 +18,7 @@ CONFIG_SCHEMA = cv.Schema({
cv.Optional(CONF_MIN_LEVEL, default='3%'): cv.percentage,
cv.Optional(CONF_IDLE_LEVEL, default='7.5%'): cv.percentage,
cv.Optional(CONF_MAX_LEVEL, default='12%'): cv.percentage,
cv.Optional(CONF_RESTORE, default=False): cv.boolean,
}).extend(cv.COMPONENT_SCHEMA)
@@ -30,6 +31,7 @@ def to_code(config):
cg.add(var.set_min_level(config[CONF_MIN_LEVEL]))
cg.add(var.set_idle_level(config[CONF_IDLE_LEVEL]))
cg.add(var.set_max_level(config[CONF_MAX_LEVEL]))
cg.add(var.set_restore(config[CONF_RESTORE]))
@automation.register_action('servo.write', ServoWriteAction, cv.Schema({

View File

@@ -47,6 +47,7 @@ class Servo : public Component {
void set_min_level(float min_level) { min_level_ = min_level; }
void set_idle_level(float idle_level) { idle_level_ = idle_level; }
void set_max_level(float max_level) { max_level_ = max_level; }
void set_restore(bool restore) { restore_ = restore; }
protected:
void save_level_(float v) { this->rtc_.save(&v); }

View File

@@ -91,17 +91,6 @@ optional<XiaomiParseResult> parse_xiaomi(const esp32_ble_tracker::ESPBTDevice &d
return {};
}
uint8_t raw_offset = is_lywsdcgq || is_cgg1 ? 11 : 12;
const uint8_t raw_type = raw[raw_offset];
const uint8_t data_length = raw[raw_offset + 2];
const uint8_t *data = &raw[raw_offset + 3];
const uint8_t expected_length = data_length + raw_offset + 3;
const uint8_t actual_length = device.get_service_data().size();
if (expected_length != actual_length) {
// ESP_LOGV(TAG, "Xiaomi %s data length mismatch (%u != %d)", type, expected_length, actual_length);
return {};
}
XiaomiParseResult result;
result.type = XiaomiParseResult::TYPE_HHCCJCY01;
if (is_lywsdcgq) {
@@ -111,7 +100,42 @@ optional<XiaomiParseResult> parse_xiaomi(const esp32_ble_tracker::ESPBTDevice &d
} else if (is_cgg1) {
result.type = XiaomiParseResult::TYPE_CGG1;
}
bool success = parse_xiaomi_data_byte(raw_type, data, data_length, result);
uint8_t raw_offset = is_lywsdcgq || is_cgg1 ? 11 : 12;
// Data point specs
// Byte 0: type
// Byte 1: fixed 0x10
// Byte 2: length
// Byte 3..3+len-1: data point value
const uint8_t *raw_data = &raw[raw_offset];
uint8_t data_offset = 0;
uint8_t data_length = device.get_service_data().size() - raw_offset;
bool success = false;
while (true) {
if (data_length < 4)
// at least 4 bytes required
// type, fixed 0x10, length, 1 byte value
break;
const uint8_t datapoint_type = raw_data[data_offset + 0];
const uint8_t datapoint_length = raw_data[data_offset + 2];
if (data_length < 3 + datapoint_length)
// 3 fixed bytes plus value length
break;
const uint8_t *datapoint_data = &raw_data[data_offset + 3];
if (parse_xiaomi_data_byte(datapoint_type, datapoint_data, datapoint_length, result))
success = true;
data_length -= data_offset + 3 + datapoint_length;
data_offset += 3 + datapoint_length;
}
if (!success)
return {};
return result;

View File

@@ -3,7 +3,7 @@
MAJOR_VERSION = 1
MINOR_VERSION = 14
PATCH_VERSION = '0'
PATCH_VERSION = '1'
__short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION)
__version__ = '{}.{}'.format(__short_version__, PATCH_VERSION)

View File

@@ -80,6 +80,9 @@ def run_system_command(*args):
def mkdir_p(path):
if not path:
# Empty path - means create current dir
return
try:
os.makedirs(path)
except OSError as err:

View File

@@ -101,12 +101,14 @@ def run_idedata(config):
args = ['-t', 'idedata']
stdout = run_platformio_cli_run(config, False, *args, capture_stdout=True)
stdout = decode_text(stdout)
match = re.search(r'{.*}', stdout)
match = re.search(r'{\s*".*}', stdout)
if match is None:
_LOGGER.debug("Could not match IDEData for %s", stdout)
return IDEData(None)
try:
return IDEData(json.loads(match.group()))
except ValueError:
_LOGGER.debug("Could not load IDEData for %s", stdout, exc_info=1)
return IDEData(None)
@@ -165,11 +167,13 @@ ESP8266_EXCEPTION_CODES = {
def _decode_pc(config, addr):
idedata = get_idedata(config)
if not idedata.addr2line_path or not idedata.firmware_elf_path:
_LOGGER.debug("decode_pc no addr2line")
return
command = [idedata.addr2line_path, '-pfiaC', '-e', idedata.firmware_elf_path, addr]
try:
translation = subprocess.check_output(command).strip()
translation = decode_text(subprocess.check_output(command)).strip()
except Exception: # pylint: disable=broad-except
_LOGGER.debug("Caught exception for command %s", command, exc_info=1)
return
if "?? ??:0" in translation:

View File

@@ -7,7 +7,7 @@ import os
from esphome import const
from esphome.core import CORE
from esphome.helpers import mkdir_p, write_file_if_changed
from esphome.helpers import write_file_if_changed
# pylint: disable=unused-import, wrong-import-order
from esphome.core import CoreType # noqa
@@ -88,7 +88,6 @@ class StorageJSON(object):
return json.dumps(self.as_dict(), indent=2) + u'\n'
def save(self, path):
mkdir_p(os.path.dirname(path))
write_file_if_changed(path, self.to_json())
@staticmethod

View File

@@ -286,8 +286,6 @@ or use the custom_components folder.
def copy_src_tree():
import shutil
source_files = {}
for _, component, _ in iter_components(CORE.config):
source_files.update(component.source_files)
@@ -326,8 +324,7 @@ def copy_src_tree():
# Now copy new files
for target, src_path in source_files_copy.items():
dst_path = CORE.relative_src_path(*target.split('/'))
mkdir_p(os.path.dirname(dst_path))
shutil.copy(src_path, dst_path)
copy_file_if_changed(src_path, dst_path)
# Finally copy defines
write_file_if_changed(CORE.relative_src_path('esphome', 'core', 'defines.h'),

View File

@@ -344,7 +344,7 @@ class UInt32Type(TypeInfo):
class EnumType(TypeInfo):
@property
def cpp_type(self):
return "Enum" + self._field.type_name[1:]
return f'enums::{self._field.type_name[1:]}'
@property
def decode_varint(self):
@@ -497,17 +497,17 @@ class RepeatedTypeInfo(TypeInfo):
def build_enum_type(desc):
name = "Enum" + desc.name
name = desc.name
out = f"enum {name} : uint32_t {{\n"
for v in desc.value:
out += f' {v.name} = {v.number},\n'
out += '};\n'
cpp = f"template<>\n"
cpp += f"const char *proto_enum_to_string<{name}>({name} value) {{\n"
cpp += f"const char *proto_enum_to_string<enums::{name}>(enums::{name} value) {{\n"
cpp += f" switch (value) {{\n"
for v in desc.value:
cpp += f' case {v.name}: return "{v.name}";\n'
cpp += f' case enums::{v.name}: return "{v.name}";\n'
cpp += f' default: return "UNKNOWN";\n'
cpp += f' }}\n'
cpp += f'}}\n'
@@ -636,11 +636,15 @@ namespace api {
'''
content += 'namespace enums {\n\n'
for enum in file.enum_type:
s, c = build_enum_type(enum)
content += s
cpp += c
content += '\n} // namespace enums\n\n'
mt = file.message_type
for m in mt:

View File

@@ -620,6 +620,7 @@ light:
servo:
id: my_servo
output: out
restore: true
ttp229_lsf: