mirror of
https://github.com/esphome/esphome.git
synced 2026-10-05 18:41:32 +00:00
Merge remote-tracking branch 'upstream/noinline-mark-matching-items-removed' into integration
This commit is contained in:
@@ -790,8 +790,15 @@ def _detect_variant(value):
|
|||||||
engineering_sample = value.get(CONF_ENGINEERING_SAMPLE)
|
engineering_sample = value.get(CONF_ENGINEERING_SAMPLE)
|
||||||
if engineering_sample is None:
|
if engineering_sample is None:
|
||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"No board specified for ESP32-P4. Defaulting to production silicon (rev3). "
|
"No board specified for ESP32-P4. Defaulting to production silicon (rev3).\n"
|
||||||
"If you have an early engineering sample (pre-rev3), set 'engineering_sample: true'."
|
"If you have an early engineering sample (pre-rev3), add this to your config:\n"
|
||||||
|
"\n"
|
||||||
|
" esp32:\n"
|
||||||
|
" engineering_sample: true\n"
|
||||||
|
"\n"
|
||||||
|
"To check your chip revision, look for 'chip revision: vX.Y' in the boot log.\n"
|
||||||
|
"Engineering samples will show a revision below v3.0.\n"
|
||||||
|
"The 'debug:' component also reports the revision (e.g. Revision: 100 = v1.0, 300 = v3.0)."
|
||||||
)
|
)
|
||||||
elif engineering_sample:
|
elif engineering_sample:
|
||||||
value[CONF_BOARD] = "esp32-p4-evboard"
|
value[CONF_BOARD] = "esp32-p4-evboard"
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import esphome.config_validation as cv
|
|||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
CONF_COLOR_ORDER,
|
CONF_COLOR_ORDER,
|
||||||
CONF_DIMENSIONS,
|
CONF_DIMENSIONS,
|
||||||
|
CONF_DISABLED,
|
||||||
CONF_ENABLE_PIN,
|
CONF_ENABLE_PIN,
|
||||||
CONF_ID,
|
CONF_ID,
|
||||||
CONF_INIT_SEQUENCE,
|
CONF_INIT_SEQUENCE,
|
||||||
@@ -88,14 +89,17 @@ COLOR_DEPTHS = {
|
|||||||
def model_schema(config):
|
def model_schema(config):
|
||||||
model = MODELS[config[CONF_MODEL].upper()]
|
model = MODELS[config[CONF_MODEL].upper()]
|
||||||
model.defaults[CONF_SWAP_XY] = cv.UNDEFINED
|
model.defaults[CONF_SWAP_XY] = cv.UNDEFINED
|
||||||
transform = cv.Schema(
|
transform = cv.Any(
|
||||||
{
|
cv.Schema(
|
||||||
cv.Required(CONF_MIRROR_X): cv.boolean,
|
{
|
||||||
cv.Required(CONF_MIRROR_Y): cv.boolean,
|
cv.Required(CONF_MIRROR_X): cv.boolean,
|
||||||
cv.Optional(CONF_SWAP_XY): cv.invalid(
|
cv.Required(CONF_MIRROR_Y): cv.boolean,
|
||||||
"Axis swapping not supported by DSI displays"
|
cv.Optional(CONF_SWAP_XY): cv.invalid(
|
||||||
),
|
"Axis swapping not supported by DSI displays"
|
||||||
}
|
),
|
||||||
|
}
|
||||||
|
),
|
||||||
|
cv.one_of(CONF_DISABLED, lower=True),
|
||||||
)
|
)
|
||||||
# CUSTOM model will need to provide a custom init sequence
|
# CUSTOM model will need to provide a custom init sequence
|
||||||
iseqconf = (
|
iseqconf = (
|
||||||
@@ -199,9 +203,9 @@ async def to_code(config):
|
|||||||
cg.add(var.set_vsync_pulse_width(config[CONF_VSYNC_PULSE_WIDTH]))
|
cg.add(var.set_vsync_pulse_width(config[CONF_VSYNC_PULSE_WIDTH]))
|
||||||
cg.add(var.set_vsync_back_porch(config[CONF_VSYNC_BACK_PORCH]))
|
cg.add(var.set_vsync_back_porch(config[CONF_VSYNC_BACK_PORCH]))
|
||||||
cg.add(var.set_vsync_front_porch(config[CONF_VSYNC_FRONT_PORCH]))
|
cg.add(var.set_vsync_front_porch(config[CONF_VSYNC_FRONT_PORCH]))
|
||||||
cg.add(var.set_pclk_frequency(int(config[CONF_PCLK_FREQUENCY] / 1e6)))
|
cg.add(var.set_pclk_frequency(config[CONF_PCLK_FREQUENCY] / 1.0e6))
|
||||||
cg.add(var.set_lanes(int(config[CONF_LANES])))
|
cg.add(var.set_lanes(int(config[CONF_LANES])))
|
||||||
cg.add(var.set_lane_bit_rate(int(config[CONF_LANE_BIT_RATE] / 1e6)))
|
cg.add(var.set_lane_bit_rate(config[CONF_LANE_BIT_RATE] / 1.0e6))
|
||||||
if reset_pin := config.get(CONF_RESET_PIN):
|
if reset_pin := config.get(CONF_RESET_PIN):
|
||||||
reset = await cg.gpio_pin_expression(reset_pin)
|
reset = await cg.gpio_pin_expression(reset_pin)
|
||||||
cg.add(var.set_reset_pin(reset))
|
cg.add(var.set_reset_pin(reset))
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ void MIPI_DSI::dump_config() {
|
|||||||
"\n Swap X/Y: %s"
|
"\n Swap X/Y: %s"
|
||||||
"\n Rotation: %d degrees"
|
"\n Rotation: %d degrees"
|
||||||
"\n DSI Lanes: %u"
|
"\n DSI Lanes: %u"
|
||||||
"\n Lane Bit Rate: %uMbps"
|
"\n Lane Bit Rate: %.0fMbps"
|
||||||
"\n HSync Pulse Width: %u"
|
"\n HSync Pulse Width: %u"
|
||||||
"\n HSync Back Porch: %u"
|
"\n HSync Back Porch: %u"
|
||||||
"\n HSync Front Porch: %u"
|
"\n HSync Front Porch: %u"
|
||||||
@@ -385,7 +385,7 @@ void MIPI_DSI::dump_config() {
|
|||||||
"\n Display Pixel Mode: %d bit"
|
"\n Display Pixel Mode: %d bit"
|
||||||
"\n Color Order: %s"
|
"\n Color Order: %s"
|
||||||
"\n Invert Colors: %s"
|
"\n Invert Colors: %s"
|
||||||
"\n Pixel Clock: %dMHz",
|
"\n Pixel Clock: %.1fMHz",
|
||||||
this->model_, this->width_, this->height_, YESNO(this->madctl_ & (MADCTL_XFLIP | MADCTL_MX)),
|
this->model_, this->width_, this->height_, YESNO(this->madctl_ & (MADCTL_XFLIP | MADCTL_MX)),
|
||||||
YESNO(this->madctl_ & (MADCTL_YFLIP | MADCTL_MY)), YESNO(this->madctl_ & MADCTL_MV), this->rotation_,
|
YESNO(this->madctl_ & (MADCTL_YFLIP | MADCTL_MY)), YESNO(this->madctl_ & MADCTL_MV), this->rotation_,
|
||||||
this->lanes_, this->lane_bit_rate_, this->hsync_pulse_width_, this->hsync_back_porch_,
|
this->lanes_, this->lane_bit_rate_, this->hsync_pulse_width_, this->hsync_back_porch_,
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class MIPI_DSI : public display::Display {
|
|||||||
|
|
||||||
void set_reset_pin(GPIOPin *reset_pin) { this->reset_pin_ = reset_pin; }
|
void set_reset_pin(GPIOPin *reset_pin) { this->reset_pin_ = reset_pin; }
|
||||||
void set_enable_pins(std::vector<GPIOPin *> enable_pins) { this->enable_pins_ = std::move(enable_pins); }
|
void set_enable_pins(std::vector<GPIOPin *> enable_pins) { this->enable_pins_ = std::move(enable_pins); }
|
||||||
void set_pclk_frequency(uint32_t pclk_frequency) { this->pclk_frequency_ = pclk_frequency; }
|
void set_pclk_frequency(float pclk_frequency) { this->pclk_frequency_ = pclk_frequency; }
|
||||||
int get_width_internal() override { return this->width_; }
|
int get_width_internal() override { return this->width_; }
|
||||||
int get_height_internal() override { return this->height_; }
|
int get_height_internal() override { return this->height_; }
|
||||||
void set_hsync_back_porch(uint16_t hsync_back_porch) { this->hsync_back_porch_ = hsync_back_porch; }
|
void set_hsync_back_porch(uint16_t hsync_back_porch) { this->hsync_back_porch_ = hsync_back_porch; }
|
||||||
@@ -58,7 +58,7 @@ class MIPI_DSI : public display::Display {
|
|||||||
void set_vsync_front_porch(uint16_t vsync_front_porch) { this->vsync_front_porch_ = vsync_front_porch; }
|
void set_vsync_front_porch(uint16_t vsync_front_porch) { this->vsync_front_porch_ = vsync_front_porch; }
|
||||||
void set_init_sequence(const std::vector<uint8_t> &init_sequence) { this->init_sequence_ = init_sequence; }
|
void set_init_sequence(const std::vector<uint8_t> &init_sequence) { this->init_sequence_ = init_sequence; }
|
||||||
void set_model(const char *model) { this->model_ = model; }
|
void set_model(const char *model) { this->model_ = model; }
|
||||||
void set_lane_bit_rate(uint16_t lane_bit_rate) { this->lane_bit_rate_ = lane_bit_rate; }
|
void set_lane_bit_rate(float lane_bit_rate) { this->lane_bit_rate_ = lane_bit_rate; }
|
||||||
void set_lanes(uint8_t lanes) { this->lanes_ = lanes; }
|
void set_lanes(uint8_t lanes) { this->lanes_ = lanes; }
|
||||||
void set_madctl(uint8_t madctl) { this->madctl_ = madctl; }
|
void set_madctl(uint8_t madctl) { this->madctl_ = madctl; }
|
||||||
|
|
||||||
@@ -95,9 +95,9 @@ class MIPI_DSI : public display::Display {
|
|||||||
uint16_t vsync_front_porch_ = 10;
|
uint16_t vsync_front_porch_ = 10;
|
||||||
const char *model_{"Unknown"};
|
const char *model_{"Unknown"};
|
||||||
std::vector<uint8_t> init_sequence_{};
|
std::vector<uint8_t> init_sequence_{};
|
||||||
uint16_t pclk_frequency_ = 16; // in MHz
|
float pclk_frequency_ = 16; // in MHz
|
||||||
uint16_t lane_bit_rate_{1500}; // in Mbps
|
float lane_bit_rate_{1500}; // in Mbps
|
||||||
uint8_t lanes_{2}; // 1, 2, 3 or 4 lanes
|
uint8_t lanes_{2}; // 1, 2, 3 or 4 lanes
|
||||||
|
|
||||||
bool invert_colors_{};
|
bool invert_colors_{};
|
||||||
display::ColorOrder color_mode_{display::COLOR_ORDER_BGR};
|
display::ColorOrder color_mode_{display::COLOR_ORDER_BGR};
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components import text_sensor
|
from esphome.components import text_sensor
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import CONF_HIDE_TIMESTAMP, ENTITY_CATEGORY_DIAGNOSTIC, ICON_NEW_BOX
|
from esphome.const import (
|
||||||
|
CONF_HIDE_HASH,
|
||||||
|
CONF_HIDE_TIMESTAMP,
|
||||||
|
ENTITY_CATEGORY_DIAGNOSTIC,
|
||||||
|
ICON_NEW_BOX,
|
||||||
|
)
|
||||||
|
|
||||||
version_ns = cg.esphome_ns.namespace("version")
|
version_ns = cg.esphome_ns.namespace("version")
|
||||||
VersionTextSensor = version_ns.class_(
|
VersionTextSensor = version_ns.class_(
|
||||||
@@ -16,6 +21,9 @@ CONFIG_SCHEMA = (
|
|||||||
.extend(
|
.extend(
|
||||||
{
|
{
|
||||||
cv.GenerateID(): cv.declare_id(VersionTextSensor),
|
cv.GenerateID(): cv.declare_id(VersionTextSensor),
|
||||||
|
# Hide the config hash suffix and restore the pre-2026.1
|
||||||
|
# version text format when set to true.
|
||||||
|
cv.Optional(CONF_HIDE_HASH, default=False): cv.boolean,
|
||||||
cv.Optional(CONF_HIDE_TIMESTAMP, default=False): cv.boolean,
|
cv.Optional(CONF_HIDE_TIMESTAMP, default=False): cv.boolean,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -26,4 +34,5 @@ CONFIG_SCHEMA = (
|
|||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
var = await text_sensor.new_text_sensor(config)
|
var = await text_sensor.new_text_sensor(config)
|
||||||
await cg.register_component(var, config)
|
await cg.register_component(var, config)
|
||||||
|
cg.add(var.set_hide_hash(config[CONF_HIDE_HASH]))
|
||||||
cg.add(var.set_hide_timestamp(config[CONF_HIDE_TIMESTAMP]))
|
cg.add(var.set_hide_timestamp(config[CONF_HIDE_TIMESTAMP]))
|
||||||
|
|||||||
@@ -1,37 +1,53 @@
|
|||||||
#include "version_text_sensor.h"
|
#include "version_text_sensor.h"
|
||||||
#include "esphome/core/application.h"
|
#include "esphome/core/application.h"
|
||||||
#include "esphome/core/build_info_data.h"
|
#include "esphome/core/build_info_data.h"
|
||||||
#include "esphome/core/log.h"
|
|
||||||
#include "esphome/core/version.h"
|
|
||||||
#include "esphome/core/helpers.h"
|
#include "esphome/core/helpers.h"
|
||||||
|
#include "esphome/core/log.h"
|
||||||
#include "esphome/core/progmem.h"
|
#include "esphome/core/progmem.h"
|
||||||
|
#include "esphome/core/version.h"
|
||||||
|
|
||||||
namespace esphome::version {
|
namespace esphome::version {
|
||||||
|
|
||||||
static const char *const TAG = "version.text_sensor";
|
static const char *const TAG = "version.text_sensor";
|
||||||
|
|
||||||
void VersionTextSensor::setup() {
|
void VersionTextSensor::setup() {
|
||||||
static const char PREFIX[] PROGMEM = ESPHOME_VERSION " (config hash 0x";
|
static const char HASH_PREFIX[] PROGMEM = ESPHOME_VERSION " (config hash 0x";
|
||||||
|
static const char VERSION_PREFIX[] PROGMEM = ESPHOME_VERSION;
|
||||||
static const char BUILT_STR[] PROGMEM = ", built ";
|
static const char BUILT_STR[] PROGMEM = ", built ";
|
||||||
// Buffer size: PREFIX + 8 hex chars + BUILT_STR + BUILD_TIME_STR_SIZE + ")" + null
|
|
||||||
constexpr size_t buf_size = sizeof(PREFIX) + 8 + sizeof(BUILT_STR) + esphome::Application::BUILD_TIME_STR_SIZE + 2;
|
// Buffer size: HASH_PREFIX + 8 hex chars + BUILT_STR + BUILD_TIME_STR_SIZE + ")" + null
|
||||||
|
constexpr size_t buf_size =
|
||||||
|
sizeof(HASH_PREFIX) + 8 + sizeof(BUILT_STR) + esphome::Application::BUILD_TIME_STR_SIZE + 2;
|
||||||
char version_str[buf_size];
|
char version_str[buf_size];
|
||||||
|
|
||||||
ESPHOME_strncpy_P(version_str, PREFIX, sizeof(version_str));
|
// hide_hash restores the pre-2026.1 base format by omitting
|
||||||
|
// the " (config hash 0x...)" suffix entirely.
|
||||||
|
if (this->hide_hash_) {
|
||||||
|
ESPHOME_strncpy_P(version_str, VERSION_PREFIX, sizeof(version_str));
|
||||||
|
} else {
|
||||||
|
ESPHOME_strncpy_P(version_str, HASH_PREFIX, sizeof(version_str));
|
||||||
|
|
||||||
size_t len = strlen(version_str);
|
size_t len = strlen(version_str);
|
||||||
snprintf(version_str + len, sizeof(version_str) - len, "%08" PRIx32, App.get_config_hash());
|
snprintf(version_str + len, sizeof(version_str) - len, "%08" PRIx32, App.get_config_hash());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep hide_timestamp behavior independent from hide_hash so all
|
||||||
|
// combinations remain available to users.
|
||||||
if (!this->hide_timestamp_) {
|
if (!this->hide_timestamp_) {
|
||||||
size_t len = strlen(version_str);
|
size_t len = strlen(version_str);
|
||||||
ESPHOME_strncat_P(version_str, BUILT_STR, sizeof(version_str) - len - 1);
|
ESPHOME_strncat_P(version_str, BUILT_STR, sizeof(version_str) - len - 1);
|
||||||
ESPHOME_strncat_P(version_str, ESPHOME_BUILD_TIME_STR, sizeof(version_str) - strlen(version_str) - 1);
|
ESPHOME_strncat_P(version_str, ESPHOME_BUILD_TIME_STR, sizeof(version_str) - strlen(version_str) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
strncat(version_str, ")", sizeof(version_str) - strlen(version_str) - 1);
|
// The closing parenthesis is part of the config-hash suffix and must
|
||||||
|
// only be appended when that suffix is present.
|
||||||
|
if (!this->hide_hash_) {
|
||||||
|
strncat(version_str, ")", sizeof(version_str) - strlen(version_str) - 1);
|
||||||
|
}
|
||||||
version_str[sizeof(version_str) - 1] = '\0';
|
version_str[sizeof(version_str) - 1] = '\0';
|
||||||
this->publish_state(version_str);
|
this->publish_state(version_str);
|
||||||
}
|
}
|
||||||
|
void VersionTextSensor::set_hide_hash(bool hide_hash) { this->hide_hash_ = hide_hash; }
|
||||||
void VersionTextSensor::set_hide_timestamp(bool hide_timestamp) { this->hide_timestamp_ = hide_timestamp; }
|
void VersionTextSensor::set_hide_timestamp(bool hide_timestamp) { this->hide_timestamp_ = hide_timestamp; }
|
||||||
void VersionTextSensor::dump_config() { LOG_TEXT_SENSOR("", "Version Text Sensor", this); }
|
void VersionTextSensor::dump_config() { LOG_TEXT_SENSOR("", "Version Text Sensor", this); }
|
||||||
|
|
||||||
|
|||||||
@@ -7,11 +7,13 @@ namespace esphome::version {
|
|||||||
|
|
||||||
class VersionTextSensor : public text_sensor::TextSensor, public Component {
|
class VersionTextSensor : public text_sensor::TextSensor, public Component {
|
||||||
public:
|
public:
|
||||||
|
void set_hide_hash(bool hide_hash);
|
||||||
void set_hide_timestamp(bool hide_timestamp);
|
void set_hide_timestamp(bool hide_timestamp);
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bool hide_hash_{false};
|
||||||
bool hide_timestamp_{false};
|
bool hide_timestamp_{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -463,6 +463,7 @@ CONF_HEAT_OVERRUN = "heat_overrun"
|
|||||||
CONF_HEATER = "heater"
|
CONF_HEATER = "heater"
|
||||||
CONF_HEIGHT = "height"
|
CONF_HEIGHT = "height"
|
||||||
CONF_HIDDEN = "hidden"
|
CONF_HIDDEN = "hidden"
|
||||||
|
CONF_HIDE_HASH = "hide_hash"
|
||||||
CONF_HIDE_TIMESTAMP = "hide_timestamp"
|
CONF_HIDE_TIMESTAMP = "hide_timestamp"
|
||||||
CONF_HIGH = "high"
|
CONF_HIGH = "high"
|
||||||
CONF_HIGH_VOLTAGE_REFERENCE = "high_voltage_reference"
|
CONF_HIGH_VOLTAGE_REFERENCE = "high_voltage_reference"
|
||||||
|
|||||||
@@ -495,9 +495,9 @@ class Scheduler {
|
|||||||
// name_type determines matching: STATIC_STRING uses static_name, others use hash_or_id
|
// name_type determines matching: STATIC_STRING uses static_name, others use hash_or_id
|
||||||
// Returns the number of items marked for removal
|
// Returns the number of items marked for removal
|
||||||
// IMPORTANT: Must be called with scheduler lock held
|
// IMPORTANT: Must be called with scheduler lock held
|
||||||
size_t mark_matching_items_removed_locked_(std::vector<std::unique_ptr<SchedulerItem>> &container,
|
__attribute__((noinline)) size_t mark_matching_items_removed_locked_(
|
||||||
Component *component, NameType name_type, const char *static_name,
|
std::vector<std::unique_ptr<SchedulerItem>> &container, Component *component, NameType name_type,
|
||||||
uint32_t hash_or_id, SchedulerItem::Type type, bool match_retry) {
|
const char *static_name, uint32_t hash_or_id, SchedulerItem::Type type, bool match_retry) {
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
for (auto &item : container) {
|
for (auto &item : container) {
|
||||||
// Skip nullptr items (can happen in defer_queue_ when items are being processed)
|
// Skip nullptr items (can happen in defer_queue_ when items are being processed)
|
||||||
|
|||||||
@@ -22,6 +22,23 @@ display:
|
|||||||
id: p4_86
|
id: p4_86
|
||||||
model: "WAVESHARE-P4-86-PANEL"
|
model: "WAVESHARE-P4-86-PANEL"
|
||||||
rotation: 180
|
rotation: 180
|
||||||
|
- platform: mipi_dsi
|
||||||
|
model: custom
|
||||||
|
id: custom_id
|
||||||
|
dimensions:
|
||||||
|
width: 400
|
||||||
|
height: 1280
|
||||||
|
hsync_back_porch: 40
|
||||||
|
hsync_pulse_width: 30
|
||||||
|
hsync_front_porch: 40
|
||||||
|
vsync_back_porch: 20
|
||||||
|
vsync_pulse_width: 10
|
||||||
|
vsync_front_porch: 20
|
||||||
|
pclk_frequency: 48Mhz
|
||||||
|
lane_bit_rate: 1.2Gbps
|
||||||
|
rotation: 180
|
||||||
|
transform: disabled
|
||||||
|
init_sequence:
|
||||||
i2c:
|
i2c:
|
||||||
sda: GPIO7
|
sda: GPIO7
|
||||||
scl: GPIO8
|
scl: GPIO8
|
||||||
|
|||||||
@@ -123,7 +123,8 @@ def test_code_generation(
|
|||||||
in main_cpp
|
in main_cpp
|
||||||
)
|
)
|
||||||
assert "set_init_sequence({224, 1, 0, 225, 1, 147, 226, 1," in main_cpp
|
assert "set_init_sequence({224, 1, 0, 225, 1, 147, 226, 1," in main_cpp
|
||||||
assert "p4_nano->set_lane_bit_rate(1500);" in main_cpp
|
assert "p4_nano->set_lane_bit_rate(1500.0f);" in main_cpp
|
||||||
assert "p4_nano->set_rotation(display::DISPLAY_ROTATION_90_DEGREES);" in main_cpp
|
assert "p4_nano->set_rotation(display::DISPLAY_ROTATION_90_DEGREES);" in main_cpp
|
||||||
assert "p4_86->set_rotation(display::DISPLAY_ROTATION_0_DEGREES);" in main_cpp
|
assert "p4_86->set_rotation(display::DISPLAY_ROTATION_0_DEGREES);" in main_cpp
|
||||||
|
assert "custom_id->set_rotation(display::DISPLAY_ROTATION_180_DEGREES);" in main_cpp
|
||||||
# assert "backlight_id = new light::LightState(mipi_dsi_dsibacklight_id);" in main_cpp
|
# assert "backlight_id = new light::LightState(mipi_dsi_dsibacklight_id);" in main_cpp
|
||||||
|
|||||||
@@ -1,3 +1,16 @@
|
|||||||
text_sensor:
|
text_sensor:
|
||||||
- platform: version
|
- platform: version
|
||||||
name: "ESPHome Version"
|
name: "ESPHome Version Full"
|
||||||
|
|
||||||
|
- platform: version
|
||||||
|
name: "ESPHome Version No Timestamp"
|
||||||
|
hide_timestamp: true
|
||||||
|
|
||||||
|
- platform: version
|
||||||
|
name: "ESPHome Version No Hash"
|
||||||
|
hide_hash: true
|
||||||
|
|
||||||
|
- platform: version
|
||||||
|
name: "ESPHome Version Shortest"
|
||||||
|
hide_timestamp: true
|
||||||
|
hide_hash: true
|
||||||
|
|||||||
Reference in New Issue
Block a user