mirror of
https://github.com/esphome/esphome.git
synced 2025-04-23 17:10:51 +02:00
Merge branch 'esphome:dev' into nvds-rtttl-241021
This commit is contained in:
commit
2b2cd1fb53
30 changed files with 118 additions and 58 deletions
.github
esphome
components
ble_rssi
bme68x_bsec2
esp32
host
image
libretiny
lvgl
mqtt
rp2040
rtttl
voice_assistant
wifi
core
mqtt.pytests/components
15
.github/PULL_REQUEST_TEMPLATE.md
vendored
15
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -7,11 +7,16 @@
|
|||
- [ ] Bugfix (non-breaking change which fixes an issue)
|
||||
- [ ] New feature (non-breaking change which adds functionality)
|
||||
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||
- [ ] Code quality improvements to existing code or addition of tests
|
||||
- [ ] Other
|
||||
|
||||
**Related issue or feature (if applicable):** fixes <link to issue>
|
||||
**Related issue or feature (if applicable):**
|
||||
|
||||
**Pull request in [esphome-docs](https://github.com/esphome/esphome-docs) with documentation (if applicable):** esphome/esphome-docs#<esphome-docs PR number goes here>
|
||||
- fixes <link to issue>
|
||||
|
||||
**Pull request in [esphome-docs](https://github.com/esphome/esphome-docs) with documentation (if applicable):**
|
||||
|
||||
- esphome/esphome-docs#<esphome-docs PR number goes here>
|
||||
|
||||
## Test Environment
|
||||
|
||||
|
@ -23,12 +28,6 @@
|
|||
- [ ] RTL87xx
|
||||
|
||||
## Example entry for `config.yaml`:
|
||||
<!--
|
||||
Supplying a configuration snippet, makes it easier for a maintainer to test
|
||||
your PR. Furthermore, for new integrations, it gives an impression of how
|
||||
the configuration would look like.
|
||||
Note: Remove this section if this PR does not have an example entry.
|
||||
-->
|
||||
|
||||
```yaml
|
||||
# Example config.yaml
|
||||
|
|
|
@ -45,7 +45,7 @@ CONFIG_SCHEMA = cv.All(
|
|||
cv.Optional(CONF_SERVICE_UUID): esp32_ble_tracker.bt_uuid,
|
||||
cv.Optional(CONF_IBEACON_MAJOR): cv.uint16_t,
|
||||
cv.Optional(CONF_IBEACON_MINOR): cv.uint16_t,
|
||||
cv.Optional(CONF_IBEACON_UUID): cv.uuid,
|
||||
cv.Optional(CONF_IBEACON_UUID): esp32_ble_tracker.bt_uuid,
|
||||
}
|
||||
)
|
||||
.extend(esp32_ble_tracker.ESP_BLE_DEVICE_SCHEMA)
|
||||
|
@ -79,7 +79,7 @@ async def to_code(config):
|
|||
cg.add(var.set_service_uuid128(uuid128))
|
||||
|
||||
if ibeacon_uuid := config.get(CONF_IBEACON_UUID):
|
||||
ibeacon_uuid = esp32_ble_tracker.as_hex_array(str(ibeacon_uuid))
|
||||
ibeacon_uuid = esp32_ble_tracker.as_reversed_hex_array(ibeacon_uuid)
|
||||
cg.add(var.set_ibeacon_uuid(ibeacon_uuid))
|
||||
|
||||
if (ibeacon_major := config.get(CONF_IBEACON_MAJOR)) is not None:
|
||||
|
|
|
@ -16,7 +16,7 @@ CODEOWNERS = ["@neffs", "@kbx81"]
|
|||
|
||||
DOMAIN = "bme68x_bsec2"
|
||||
|
||||
BSEC2_LIBRARY_VERSION = "v1.7.2502"
|
||||
BSEC2_LIBRARY_VERSION = "v1.8.2610"
|
||||
|
||||
CONF_ALGORITHM_OUTPUT = "algorithm_output"
|
||||
CONF_BME68X_BSEC2_ID = "bme68x_bsec2_id"
|
||||
|
|
|
@ -395,6 +395,13 @@ ARDUINO_FRAMEWORK_SCHEMA = cv.All(
|
|||
cv.Optional(CONF_VERSION, default="recommended"): cv.string_strict,
|
||||
cv.Optional(CONF_SOURCE): cv.string_strict,
|
||||
cv.Optional(CONF_PLATFORM_VERSION): _parse_platform_version,
|
||||
cv.Optional(CONF_ADVANCED, default={}): cv.Schema(
|
||||
{
|
||||
cv.Optional(
|
||||
CONF_IGNORE_EFUSE_CUSTOM_MAC, default=False
|
||||
): cv.boolean,
|
||||
}
|
||||
),
|
||||
}
|
||||
),
|
||||
_arduino_check_versions,
|
||||
|
@ -494,6 +501,9 @@ async def to_code(config):
|
|||
conf = config[CONF_FRAMEWORK]
|
||||
cg.add_platformio_option("platform", conf[CONF_PLATFORM_VERSION])
|
||||
|
||||
if CONF_ADVANCED in conf and conf[CONF_ADVANCED][CONF_IGNORE_EFUSE_CUSTOM_MAC]:
|
||||
cg.add_define("USE_ESP32_IGNORE_EFUSE_CUSTOM_MAC")
|
||||
|
||||
add_extra_script(
|
||||
"post",
|
||||
"post_build.py",
|
||||
|
@ -540,8 +550,6 @@ async def to_code(config):
|
|||
for name, value in conf[CONF_SDKCONFIG_OPTIONS].items():
|
||||
add_idf_sdkconfig_option(name, RawSdkconfigValue(value))
|
||||
|
||||
if conf[CONF_ADVANCED][CONF_IGNORE_EFUSE_CUSTOM_MAC]:
|
||||
cg.add_define("USE_ESP32_IGNORE_EFUSE_CUSTOM_MAC")
|
||||
if conf[CONF_ADVANCED].get(CONF_IGNORE_EFUSE_MAC_CRC):
|
||||
add_idf_sdkconfig_option("CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR", True)
|
||||
if (framework_ver.major, framework_ver.minor) >= (4, 4):
|
||||
|
|
|
@ -16,7 +16,7 @@ from .const import KEY_HOST
|
|||
from .gpio import host_pin_to_code # noqa
|
||||
|
||||
CODEOWNERS = ["@esphome/core", "@clydebarrow"]
|
||||
AUTO_LOAD = ["network"]
|
||||
AUTO_LOAD = ["network", "preferences"]
|
||||
|
||||
|
||||
def set_core_data(config):
|
||||
|
|
|
@ -3,12 +3,7 @@
|
|||
#include "esphome/components/display/display.h"
|
||||
|
||||
#ifdef USE_LVGL
|
||||
// required for clang-tidy
|
||||
#ifndef LV_CONF_H
|
||||
#define LV_CONF_SKIP 1 // NOLINT
|
||||
#endif // LV_CONF_H
|
||||
|
||||
#include <lvgl.h>
|
||||
#include "esphome/components/lvgl/lvgl_proxy.h"
|
||||
#endif // USE_LVGL
|
||||
|
||||
namespace esphome {
|
||||
|
|
|
@ -46,7 +46,7 @@ from .const import (
|
|||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
CODEOWNERS = ["@kuba2k2"]
|
||||
AUTO_LOAD = []
|
||||
AUTO_LOAD = ["preferences"]
|
||||
|
||||
|
||||
def _detect_variant(value):
|
||||
|
|
|
@ -33,7 +33,7 @@ from .schemas import (
|
|||
FLEX_OBJ_SCHEMA,
|
||||
GRID_CELL_SCHEMA,
|
||||
LAYOUT_SCHEMAS,
|
||||
STATE_SCHEMA,
|
||||
STYLE_SCHEMA,
|
||||
WIDGET_TYPES,
|
||||
any_widget_schema,
|
||||
container_schema,
|
||||
|
@ -342,7 +342,7 @@ CONFIG_SCHEMA = (
|
|||
),
|
||||
cv.Optional(df.CONF_STYLE_DEFINITIONS): cv.ensure_list(
|
||||
cv.Schema({cv.Required(CONF_ID): cv.declare_id(lv_style_t)})
|
||||
.extend(STATE_SCHEMA)
|
||||
.extend(STYLE_SCHEMA)
|
||||
.extend(
|
||||
{
|
||||
cv.Optional(df.CONF_GRID_CELL_X_ALIGN): grid_alignments,
|
||||
|
|
|
@ -2,9 +2,9 @@ import esphome.codegen as cg
|
|||
from esphome.components import light
|
||||
from esphome.components.light import LightOutput
|
||||
import esphome.config_validation as cv
|
||||
from esphome.const import CONF_GAMMA_CORRECT, CONF_LED, CONF_OUTPUT_ID
|
||||
from esphome.const import CONF_GAMMA_CORRECT, CONF_OUTPUT_ID
|
||||
|
||||
from ..defines import CONF_LVGL_ID
|
||||
from ..defines import CONF_LVGL_ID, CONF_WIDGET
|
||||
from ..lvcode import LvContext
|
||||
from ..schemas import LVGL_SCHEMA
|
||||
from ..types import LvType, lvgl_ns
|
||||
|
@ -15,7 +15,7 @@ LVLight = lvgl_ns.class_("LVLight", LightOutput)
|
|||
CONFIG_SCHEMA = light.RGB_LIGHT_SCHEMA.extend(
|
||||
{
|
||||
cv.Optional(CONF_GAMMA_CORRECT, default=0.0): cv.positive_float,
|
||||
cv.Required(CONF_LED): cv.use_id(lv_led_t),
|
||||
cv.Required(CONF_WIDGET): cv.use_id(lv_led_t),
|
||||
cv.GenerateID(CONF_OUTPUT_ID): cv.declare_id(LVLight),
|
||||
}
|
||||
).extend(LVGL_SCHEMA)
|
||||
|
@ -26,7 +26,7 @@ async def to_code(config):
|
|||
await light.register_light(var, config)
|
||||
|
||||
paren = await cg.get_variable(config[CONF_LVGL_ID])
|
||||
widget = await get_widgets(config, CONF_LED)
|
||||
widget = await get_widgets(config, CONF_WIDGET)
|
||||
widget = widget[0]
|
||||
await wait_for_widgets()
|
||||
async with LvContext(paren) as ctx:
|
||||
|
|
|
@ -274,10 +274,8 @@ def size_validator(value):
|
|||
return ["SIZE_CONTENT", "number of pixels", "percentage"]
|
||||
if isinstance(value, str) and value.lower().endswith("px"):
|
||||
value = cv.int_(value[:-2])
|
||||
if isinstance(value, str) and not value.endswith("%"):
|
||||
if value.upper() == "SIZE_CONTENT":
|
||||
return "LV_SIZE_CONTENT"
|
||||
raise cv.Invalid("must be 'size_content', a percentage or an integer (pixels)")
|
||||
if isinstance(value, str) and value.upper() == "SIZE_CONTENT":
|
||||
return "LV_SIZE_CONTENT"
|
||||
return pixels_or_percent_validator(value)
|
||||
|
||||
|
||||
|
|
|
@ -84,6 +84,7 @@ lv_event_code_t lv_api_event; // NOLINT
|
|||
lv_event_code_t lv_update_event; // NOLINT
|
||||
void LvglComponent::dump_config() {
|
||||
ESP_LOGCONFIG(TAG, "LVGL:");
|
||||
ESP_LOGCONFIG(TAG, " Display width/height: %d x %d", this->disp_drv_.hor_res, this->disp_drv_.ver_res);
|
||||
ESP_LOGCONFIG(TAG, " Rotation: %d", this->rotation);
|
||||
ESP_LOGCONFIG(TAG, " Draw rounding: %d", (int) this->draw_rounding);
|
||||
}
|
||||
|
@ -145,7 +146,7 @@ void LvglComponent::draw_buffer_(const lv_area_t *area, lv_color_t *ptr) {
|
|||
lv_color_t *dst = this->rotate_buf_;
|
||||
switch (this->rotation) {
|
||||
case display::DISPLAY_ROTATION_90_DEGREES:
|
||||
for (lv_coord_t x = height - 1; x-- != 0;) {
|
||||
for (lv_coord_t x = height; x-- != 0;) {
|
||||
for (lv_coord_t y = 0; y != width; y++) {
|
||||
dst[y * height + x] = *ptr++;
|
||||
}
|
||||
|
@ -426,19 +427,8 @@ LvglComponent::LvglComponent(std::vector<display::Display *> displays, float buf
|
|||
this->disp_drv_.full_refresh = this->full_refresh_;
|
||||
this->disp_drv_.flush_cb = static_flush_cb;
|
||||
this->disp_drv_.rounder_cb = rounder_cb;
|
||||
// reset the display rotation since we will handle all rotations
|
||||
display->set_rotation(display::DISPLAY_ROTATION_0_DEGREES);
|
||||
switch (this->rotation) {
|
||||
default:
|
||||
this->disp_drv_.hor_res = (lv_coord_t) display->get_width();
|
||||
this->disp_drv_.ver_res = (lv_coord_t) display->get_height();
|
||||
break;
|
||||
case display::DISPLAY_ROTATION_90_DEGREES:
|
||||
case display::DISPLAY_ROTATION_270_DEGREES:
|
||||
this->disp_drv_.ver_res = (lv_coord_t) display->get_width();
|
||||
this->disp_drv_.hor_res = (lv_coord_t) display->get_height();
|
||||
break;
|
||||
}
|
||||
this->disp_drv_.hor_res = (lv_coord_t) display->get_width();
|
||||
this->disp_drv_.ver_res = (lv_coord_t) display->get_height();
|
||||
this->disp_ = lv_disp_drv_register(&this->disp_drv_);
|
||||
}
|
||||
|
||||
|
@ -459,6 +449,9 @@ void LvglComponent::setup() {
|
|||
esp_log_printf_(LVGL_LOG_LEVEL, TAG, 0, "%.*s", (int) strlen(buf) - 1, buf);
|
||||
});
|
||||
#endif
|
||||
// Rotation will be handled by our drawing function, so reset the display rotation.
|
||||
for (auto *display : this->displays_)
|
||||
display->set_rotation(display::DISPLAY_ROTATION_0_DEGREES);
|
||||
this->show_page(0, LV_SCR_LOAD_ANIM_NONE, 0);
|
||||
lv_disp_trig_activity(this->disp_);
|
||||
ESP_LOGCONFIG(TAG, "LVGL Setup complete");
|
||||
|
|
|
@ -4,6 +4,9 @@
|
|||
#ifdef USE_BINARY_SENSOR
|
||||
#include "esphome/components/binary_sensor/binary_sensor.h"
|
||||
#endif // USE_BINARY_SENSOR
|
||||
#ifdef USE_LVGL_IMAGE
|
||||
#include "esphome/components/image/image.h"
|
||||
#endif // USE_LVGL_IMAGE
|
||||
#ifdef USE_LVGL_ROTARY_ENCODER
|
||||
#include "esphome/components/rotary_encoder/rotary_encoder.h"
|
||||
#endif // USE_LVGL_ROTARY_ENCODER
|
||||
|
@ -47,6 +50,14 @@ static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BIT
|
|||
static const display::ColorBitness LV_BITNESS = display::ColorBitness::COLOR_BITNESS_332;
|
||||
#endif // LV_COLOR_DEPTH
|
||||
|
||||
#ifdef USE_LVGL_IMAGE
|
||||
// Shortcut / overload, so that the source of an image can easily be updated
|
||||
// from within a lambda.
|
||||
inline void lv_img_set_src(lv_obj_t *obj, esphome::image::Image *image) {
|
||||
lv_img_set_src(obj, image->get_lv_img_dsc());
|
||||
}
|
||||
#endif // USE_LVGL_IMAGE
|
||||
|
||||
// Parent class for things that wrap an LVGL object
|
||||
class LvCompound {
|
||||
public:
|
||||
|
|
17
esphome/components/lvgl/lvgl_proxy.h
Normal file
17
esphome/components/lvgl/lvgl_proxy.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
#pragma once
|
||||
/**
|
||||
* This header is for use in components that might or might not use LVGL. There is a platformio bug where
|
||||
the mere mention of a header file, even if ifdefed, causes the build to fail. This is a workaround, since if this
|
||||
file is included in the build, LVGL is always included.
|
||||
*/
|
||||
#ifdef USE_LVGL
|
||||
// required for clang-tidy
|
||||
#ifndef LV_CONF_H
|
||||
#define LV_CONF_SKIP 1 // NOLINT
|
||||
#endif // LV_CONF_H
|
||||
|
||||
#include <lvgl.h>
|
||||
namespace esphome {
|
||||
namespace lvgl {} // namespace lvgl
|
||||
} // namespace esphome
|
||||
#endif // USE_LVGL
|
|
@ -41,6 +41,7 @@ from esphome.const import (
|
|||
CONF_SHUTDOWN_MESSAGE,
|
||||
CONF_SSL_FINGERPRINTS,
|
||||
CONF_STATE_TOPIC,
|
||||
CONF_SUBSCRIBE_QOS,
|
||||
CONF_TOPIC,
|
||||
CONF_TOPIC_PREFIX,
|
||||
CONF_TRIGGER_ID,
|
||||
|
@ -518,6 +519,8 @@ async def register_mqtt_component(var, config):
|
|||
cg.add(var.set_qos(config[CONF_QOS]))
|
||||
if CONF_RETAIN in config:
|
||||
cg.add(var.set_retain(config[CONF_RETAIN]))
|
||||
if CONF_SUBSCRIBE_QOS in config:
|
||||
cg.add(var.set_subscribe_qos(config[CONF_SUBSCRIBE_QOS]))
|
||||
if not config.get(CONF_DISCOVERY, True):
|
||||
cg.add(var.disable_discovery())
|
||||
if CONF_STATE_TOPIC in config:
|
||||
|
|
|
@ -16,6 +16,8 @@ static const char *const TAG = "mqtt.component";
|
|||
|
||||
void MQTTComponent::set_qos(uint8_t qos) { this->qos_ = qos; }
|
||||
|
||||
void MQTTComponent::set_subscribe_qos(uint8_t qos) { this->subscribe_qos_ = qos; }
|
||||
|
||||
void MQTTComponent::set_retain(bool retain) { this->retain_ = retain; }
|
||||
|
||||
std::string MQTTComponent::get_discovery_topic_(const MQTTDiscoveryInfo &discovery_info) const {
|
||||
|
@ -76,6 +78,10 @@ bool MQTTComponent::send_discovery_() {
|
|||
config.command_topic = true;
|
||||
|
||||
this->send_discovery(root, config);
|
||||
// Set subscription QoS (default is 0)
|
||||
if (this->subscribe_qos_ != 0) {
|
||||
root[MQTT_QOS] = this->subscribe_qos_;
|
||||
}
|
||||
|
||||
// Fields from EntityBase
|
||||
if (this->get_entity()->has_own_name()) {
|
||||
|
|
|
@ -89,6 +89,9 @@ class MQTTComponent : public Component {
|
|||
void disable_discovery();
|
||||
bool is_discovery_enabled() const;
|
||||
|
||||
/// Set the QOS for subscribe messages (used in discovery).
|
||||
void set_subscribe_qos(uint8_t qos);
|
||||
|
||||
/// Override this method to return the component type (e.g. "light", "sensor", ...)
|
||||
virtual std::string component_type() const = 0;
|
||||
|
||||
|
@ -204,6 +207,7 @@ class MQTTComponent : public Component {
|
|||
bool command_retain_{false};
|
||||
bool retain_{true};
|
||||
uint8_t qos_{0};
|
||||
uint8_t subscribe_qos_{0};
|
||||
bool discovery_enabled_{true};
|
||||
bool resend_state_{false};
|
||||
};
|
||||
|
|
|
@ -180,6 +180,7 @@ constexpr const char *const MQTT_PRESET_MODE_COMMAND_TOPIC = "pr_mode_cmd_t";
|
|||
constexpr const char *const MQTT_PRESET_MODE_STATE_TOPIC = "pr_mode_stat_t";
|
||||
constexpr const char *const MQTT_PRESET_MODE_VALUE_TEMPLATE = "pr_mode_val_tpl";
|
||||
constexpr const char *const MQTT_PRESET_MODES = "pr_modes";
|
||||
constexpr const char *const MQTT_QOS = "qos";
|
||||
constexpr const char *const MQTT_RED_TEMPLATE = "r_tpl";
|
||||
constexpr const char *const MQTT_RETAIN = "ret";
|
||||
constexpr const char *const MQTT_RGB_COMMAND_TEMPLATE = "rgb_cmd_tpl";
|
||||
|
@ -441,6 +442,7 @@ constexpr const char *const MQTT_PRESET_MODE_COMMAND_TOPIC = "preset_mode_comman
|
|||
constexpr const char *const MQTT_PRESET_MODE_STATE_TOPIC = "preset_mode_state_topic";
|
||||
constexpr const char *const MQTT_PRESET_MODE_VALUE_TEMPLATE = "preset_mode_value_template";
|
||||
constexpr const char *const MQTT_PRESET_MODES = "preset_modes";
|
||||
constexpr const char *const MQTT_QOS = "qos";
|
||||
constexpr const char *const MQTT_RED_TEMPLATE = "red_template";
|
||||
constexpr const char *const MQTT_RETAIN = "retain";
|
||||
constexpr const char *const MQTT_RGB_COMMAND_TEMPLATE = "rgb_command_template";
|
||||
|
|
|
@ -26,7 +26,7 @@ from .gpio import rp2040_pin_to_code # noqa
|
|||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
CODEOWNERS = ["@jesserockz"]
|
||||
AUTO_LOAD = []
|
||||
AUTO_LOAD = ["preferences"]
|
||||
|
||||
|
||||
def set_core_data(config):
|
||||
|
|
|
@ -26,7 +26,10 @@ inline double deg2rad(double degrees) {
|
|||
return degrees * PI_ON_180;
|
||||
}
|
||||
|
||||
void Rtttl::dump_config() { ESP_LOGCONFIG(TAG, "Rtttl"); }
|
||||
void Rtttl::dump_config() {
|
||||
ESP_LOGCONFIG(TAG, "Rtttl:");
|
||||
ESP_LOGCONFIG(TAG, " Gain: %f", gain_);
|
||||
}
|
||||
|
||||
void Rtttl::play(std::string rtttl) {
|
||||
if (this->state_ != State::STATE_STOPPED && this->state_ != State::STATE_STOPPING) {
|
||||
|
|
|
@ -34,6 +34,7 @@ class Rtttl : public Component {
|
|||
#ifdef USE_SPEAKER
|
||||
void set_speaker(speaker::Speaker *speaker) { this->speaker_ = speaker; }
|
||||
#endif
|
||||
float get_gain() { return gain_; }
|
||||
void set_gain(float gain) {
|
||||
if (gain < 0.1f)
|
||||
gain = 0.1f;
|
||||
|
|
|
@ -23,6 +23,8 @@ static const size_t SEND_BUFFER_SIZE = INPUT_BUFFER_SIZE * sizeof(int16_t);
|
|||
static const size_t RECEIVE_SIZE = 1024;
|
||||
static const size_t SPEAKER_BUFFER_SIZE = 16 * RECEIVE_SIZE;
|
||||
|
||||
VoiceAssistant::VoiceAssistant() { global_voice_assistant = this; }
|
||||
|
||||
float VoiceAssistant::get_setup_priority() const { return setup_priority::AFTER_CONNECTION; }
|
||||
|
||||
bool VoiceAssistant::start_udp_socket_() {
|
||||
|
@ -68,12 +70,6 @@ bool VoiceAssistant::start_udp_socket_() {
|
|||
return true;
|
||||
}
|
||||
|
||||
void VoiceAssistant::setup() {
|
||||
ESP_LOGCONFIG(TAG, "Setting up Voice Assistant...");
|
||||
|
||||
global_voice_assistant = this;
|
||||
}
|
||||
|
||||
bool VoiceAssistant::allocate_buffers_() {
|
||||
if (this->send_buffer_ != nullptr) {
|
||||
return true; // Already allocated
|
||||
|
|
|
@ -91,7 +91,8 @@ struct Configuration {
|
|||
|
||||
class VoiceAssistant : public Component {
|
||||
public:
|
||||
void setup() override;
|
||||
VoiceAssistant();
|
||||
|
||||
void loop() override;
|
||||
float get_setup_priority() const override;
|
||||
void start_streaming();
|
||||
|
|
|
@ -34,6 +34,11 @@ static esp_netif_t *s_ap_netif = nullptr; // NOLINT(cppcoreguidelines-avoid-non
|
|||
static bool s_sta_connecting = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
||||
|
||||
void WiFiComponent::wifi_pre_setup_() {
|
||||
uint8_t mac[6];
|
||||
if (has_custom_mac_address()) {
|
||||
get_mac_address_raw(mac);
|
||||
set_mac_address(mac);
|
||||
}
|
||||
auto f = std::bind(&WiFiComponent::wifi_event_callback_, this, std::placeholders::_1, std::placeholders::_2);
|
||||
WiFi.onEvent(f);
|
||||
WiFi.persistent(false);
|
||||
|
|
|
@ -40,6 +40,7 @@ from esphome.const import (
|
|||
CONF_SECOND,
|
||||
CONF_SETUP_PRIORITY,
|
||||
CONF_STATE_TOPIC,
|
||||
CONF_SUBSCRIBE_QOS,
|
||||
CONF_TOPIC,
|
||||
CONF_TYPE,
|
||||
CONF_TYPE_ID,
|
||||
|
@ -1893,9 +1894,10 @@ MQTT_COMPONENT_AVAILABILITY_SCHEMA = Schema(
|
|||
|
||||
MQTT_COMPONENT_SCHEMA = Schema(
|
||||
{
|
||||
Optional(CONF_QOS): All(requires_component("mqtt"), int_range(min=0, max=2)),
|
||||
Optional(CONF_QOS): All(requires_component("mqtt"), mqtt_qos),
|
||||
Optional(CONF_RETAIN): All(requires_component("mqtt"), boolean),
|
||||
Optional(CONF_DISCOVERY): All(requires_component("mqtt"), boolean),
|
||||
Optional(CONF_SUBSCRIBE_QOS): All(requires_component("mqtt"), mqtt_qos),
|
||||
Optional(CONF_STATE_TOPIC): All(requires_component("mqtt"), publish_topic),
|
||||
Optional(CONF_AVAILABILITY): All(
|
||||
requires_component("mqtt"), Any(None, MQTT_COMPONENT_AVAILABILITY_SCHEMA)
|
||||
|
|
|
@ -819,6 +819,7 @@ CONF_STOP = "stop"
|
|||
CONF_STOP_ACTION = "stop_action"
|
||||
CONF_STORE_BASELINE = "store_baseline"
|
||||
CONF_SUBNET = "subnet"
|
||||
CONF_SUBSCRIBE_QOS = "subscribe_qos"
|
||||
CONF_SUBSTITUTIONS = "substitutions"
|
||||
CONF_SUM = "sum"
|
||||
CONF_SUPPLEMENTAL_COOLING_ACTION = "supplemental_cooling_action"
|
||||
|
|
|
@ -318,6 +318,8 @@ async def add_includes(includes):
|
|||
async def _add_platformio_options(pio_options):
|
||||
# Add includes at the very end, so that they override everything
|
||||
for key, val in pio_options.items():
|
||||
if key == "build_flags" and not isinstance(val, list):
|
||||
val = [val]
|
||||
cg.add_platformio_option(key, val)
|
||||
|
||||
|
||||
|
|
|
@ -209,6 +209,12 @@ def show_logs(config, topic=None, username=None, password=None, client_id=None):
|
|||
elif CONF_MQTT in config:
|
||||
conf = config[CONF_MQTT]
|
||||
if CONF_LOG_TOPIC in conf:
|
||||
if config[CONF_MQTT][CONF_LOG_TOPIC] is None:
|
||||
_LOGGER.error("MQTT log topic set to null, can't start MQTT logs")
|
||||
return 1
|
||||
if CONF_TOPIC not in config[CONF_MQTT][CONF_LOG_TOPIC]:
|
||||
_LOGGER.error("MQTT log topic not available, can't start MQTT logs")
|
||||
return 1
|
||||
topic = config[CONF_MQTT][CONF_LOG_TOPIC][CONF_TOPIC]
|
||||
elif CONF_TOPIC_PREFIX in config[CONF_MQTT]:
|
||||
topic = f"{config[CONF_MQTT][CONF_TOPIC_PREFIX]}/debug"
|
||||
|
|
|
@ -93,7 +93,7 @@ light:
|
|||
- platform: lvgl
|
||||
name: LVGL LED
|
||||
id: lv_light
|
||||
led: lv_led
|
||||
widget: lv_led
|
||||
|
||||
binary_sensor:
|
||||
- platform: lvgl
|
||||
|
@ -127,6 +127,11 @@ binary_sensor:
|
|||
- platform: lvgl
|
||||
name: LVGL checkbox
|
||||
widget: checkbox_id
|
||||
on_state:
|
||||
then:
|
||||
- lvgl.image.update:
|
||||
id: lv_image
|
||||
src: !lambda if (x) return id(cat_image); else return id(dog_image);
|
||||
|
||||
wifi:
|
||||
ssid: SSID
|
||||
|
|
|
@ -419,9 +419,10 @@ lvgl:
|
|||
spin_time: 2s
|
||||
align: left_mid
|
||||
- image:
|
||||
id: lv_image
|
||||
src: cat_image
|
||||
align: top_left
|
||||
y: 50
|
||||
y: "50"
|
||||
- tileview:
|
||||
id: tileview_id
|
||||
scrollbar_mode: active
|
||||
|
@ -460,7 +461,7 @@ lvgl:
|
|||
bg_opa: transp
|
||||
knob:
|
||||
radius: 1
|
||||
width: 4
|
||||
width: "4"
|
||||
height: 10%
|
||||
bg_color: 0x000000
|
||||
width: 100%
|
||||
|
|
|
@ -227,6 +227,7 @@ datetime:
|
|||
type: date
|
||||
state_topic: some/topic/date
|
||||
qos: 2
|
||||
subscribe_qos: 2
|
||||
set_action:
|
||||
- logger.log: "set_value"
|
||||
on_value:
|
||||
|
|
Loading…
Add table
Reference in a new issue