1
0
mirror of https://github.com/esphome/esphome.git synced 2025-11-03 00:21:56 +00:00

Compare commits

...

18 Commits

Author SHA1 Message Date
Jesse Hills
0d800958aa Merge pull request #5474 from esphome/bump-2023.9.3
2023.9.3
2023-10-03 21:25:58 +13:00
Jesse Hills
471533d041 Bump version to 2023.9.3 2023-10-03 13:35:19 +13:00
Faidon Liambotis
7dfc4c74da Tuya Number: split "multiply" to a separate option (#5458) 2023-10-03 13:35:19 +13:00
dwildstr
f709350b04 Sleep mode fix for BP5758D driver (#5461)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
2023-10-03 13:35:19 +13:00
dependabot[bot]
85c5928baa Bump zeroconf from 0.115.0 to 0.115.1 (#5470)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-03 13:35:19 +13:00
Clyde Stubbs
f5dfbaff4b Support RP2040 hardware SPI (#5466) 2023-10-03 13:35:18 +13:00
Maxime Gauduin
689c2f11a3 add pin config for denky_d4 (#5471) 2023-10-03 13:35:18 +13:00
dependabot[bot]
f73fd97525 Bump zeroconf from 0.112.0 to 0.115.0 (#5432)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-03 13:35:18 +13:00
Jesse Hills
40523e6823 Merge pull request #5465 from esphome/bump-2023.9.2
2023.9.2
2023-10-02 21:24:01 +13:00
Jesse Hills
5e1472185c Bump version to 2023.9.2 2023-10-02 17:01:22 +13:00
Jesse Hills
af005a6554 Ensure esphome directory exists on addon startup (#5464) 2023-10-02 17:01:22 +13:00
Angel Nunez Mencias
efd31be21c Fix SPI support for second bus on 2023.9.1 (#5456) 2023-10-02 17:01:22 +13:00
Avri Chen-Roth
e9bda2810f Fix an Issue with IR Remote Climate and Whirlpool protocol toggle (#5447)
Co-authored-by: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
2023-10-02 17:01:22 +13:00
Clyde Stubbs
ec4777b8d0 SPI fixes for buggy components (#5446) 2023-10-02 17:01:22 +13:00
Jesse Hills
9b75121337 Merge pull request #5442 from esphome/bump-2023.9.1
2023.9.1
2023-09-28 13:05:04 +13:00
Jesse Hills
d262548d2e Bump version to 2023.9.1 2023-09-28 11:52:35 +13:00
Jesse Hills
b5b654e054 Migrate dashboard json files to /data folder instead of wiping out (#5441) 2023-09-28 11:52:35 +13:00
Marc J
dae8ab563c Tuya Number Scaling by step value (#5108) 2023-09-28 11:52:35 +13:00
15 changed files with 102 additions and 27 deletions

View File

@@ -270,7 +270,7 @@ esphome/components/sn74hc165/* @jesserockz
esphome/components/socket/* @esphome/core
esphome/components/sonoff_d1/* @anatoly-savchenkov
esphome/components/speaker/* @jesserockz
esphome/components/spi/* @esphome/core
esphome/components/spi/* @clydebarrow @esphome/core
esphome/components/spi_device/* @clydebarrow
esphome/components/spi_led_strip/* @clydebarrow
esphome/components/sprinkler/* @kbx81

View File

@@ -41,8 +41,15 @@ fi
mkdir -p "${pio_cache_base}"
mkdir -p /config/esphome
if bashio::fs.directory_exists '/config/esphome/.esphome'; then
bashio::log.info "Removing old .esphome directory..."
bashio::log.info "Migrating old .esphome directory..."
if bashio::fs.file_exists '/config/esphome/.esphome/esphome.json'; then
mv /config/esphome/.esphome/esphome.json /data/esphome.json
fi
mkdir -p "/data/storage"
mv /config/esphome/.esphome/*.json /data/storage/ || true
rm -rf /config/esphome/.esphome
fi

View File

@@ -39,10 +39,14 @@ void BP5758D::loop() {
uint8_t data[17];
if (this->pwm_amounts_[0] == 0 && this->pwm_amounts_[1] == 0 && this->pwm_amounts_[2] == 0 &&
this->pwm_amounts_[3] == 0 && this->pwm_amounts_[4] == 0) {
// Off / Sleep
data[0] = BP5758D_MODEL_ID + BP5758D_ADDR_STANDBY;
for (int i = 1; i < 16; i++)
data[i] = 0;
// First turn all channels off
data[0] = BP5758D_MODEL_ID + BP5758D_ADDR_START_3CH;
this->write_buffer_(data, 17);
// Then sleep
data[0] = BP5758D_MODEL_ID + BP5758D_ADDR_STANDBY;
this->write_buffer_(data, 17);
} else if (this->pwm_amounts_[0] == 0 && this->pwm_amounts_[1] == 0 && this->pwm_amounts_[2] == 0 &&
(this->pwm_amounts_[3] > 0 || this->pwm_amounts_[4] > 0)) {

View File

@@ -235,6 +235,7 @@ ESP32_BOARD_PINS = {
"SDA": 5,
"SS": 15,
},
"denky_d4": {"RX": 8, "LED": 14},
"esp-wrover-kit": {},
"esp32-devkitlipo": {},
"esp32-evb": {

View File

@@ -217,10 +217,7 @@ uint8_t MAX7219Component::printf(const char *format, ...) {
return 0;
}
void MAX7219Component::set_writer(max7219_writer_t &&writer) { this->writer_ = writer; }
void MAX7219Component::set_intensity(uint8_t intensity) {
this->intensity_ = intensity;
this->send_to_all_(MAX7219_REGISTER_INTENSITY, this->intensity_);
}
void MAX7219Component::set_intensity(uint8_t intensity) { this->intensity_ = intensity; }
void MAX7219Component::set_num_chips(uint8_t num_chips) { this->num_chips_ = num_chips; }
uint8_t MAX7219Component::strftime(uint8_t pos, const char *format, ESPTime time) {

View File

@@ -28,7 +28,7 @@ from esphome.const import (
)
from esphome.core import coroutine_with_priority, CORE
CODEOWNERS = ["@esphome/core"]
CODEOWNERS = ["@esphome/core", "@clydebarrow"]
spi_ns = cg.esphome_ns.namespace("spi")
SPIComponent = spi_ns.class_("SPIComponent", cg.Component)
SPIDevice = spi_ns.class_("SPIDevice")
@@ -54,6 +54,21 @@ CONF_FORCE_SW = "force_sw"
CONF_INTERFACE = "interface"
CONF_INTERFACE_INDEX = "interface_index"
# RP2040 SPI pin assignments are complicated. Refer to https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf
RP_SPI_PINSETS = [
{
CONF_MISO_PIN: [0, 4, 16, 20, -1],
CONF_CLK_PIN: [2, 6, 18, 22],
CONF_MOSI_PIN: [3, 7, 19, 23, -1],
},
{
CONF_MISO_PIN: [8, 12, 24, 28, -1],
CONF_CLK_PIN: [10, 14, 26],
CONF_MOSI_PIN: [11, 23, 27, -1],
},
]
def get_target_platform():
return (
@@ -85,7 +100,7 @@ def get_hw_interface_list():
return [["spi", "spi2"]]
return [["spi", "spi2"], ["spi3"]]
if target_platform == "rp2040":
return [["spi"]]
return [["spi"], ["spi1"]]
return []
@@ -99,8 +114,10 @@ def get_spi_index(name):
# Check that pins are suitable for HW spi
# \param spi the config data for the spi instance
# \param index the selected hw interface number, -1 if not yet known
# TODO verify that the pins are internal
def validate_hw_pins(spi):
def validate_hw_pins(spi, index=-1):
clk_pin = spi[CONF_CLK_PIN]
if clk_pin[CONF_INVERTED]:
return False
@@ -129,9 +146,30 @@ def validate_hw_pins(spi):
if target_platform == "esp32":
return clk_pin_no >= 0
if target_platform == "rp2040":
pin_set = (
list(filter(lambda s: clk_pin_no in s[CONF_CLK_PIN], RP_SPI_PINSETS))[0]
if index == -1
else RP_SPI_PINSETS[index]
)
if pin_set is None:
return False
if sdo_pin_no not in pin_set[CONF_MOSI_PIN]:
return False
if sdi_pin_no not in pin_set[CONF_MISO_PIN]:
return False
return True
return False
def get_hw_spi(config, available):
"""Get an available hardware spi interface suitable for this config"""
matching = list(filter(lambda idx: validate_hw_pins(config, idx), available))
if len(matching) != 0:
return matching[0]
return None
def validate_spi_config(config):
available = list(range(len(get_hw_interface_list())))
for spi in config:
@@ -147,9 +185,10 @@ def validate_spi_config(config):
if not validate_hw_pins(spi):
spi[CONF_INTERFACE] = "software"
elif interface == "hardware":
if len(available) == 0:
raise cv.Invalid("No hardware interface available")
index = spi[CONF_INTERFACE_INDEX] = available[0]
index = get_hw_spi(spi, available)
if index is None:
raise cv.Invalid("No suitable hardware interface available")
spi[CONF_INTERFACE_INDEX] = index
available.remove(index)
else:
# Must be a specific name
@@ -164,11 +203,14 @@ def validate_spi_config(config):
# Any specific names and any 'hardware' requests will have already been filled,
# so just need to assign remaining hardware to 'any' requests.
for spi in config:
if spi[CONF_INTERFACE] == "any" and len(available) != 0:
index = available[0]
spi[CONF_INTERFACE_INDEX] = index
available.remove(index)
if CONF_INTERFACE_INDEX in spi and not validate_hw_pins(spi):
if spi[CONF_INTERFACE] == "any":
index = get_hw_spi(spi, available)
if index is not None:
spi[CONF_INTERFACE_INDEX] = index
available.remove(index)
if CONF_INTERFACE_INDEX in spi and not validate_hw_pins(
spi, spi[CONF_INTERFACE_INDEX]
):
raise cv.Invalid("Invalid pin selections for hardware SPI interface")
return config
@@ -181,13 +223,13 @@ def get_spi_interface(index):
# Arduino code follows
platform = get_target_platform()
if platform == "rp2040":
return "&spi1"
return ["&SPI", "&SPI1"][index]
if index == 0:
return "&SPI"
# Following code can't apply to C2, H2 or 8266 since they have only one SPI
if get_target_variant() in (VARIANT_ESP32S3, VARIANT_ESP32S2):
return "new SPIClass(FSPI)"
return "return new SPIClass(HSPI)"
return "new SPIClass(HSPI)"
SPI_SCHEMA = cv.All(

View File

@@ -248,6 +248,7 @@ class SPIDelegateDummy : public SPIDelegate {
SPIDelegateDummy() = default;
uint8_t transfer(uint8_t data) override { return 0; }
void end_transaction() override{};
void begin_transaction() override;
};

View File

@@ -6,6 +6,7 @@ from esphome.const import (
CONF_NUMBER_DATAPOINT,
CONF_MAX_VALUE,
CONF_MIN_VALUE,
CONF_MULTIPLY,
CONF_STEP,
)
from .. import tuya_ns, CONF_TUYA_ID, Tuya
@@ -31,6 +32,7 @@ CONFIG_SCHEMA = cv.All(
cv.Required(CONF_MAX_VALUE): cv.float_,
cv.Required(CONF_MIN_VALUE): cv.float_,
cv.Required(CONF_STEP): cv.positive_float,
cv.Optional(CONF_MULTIPLY, default=1.0): cv.float_,
}
)
.extend(cv.COMPONENT_SCHEMA),
@@ -49,7 +51,8 @@ async def to_code(config):
step=config[CONF_STEP],
)
paren = await cg.get_variable(config[CONF_TUYA_ID])
cg.add(var.set_tuya_parent(paren))
cg.add(var.set_write_multiply(config[CONF_MULTIPLY]))
parent = await cg.get_variable(config[CONF_TUYA_ID])
cg.add(var.set_tuya_parent(parent))
cg.add(var.set_number_id(config[CONF_NUMBER_DATAPOINT]))

View File

@@ -10,7 +10,7 @@ void TuyaNumber::setup() {
this->parent_->register_listener(this->number_id_, [this](const TuyaDatapoint &datapoint) {
if (datapoint.type == TuyaDatapointType::INTEGER) {
ESP_LOGV(TAG, "MCU reported number %u is: %d", datapoint.id, datapoint.value_int);
this->publish_state(datapoint.value_int);
this->publish_state(datapoint.value_int / multiply_by_);
} else if (datapoint.type == TuyaDatapointType::ENUM) {
ESP_LOGV(TAG, "MCU reported number %u is: %u", datapoint.id, datapoint.value_enum);
this->publish_state(datapoint.value_enum);
@@ -22,7 +22,8 @@ void TuyaNumber::setup() {
void TuyaNumber::control(float value) {
ESP_LOGV(TAG, "Setting number %u: %f", this->number_id_, value);
if (this->type_ == TuyaDatapointType::INTEGER) {
this->parent_->set_integer_datapoint_value(this->number_id_, value);
int integer_value = lround(value * multiply_by_);
this->parent_->set_integer_datapoint_value(this->number_id_, integer_value);
} else if (this->type_ == TuyaDatapointType::ENUM) {
this->parent_->set_enum_datapoint_value(this->number_id_, value);
}

View File

@@ -12,6 +12,7 @@ class TuyaNumber : public number::Number, public Component {
void setup() override;
void dump_config() override;
void set_number_id(uint8_t number_id) { this->number_id_ = number_id; }
void set_write_multiply(float factor) { multiply_by_ = factor; }
void set_tuya_parent(Tuya *parent) { this->parent_ = parent; }
@@ -20,6 +21,7 @@ class TuyaNumber : public number::Number, public Component {
Tuya *parent_;
uint8_t number_id_{0};
float multiply_by_{1.0};
TuyaDatapointType type_{};
};

View File

@@ -33,6 +33,7 @@ const uint8_t WHIRLPOOL_SWING_MASK = 128;
const uint8_t WHIRLPOOL_POWER = 0x04;
void WhirlpoolClimate::transmit_state() {
this->last_transmit_time_ = millis(); // setting the time of the last transmission.
uint8_t remote_state[WHIRLPOOL_STATE_LENGTH] = {0};
remote_state[0] = 0x83;
remote_state[1] = 0x06;
@@ -149,6 +150,12 @@ void WhirlpoolClimate::transmit_state() {
}
bool WhirlpoolClimate::on_receive(remote_base::RemoteReceiveData data) {
// Check if the esp isn't currently transmitting.
if (millis() - this->last_transmit_time_ < 500) {
ESP_LOGV(TAG, "Blocked receive because of current trasmittion");
return false;
}
// Validate header
if (!data.expect_item(WHIRLPOOL_HEADER_MARK, WHIRLPOOL_HEADER_SPACE)) {
ESP_LOGV(TAG, "Header fail");

View File

@@ -47,6 +47,8 @@ class WhirlpoolClimate : public climate_ir::ClimateIR {
void transmit_state() override;
/// Handle received IR Buffer
bool on_receive(remote_base::RemoteReceiveData data) override;
/// Set the time of the last transmission.
int32_t last_transmit_time_{};
bool send_swing_cmd_{false};
Model model_;

View File

@@ -1,6 +1,6 @@
"""Constants used by esphome."""
__version__ = "2023.9.0"
__version__ = "2023.9.3"
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
VALID_SUBSTITUTIONS_CHARACTERS = (

View File

@@ -11,7 +11,7 @@ esptool==4.6.2
click==8.1.7
esphome-dashboard==20230904.0
aioesphomeapi==15.0.0
zeroconf==0.112.0
zeroconf==0.115.1
# esp-idf requires this, but doesn't bundle it by default
# https://github.com/espressif/esp-idf/blob/220590d599e134d7a5e7f1e683cc4550349ffbf8/requirements.txt#L24

View File

@@ -39,6 +39,14 @@ switch:
output: pin_4
id: pin_4_switch
spi: # Pins are for SPI1 on the RP2040 Pico-W
miso_pin: 8
clk_pin: 10
mosi_pin: 11
id: spi_0
interface: hardware
#light:
# - platform: rp2040_pio_led_strip
# id: led_strip