mirror of
https://github.com/esphome/esphome.git
synced 2025-11-01 23:51:47 +00:00
Compare commits
17 Commits
2022.1.0b1
...
2022.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
318b930e9f | ||
|
|
9296a078a7 | ||
|
|
5dc776e55f | ||
|
|
72d60f30f7 | ||
|
|
869743a742 | ||
|
|
7b03e07908 | ||
|
|
348f880e15 | ||
|
|
ead597d0fb | ||
|
|
afbf989715 | ||
|
|
01b62a16c3 | ||
|
|
c5eba04517 | ||
|
|
282313ab52 | ||
|
|
d274545e77 | ||
|
|
d3fda37615 | ||
|
|
cbe3092404 | ||
|
|
6dfe3039d0 | ||
|
|
d6009453df |
@@ -1,6 +1,7 @@
|
||||
#include "api_frame_helper.h"
|
||||
|
||||
#include "esphome/core/log.h"
|
||||
#include "esphome/core/hal.h"
|
||||
#include "esphome/core/helpers.h"
|
||||
#include "proto.h"
|
||||
#include <cstring>
|
||||
@@ -721,7 +722,12 @@ APIError APINoiseFrameHelper::shutdown(int how) {
|
||||
}
|
||||
extern "C" {
|
||||
// declare how noise generates random bytes (here with a good HWRNG based on the RF system)
|
||||
void noise_rand_bytes(void *output, size_t len) { esphome::random_bytes(reinterpret_cast<uint8_t *>(output), len); }
|
||||
void noise_rand_bytes(void *output, size_t len) {
|
||||
if (!esphome::random_bytes(reinterpret_cast<uint8_t *>(output), len)) {
|
||||
ESP_LOGE(TAG, "Failed to acquire random bytes, rebooting!");
|
||||
arch_restart();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // USE_API_NOISE
|
||||
|
||||
|
||||
@@ -74,8 +74,10 @@ class BinarySensor : public EntityBase {
|
||||
|
||||
// ========== OVERRIDE METHODS ==========
|
||||
// (You'll only need this when creating your own custom binary sensor)
|
||||
/// Get the default device class for this sensor, or empty string for no default.
|
||||
ESPDEPRECATED("device_class() is deprecated, set property during config validation instead.", "2022.01")
|
||||
/** Override this to set the default device class.
|
||||
*
|
||||
* @deprecated This method is deprecated, set the property during config validation instead. (2022.1)
|
||||
*/
|
||||
virtual std::string device_class();
|
||||
|
||||
protected:
|
||||
|
||||
@@ -169,7 +169,11 @@ class Cover : public EntityBase {
|
||||
friend CoverCall;
|
||||
|
||||
virtual void control(const CoverCall &call) = 0;
|
||||
ESPDEPRECATED("device_class() is deprecated, set property during config validation instead.", "2022.01")
|
||||
|
||||
/** Override this to set the default device class.
|
||||
*
|
||||
* @deprecated This method is deprecated, set the property during config validation instead. (2022.1)
|
||||
*/
|
||||
virtual std::string device_class();
|
||||
|
||||
optional<CoverRestoreState> restore_state_();
|
||||
|
||||
@@ -417,7 +417,7 @@ def copy_files():
|
||||
)
|
||||
|
||||
dir = os.path.dirname(__file__)
|
||||
post_build_file = os.path.join(dir, "post_build.py")
|
||||
post_build_file = os.path.join(dir, "post_build.py.script")
|
||||
copy_file_if_changed(
|
||||
post_build_file,
|
||||
CORE.relative_build_path("post_build.py"),
|
||||
|
||||
@@ -220,7 +220,7 @@ async def to_code(config):
|
||||
def copy_files():
|
||||
|
||||
dir = os.path.dirname(__file__)
|
||||
post_build_file = os.path.join(dir, "post_build.py")
|
||||
post_build_file = os.path.join(dir, "post_build.py.script")
|
||||
copy_file_if_changed(
|
||||
post_build_file,
|
||||
CORE.relative_build_path("post_build.py"),
|
||||
|
||||
@@ -18,6 +18,7 @@ from ..const import (
|
||||
CONF_FORCE_NEW_RANGE,
|
||||
CONF_MODBUS_CONTROLLER_ID,
|
||||
CONF_REGISTER_TYPE,
|
||||
CONF_SKIP_UPDATES,
|
||||
CONF_USE_WRITE_MULTIPLE,
|
||||
CONF_WRITE_LAMBDA,
|
||||
)
|
||||
@@ -53,6 +54,7 @@ async def to_code(config):
|
||||
config[CONF_ADDRESS],
|
||||
byte_offset,
|
||||
config[CONF_BITMASK],
|
||||
config[CONF_SKIP_UPDATES],
|
||||
config[CONF_FORCE_NEW_RANGE],
|
||||
)
|
||||
await cg.register_component(var, config)
|
||||
|
||||
@@ -10,14 +10,14 @@ namespace modbus_controller {
|
||||
class ModbusSwitch : public Component, public switch_::Switch, public SensorItem {
|
||||
public:
|
||||
ModbusSwitch(ModbusRegisterType register_type, uint16_t start_address, uint8_t offset, uint32_t bitmask,
|
||||
bool force_new_range)
|
||||
uint8_t skip_updates, bool force_new_range)
|
||||
: Component(), switch_::Switch() {
|
||||
this->register_type = register_type;
|
||||
this->start_address = start_address;
|
||||
this->offset = offset;
|
||||
this->bitmask = bitmask;
|
||||
this->sensor_value_type = SensorValueType::BIT;
|
||||
this->skip_updates = 0;
|
||||
this->skip_updates = skip_updates;
|
||||
this->register_count = 1;
|
||||
if (register_type == ModbusRegisterType::HOLDING || register_type == ModbusRegisterType::COIL) {
|
||||
this->start_address += offset;
|
||||
|
||||
@@ -150,20 +150,28 @@ class Sensor : public EntityBase {
|
||||
void internal_send_state_to_frontend(float state);
|
||||
|
||||
protected:
|
||||
/// Override this to set the default unit of measurement.
|
||||
ESPDEPRECATED("unit_of_measurement() is deprecated, set property during config validation instead.", "2022.01")
|
||||
/** Override this to set the default unit of measurement.
|
||||
*
|
||||
* @deprecated This method is deprecated, set the property during config validation instead. (2022.1)
|
||||
*/
|
||||
virtual std::string unit_of_measurement(); // NOLINT
|
||||
|
||||
/// Override this to set the default accuracy in decimals.
|
||||
ESPDEPRECATED("accuracy_decimals() is deprecated, set property during config validation instead.", "2022.01")
|
||||
/** Override this to set the default accuracy in decimals.
|
||||
*
|
||||
* @deprecated This method is deprecated, set the property during config validation instead. (2022.1)
|
||||
*/
|
||||
virtual int8_t accuracy_decimals(); // NOLINT
|
||||
|
||||
/// Override this to set the default device class.
|
||||
ESPDEPRECATED("device_class() is deprecated, set property during config validation instead.", "2022.01")
|
||||
/** Override this to set the default device class.
|
||||
*
|
||||
* @deprecated This method is deprecated, set the property during config validation instead. (2022.1)
|
||||
*/
|
||||
virtual std::string device_class(); // NOLINT
|
||||
|
||||
/// Override this to set the default state class.
|
||||
ESPDEPRECATED("state_class() is deprecated, set property during config validation instead.", "2022.01")
|
||||
/** Override this to set the default state class.
|
||||
*
|
||||
* @deprecated This method is deprecated, set the property during config validation instead. (2022.1)
|
||||
*/
|
||||
virtual StateClass state_class(); // NOLINT
|
||||
|
||||
uint32_t hash_base() override;
|
||||
|
||||
@@ -236,7 +236,18 @@ void WebServer::handle_index_request(AsyncWebServerRequest *request) {
|
||||
#ifdef USE_NUMBER
|
||||
for (auto *obj : App.get_numbers())
|
||||
if (this->include_internal_ || !obj->is_internal())
|
||||
write_row(stream, obj, "number", "");
|
||||
write_row(stream, obj, "number", "", [](AsyncResponseStream &stream, EntityBase *obj) {
|
||||
number::Number *number = (number::Number *) obj;
|
||||
stream.print(R"(<input type="number" min=")");
|
||||
stream.print(number->traits.get_min_value());
|
||||
stream.print(R"(" max=")");
|
||||
stream.print(number->traits.get_max_value());
|
||||
stream.print(R"(" step=")");
|
||||
stream.print(number->traits.get_step());
|
||||
stream.print(R"(" value=")");
|
||||
stream.print(number->state);
|
||||
stream.print(R"("/>)");
|
||||
});
|
||||
#endif
|
||||
|
||||
#ifdef USE_SELECT
|
||||
@@ -652,8 +663,29 @@ void WebServer::handle_number_request(AsyncWebServerRequest *request, const UrlM
|
||||
for (auto *obj : App.get_numbers()) {
|
||||
if (obj->get_object_id() != match.id)
|
||||
continue;
|
||||
std::string data = this->number_json(obj, obj->state);
|
||||
request->send(200, "text/json", data.c_str());
|
||||
|
||||
if (request->method() == HTTP_GET) {
|
||||
std::string data = this->number_json(obj, obj->state);
|
||||
request->send(200, "text/json", data.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (match.method != "set") {
|
||||
request->send(404);
|
||||
return;
|
||||
}
|
||||
|
||||
auto call = obj->make_call();
|
||||
|
||||
if (request->hasParam("value")) {
|
||||
String value = request->getParam("value")->value();
|
||||
optional<float> value_f = parse_number<float>(value.c_str());
|
||||
if (value_f.has_value())
|
||||
call.set_value(*value_f);
|
||||
}
|
||||
|
||||
this->defer([call]() mutable { call.perform(); });
|
||||
request->send(200);
|
||||
return;
|
||||
}
|
||||
request->send(404);
|
||||
@@ -661,9 +693,8 @@ void WebServer::handle_number_request(AsyncWebServerRequest *request, const UrlM
|
||||
std::string WebServer::number_json(number::Number *obj, float value) {
|
||||
return json::build_json([obj, value](JsonObject root) {
|
||||
root["id"] = "number-" + obj->get_object_id();
|
||||
char buffer[64];
|
||||
snprintf(buffer, sizeof(buffer), "%f", value);
|
||||
root["state"] = buffer;
|
||||
std::string state = str_sprintf("%f", value);
|
||||
root["state"] = state;
|
||||
root["value"] = value;
|
||||
});
|
||||
}
|
||||
@@ -769,7 +800,7 @@ bool WebServer::canHandle(AsyncWebServerRequest *request) {
|
||||
#endif
|
||||
|
||||
#ifdef USE_NUMBER
|
||||
if (request->method() == HTTP_GET && match.domain == "number")
|
||||
if ((request->method() == HTTP_POST || request->method() == HTTP_GET) && match.domain == "number")
|
||||
return true;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"""Constants used by esphome."""
|
||||
|
||||
__version__ = "2022.1.0b1"
|
||||
__version__ = "2022.1.0"
|
||||
|
||||
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
||||
|
||||
|
||||
@@ -287,13 +287,12 @@ uint32_t random_uint32() {
|
||||
#endif
|
||||
}
|
||||
float random_float() { return static_cast<float>(random_uint32()) / static_cast<float>(UINT32_MAX); }
|
||||
void random_bytes(uint8_t *data, size_t len) {
|
||||
bool random_bytes(uint8_t *data, size_t len) {
|
||||
#ifdef USE_ESP32
|
||||
esp_fill_random(data, len);
|
||||
return true;
|
||||
#elif defined(USE_ESP8266)
|
||||
if (os_get_random(data, len) != 0) {
|
||||
ESP_LOGE(TAG, "Failed to generate random bytes!");
|
||||
}
|
||||
return os_get_random(data, len) == 0;
|
||||
#else
|
||||
#error "No random source available for this configuration."
|
||||
#endif
|
||||
|
||||
@@ -311,7 +311,7 @@ uint32_t random_uint32();
|
||||
/// Return a random float between 0 and 1.
|
||||
float random_float();
|
||||
/// Generate \p len number of random bytes.
|
||||
void random_bytes(uint8_t *data, size_t len);
|
||||
bool random_bytes(uint8_t *data, size_t len);
|
||||
|
||||
///@}
|
||||
|
||||
|
||||
@@ -416,7 +416,7 @@ class DownloadBinaryRequestHandler(BaseHandler):
|
||||
if storage_json is None:
|
||||
self.send_error(404)
|
||||
return
|
||||
filename = f"{storage_json.name}.bin"
|
||||
filename = f"{storage_json.name}-factory.bin"
|
||||
path = storage_json.firmware_bin_path.replace(
|
||||
"firmware.bin", "firmware-factory.bin"
|
||||
)
|
||||
@@ -445,6 +445,7 @@ class DownloadBinaryRequestHandler(BaseHandler):
|
||||
|
||||
self.set_header("Content-Type", "application/octet-stream")
|
||||
self.set_header("Content-Disposition", f'attachment; filename="{filename}"')
|
||||
self.set_header("Cache-Control", "no-cache")
|
||||
if not Path(path).is_file():
|
||||
self.send_error(404)
|
||||
return
|
||||
|
||||
@@ -9,7 +9,7 @@ pyserial==3.5
|
||||
platformio==5.2.4 # When updating platformio, also update Dockerfile
|
||||
esptool==3.2
|
||||
click==8.0.3
|
||||
esphome-dashboard==20220113.1
|
||||
esphome-dashboard==20220116.0
|
||||
aioesphomeapi==10.6.0
|
||||
zeroconf==0.37.0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user