Compare commits

...

12 Commits

Author SHA1 Message Date
Otto Winter 5f27757039
Merge pull request #2123 from esphome/bump-1.20.4
1.20.4
2021-08-04 17:54:53 +02:00
Otto winter 532907219b
Bump version to v1.20.4 2021-08-04 17:46:10 +02:00
Otto Winter eeaba74553
Fix external components not refreshing with default or high refresh time (#2122) 2021-08-04 17:46:10 +02:00
brambo123 dd637582a4
Fix time.on_time triggering if time jumped back (#1806)
Co-authored-by: Otto winter <otto@otto-winter.com>
2021-08-04 17:46:10 +02:00
Carlos Garcia Saura b0d12aeea1
[duty_cycle] initialize two missing variables (#2088) 2021-08-04 17:46:09 +02:00
Łukasz Śliwiński bdbd813455
Use proper schema for the analog pin shorthand (#2103)
The wrong error message is displayed like:
> GPIO17 (TOUT) is an analog-only pin on the ESP8266.
in case of the analog pin validation because the method `shorthand_analog_pin` uses wrong `GPIO_FULL_INPUT_PIN_SCHEMA` instead of `GPIO_FULL_ANALOG_PIN_SCHEMA`.
2021-08-04 17:46:09 +02:00
Paul Monigatti a6fac2b175
Fix min/max keys in MQTT Number to match Home Assistant (#2102) 2021-08-04 17:46:09 +02:00
Guillermo Ruffino 5ce923ea90
fix diplay trigger missing base class (#2099) 2021-08-04 17:46:08 +02:00
Otto Winter 29f0508dc2
Fix PID climate breaks when restoring old modes (#2086) 2021-08-04 17:46:08 +02:00
Otto Winter 3ffa59f0cd
Fix climate restore schema changed resulting in invalid restore (#2068)
Co-authored-by: Stefan Agner <stefan@agner.ch>
2021-08-04 17:46:08 +02:00
WeekendWarrior1 790d6ef94c
Move configure_rmt() into setup() (#2028) 2021-08-04 17:46:08 +02:00
WeekendWarrior1 7828f48b9a
Correctly invert esp32 RMT TX (#2022) 2021-08-04 17:46:07 +02:00
14 changed files with 27 additions and 24 deletions

View File

@ -312,8 +312,12 @@ void Climate::add_on_state_callback(std::function<void()> &&callback) {
this->state_callback_.add(std::move(callback));
}
// Random 32bit value; If this changes existing restore preferences are invalidated
static const uint32_t RESTORE_STATE_VERSION = 0x848EA6ADUL;
optional<ClimateDeviceRestoreState> Climate::restore_state_() {
this->rtc_ = global_preferences.make_preference<ClimateDeviceRestoreState>(this->get_object_id_hash());
this->rtc_ =
global_preferences.make_preference<ClimateDeviceRestoreState>(this->get_object_id_hash() ^ RESTORE_STATE_VERSION);
ClimateDeviceRestoreState recovered{};
if (!this->rtc_.load(&recovered))
return {};

View File

@ -120,6 +120,7 @@ class ClimateCall {
};
/// Struct used to save the state of the climate device in restore memory.
/// Make sure to update RESTORE_STATE_VERSION when changing the struct entries.
struct ClimateDeviceRestoreState {
ClimateMode mode;
bool uses_custom_fan_mode{false};

View File

@ -31,7 +31,9 @@ DisplayPageShowPrevAction = display_ns.class_(
DisplayIsDisplayingPageCondition = display_ns.class_(
"DisplayIsDisplayingPageCondition", automation.Condition
)
DisplayOnPageChangeTrigger = display_ns.class_("DisplayOnPageChangeTrigger")
DisplayOnPageChangeTrigger = display_ns.class_(
"DisplayOnPageChangeTrigger", automation.Trigger
)
CONF_ON_PAGE_CHANGE = "on_page_change"

View File

@ -13,6 +13,7 @@ void DutyCycleSensor::setup() {
this->store_.pin = this->pin_->to_isr();
this->store_.last_level = this->pin_->digital_read();
this->last_update_ = micros();
this->store_.last_interrupt = micros();
this->pin_->attach_interrupt(DutyCycleSensorStore::gpio_intr, &this->store_, CHANGE);
}

View File

@ -29,7 +29,7 @@ class DutyCycleSensor : public sensor::Sensor, public PollingComponent {
protected:
GPIOPin *pin_;
DutyCycleSensorStore store_;
DutyCycleSensorStore store_{};
uint32_t last_update_;
};

View File

@ -147,7 +147,7 @@ def _process_git_config(config: dict, refresh) -> str:
age = datetime.datetime.now() - datetime.datetime.fromtimestamp(
file_timestamp.stat().st_mtime
)
if age.seconds > refresh.total_seconds:
if age.total_seconds() > refresh.total_seconds:
_LOGGER.info("Updating %s", key)
_LOGGER.debug("Location: %s", repo_dir)
# Stash local changes (if any)

View File

@ -39,8 +39,8 @@ void MQTTNumberComponent::send_discovery(JsonObject &root, mqtt::SendDiscoveryCo
// https://www.home-assistant.io/integrations/number.mqtt/
if (!traits.get_icon().empty())
root["icon"] = traits.get_icon();
root["min_value"] = traits.get_min_value();
root["max_value"] = traits.get_max_value();
root["min"] = traits.get_min_value();
root["max"] = traits.get_max_value();
root["step"] = traits.get_step();
config.command_topic = true;

View File

@ -37,7 +37,7 @@ void PIDClimate::control(const climate::ClimateCall &call) {
// If switching to off mode, set output immediately
if (this->mode == climate::CLIMATE_MODE_OFF)
this->handle_non_auto_mode_();
this->write_output_(0.0f);
this->publish_state();
}
@ -98,15 +98,6 @@ void PIDClimate::write_output_(float value) {
}
this->pid_computed_callback_.call();
}
void PIDClimate::handle_non_auto_mode_() {
// in non-auto mode, switch directly to appropriate action
// - OFF mode -> Output at 0%
if (this->mode == climate::CLIMATE_MODE_OFF) {
this->write_output_(0.0);
} else {
assert(false);
}
}
void PIDClimate::update_pid_() {
float value;
if (isnan(this->current_temperature) || isnan(this->target_temperature)) {
@ -135,7 +126,7 @@ void PIDClimate::update_pid_() {
}
if (this->mode == climate::CLIMATE_MODE_OFF) {
this->handle_non_auto_mode_();
this->write_output_(0.0);
} else {
this->write_output_(value);
}

View File

@ -56,7 +56,6 @@ class PIDClimate : public climate::Climate, public Component {
bool supports_heat_() const { return this->heat_output_ != nullptr; }
void write_output_(float value);
void handle_non_auto_mode_();
/// The sensor used for getting the current temperature
sensor::Sensor *sensor_;

View File

@ -41,6 +41,7 @@ class RemoteTransmitterComponent : public remote_base::RemoteTransmitterBase,
bool initialized_{false};
std::vector<rmt_item32_t> rmt_temp_;
esp_err_t error_code_{ESP_OK};
bool inverted_{false};
#endif
uint8_t carrier_duty_percent_{50};
};

View File

@ -9,7 +9,7 @@ namespace remote_transmitter {
static const char *const TAG = "remote_transmitter";
void RemoteTransmitterComponent::setup() {}
void RemoteTransmitterComponent::setup() { this->configure_rmt(); }
void RemoteTransmitterComponent::dump_config() {
ESP_LOGCONFIG(TAG, "Remote Transmitter...");
@ -50,6 +50,7 @@ void RemoteTransmitterComponent::configure_rmt() {
} else {
c.tx_config.carrier_level = RMT_CARRIER_LEVEL_LOW;
c.tx_config.idle_level = RMT_IDLE_LEVEL_HIGH;
this->inverted_ = true;
}
esp_err_t error = rmt_config(&c);
@ -95,10 +96,10 @@ void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t sen
val -= item;
if (rmt_i % 2 == 0) {
rmt_item.level0 = static_cast<uint32_t>(level);
rmt_item.level0 = static_cast<uint32_t>(level ^ this->inverted_);
rmt_item.duration0 = static_cast<uint32_t>(item);
} else {
rmt_item.level1 = static_cast<uint32_t>(level);
rmt_item.level1 = static_cast<uint32_t>(level ^ this->inverted_);
rmt_item.duration1 = static_cast<uint32_t>(item);
this->rmt_temp_.push_back(rmt_item);
}

View File

@ -22,7 +22,10 @@ void CronTrigger::loop() {
return;
if (this->last_check_.has_value()) {
if (*this->last_check_ >= time) {
if (*this->last_check_ > time && this->last_check_->timestamp - time.timestamp > 900) {
// We went back in time (a lot), probably caused by time synchronization
ESP_LOGW(TAG, "Time has jumped back!");
} else if (*this->last_check_ >= time) {
// already handled this one
return;
}

View File

@ -1,6 +1,6 @@
"""Constants used by esphome."""
__version__ = "1.20.3"
__version__ = "1.20.4"
ESP_PLATFORM_ESP32 = "ESP32"
ESP_PLATFORM_ESP8266 = "ESP8266"

View File

@ -1104,7 +1104,7 @@ def shorthand_input_pullup_pin(value):
def shorthand_analog_pin(value):
value = analog_pin(value)
return GPIO_FULL_INPUT_PIN_SCHEMA({CONF_NUMBER: value})
return GPIO_FULL_ANALOG_PIN_SCHEMA({CONF_NUMBER: value})
def validate_has_interrupt(value):