From c868e5b49b2f89d74e88193c0529c3906ae2d0ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Bogda=C5=82?= Date: Mon, 3 Jul 2023 21:46:47 +0200 Subject: [PATCH] Make optimistic mode configurable --- README-EN.md | 3 +++ README.md | 2 ++ components/aux_ac/aux_ac.h | 12 +++++++++++- components/aux_ac/climate.py | 4 +++- examples/advanced/ac_common.yaml | 1 + tests/test-ext-for-engineer.yaml | 1 + tests/test-local.yaml | 1 + 7 files changed, 22 insertions(+), 2 deletions(-) diff --git a/README-EN.md b/README-EN.md index 057bd95..51fa872 100644 --- a/README-EN.md +++ b/README-EN.md @@ -90,6 +90,7 @@ climate: show_action: true display_inverted: false timeout: 150 + optimistic: true indoor_temperature: name: AC Indoor Temperature id: ac_indoor_temp @@ -187,6 +188,8 @@ climate: The only situation when you can play with timeout is heavily loaded ESP. When you are using your ESP for many hard tasks, it is possible that `aux_ac` does not have enough time to receive AC responses. In this case, you can slightly raise the timeout value. But the best solution would be to remove some of the tasks from the ESP. The timeout is limited to a range from `150` to `600` milliseconds. Other values are possible only with source code modification. But I don't recommend that. +- **optimistic** (*Optional*, boolean, default ``true``): Whether entity states should be updated immediately after receiving a command from Home Assistant/ESPHome. + - **indoor_temperature** (*Optional*): Parameters of the room air temperature sensor. - **name** (**Required**, string): The name for the temperature sensor. - **id** (*Optional*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Set the ID of this sensor for use in lambdas. diff --git a/README.md b/README.md index 3fd0205..39e0e1f 100644 --- a/README.md +++ b/README.md @@ -196,6 +196,8 @@ climate: Единственная ситуация, когда вам может пригодиться этот параметр, - это сильно загруженная ESP. Если по какой-то неподдающейся логике причине вы кроме `aux_ac` нагрузили свою ESP кучей дополнительных ресурсоемких задач, то у компонента может просто не хватать времени для оперативного приёма ответов от кондиционера. В этом в логе будут сообщения о том, что последовательность команд была прервана по таймауту. Чтобы это исправить, лучше, конечно, немного разгрузить ESP. Если это вам не подходит, тогда можно увеличить таймаут. Значение таймаута в прошивке ограничено диапазоном от `150` до `600` миллисекунд. Устанавливать значения выше можно только отредактировав исходные коды компонента. Но сильно задирать таймаут не стоит. Кондиционер периодически рассылает пакеты без запроса со стороны `aux_ac` и это приводит к сбою в отправке команды. +- **optimistic** (*Опциональный*, логическое, по умолчанию ``true``) + - **indoor_temperature** (*Опциональный*): Параметры создаваемого датчика температуры воздуха, если такой датчик нужен - **name** (**Обязательный**, строка): Имя датчика температуры. - **id** (*Опциональный*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Можно указать свой ID для датчика для использования в лямбдах. diff --git a/components/aux_ac/aux_ac.h b/components/aux_ac/aux_ac.h index ea7b4b6..f2ecc33 100644 --- a/components/aux_ac/aux_ac.h +++ b/components/aux_ac/aux_ac.h @@ -756,6 +756,10 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { // если тут true, то 1 потушит дисплей, а 0 включит. bool _display_inverted = false; + // in optimistic mode, the entity states are updated immediately after receiving a command + // from Home Assistant/ESPHome + bool _optimistic = true; + // флаг типа кондиционера. инвертор - true, ON/OFF - false, начальная установка false // в таком режиме точность и скорость определения реального состояния системы для инвертора, // будет работать, но будет ниже, переменная устанавливается при первом получении большого пакета; @@ -2472,6 +2476,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { ESP_LOGCONFIG(TAG, " [x] Period: %dms", this->get_period()); ESP_LOGCONFIG(TAG, " [x] Show action: %s", TRUEFALSE(this->get_show_action())); ESP_LOGCONFIG(TAG, " [x] Display inverted: %s", TRUEFALSE(this->get_display_inverted())); + ESP_LOGCONFIG(TAG, " [x] Optimistic: %s", TRUEFALSE(this->get_optimistic())); ESP_LOGCONFIG(TAG, " [x] Packet timeout: %dms", this->get_packet_timeout()); #if defined(PRESETS_SAVING) @@ -2830,7 +2835,9 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { if (hasCommand) { commandSequence(&cmd); - this->publish_all_states(); // Publish updated state + if (this->get_optimistic()) { + this->publish_all_states(); // Publish updated state + } #if defined(PRESETS_SAVING) // флаг отправки новой команды, для процедуры сохранения пресетов, если есть настройка @@ -3267,6 +3274,9 @@ class AirCon : public esphome::Component, public esphome::climate::Climate { } uint32_t get_packet_timeout() { return this->_packet_timeout; } + void set_optimistic(bool optimistic) { this->_optimistic = optimistic; } + bool get_optimistic() { return this->_optimistic; } + // возможно функции get и не нужны, но вроде как должны быть void set_supported_modes(const std::set &modes) { this->_supported_modes = modes; } std::set get_supported_modes() { return this->_supported_modes; } diff --git a/components/aux_ac/climate.py b/components/aux_ac/climate.py index fe1fd49..a9699b2 100644 --- a/components/aux_ac/climate.py +++ b/components/aux_ac/climate.py @@ -10,6 +10,7 @@ from esphome.const import ( CONF_DATA, CONF_ID, CONF_INTERNAL, + CONF_OPTIMISTIC, CONF_PERIOD, CONF_POSITION, CONF_SUPPORTED_MODES, @@ -193,7 +194,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_SHOW_ACTION, default="true"): cv.boolean, cv.Optional(CONF_DISPLAY_INVERTED, default="false"): cv.boolean, cv.Optional(CONF_TIMEOUT, default=AC_PACKET_TIMEOUT_MIN): validate_packet_timeout, - + cv.Optional(CONF_OPTIMISTIC, default="true"): cv.boolean, cv.Optional(CONF_INVERTER_POWER_DEPRICATED): cv.invalid( "The name of sensor was changed in v.0.2.9 from 'invertor_power' to 'inverter_power'. Update your config please." ), @@ -400,6 +401,7 @@ async def to_code(config): cg.add(var.set_show_action(config[CONF_SHOW_ACTION])) cg.add(var.set_display_inverted(config[CONF_DISPLAY_INVERTED])) cg.add(var.set_packet_timeout(config[CONF_TIMEOUT])) + cg.add(var.set_optimistic(config[CONF_OPTIMISTIC])) if CONF_SUPPORTED_MODES in config: cg.add(var.set_supported_modes(config[CONF_SUPPORTED_MODES])) if CONF_SUPPORTED_SWING_MODES in config: diff --git a/examples/advanced/ac_common.yaml b/examples/advanced/ac_common.yaml index a235ab5..6698f7b 100644 --- a/examples/advanced/ac_common.yaml +++ b/examples/advanced/ac_common.yaml @@ -65,6 +65,7 @@ climate: period: 7s show_action: true display_inverted: true + optimistic: true indoor_temperature: name: ${upper_devicename} Indoor Temperature id: ${devicename}_indoor_temp diff --git a/tests/test-ext-for-engineer.yaml b/tests/test-ext-for-engineer.yaml index cb6741d..20f4ed3 100644 --- a/tests/test-ext-for-engineer.yaml +++ b/tests/test-ext-for-engineer.yaml @@ -79,6 +79,7 @@ climate: period: 7s show_action: true display_inverted: true + optimistic: true indoor_temperature: name: $upper_devicename Indoor Temperature id: ${devicename}_indoor_temp diff --git a/tests/test-local.yaml b/tests/test-local.yaml index 2e19b08..e934728 100644 --- a/tests/test-local.yaml +++ b/tests/test-local.yaml @@ -61,6 +61,7 @@ climate: period: 7s show_action: true display_inverted: true + optimistic: true indoor_temperature: name: $upper_devicename Indoor Temperature id: ${devicename}_indoor_temp