Skip to content

Commit 6bfb948

Browse files
authored
Merge pull request #77 from bogdal/optimistic-mode
Make optimistic mode configurable
2 parents cdd97b8 + c868e5b commit 6bfb948

File tree

7 files changed

+22
-2
lines changed

7 files changed

+22
-2
lines changed

README-EN.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ climate:
9090
show_action: true
9191
display_inverted: false
9292
timeout: 150
93+
optimistic: true
9394
indoor_temperature:
9495
name: AC Indoor Temperature
9596
id: ac_indoor_temp
@@ -187,6 +188,8 @@ climate:
187188
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.
188189
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.
189190

191+
- **optimistic** (*Optional*, boolean, default ``true``): Whether entity states should be updated immediately after receiving a command from Home Assistant/ESPHome.
192+
190193
- **indoor_temperature** (*Optional*): Parameters of the room air temperature sensor.
191194
- **name** (**Required**, string): The name for the temperature sensor.
192195
- **id** (*Optional*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Set the ID of this sensor for use in lambdas.

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ climate:
196196
Единственная ситуация, когда вам может пригодиться этот параметр, - это сильно загруженная ESP. Если по какой-то неподдающейся логике причине вы кроме `aux_ac` нагрузили свою ESP кучей дополнительных ресурсоемких задач, то у компонента может просто не хватать времени для оперативного приёма ответов от кондиционера. В этом в логе будут сообщения о том, что последовательность команд была прервана по таймауту. Чтобы это исправить, лучше, конечно, немного разгрузить ESP. Если это вам не подходит, тогда можно увеличить таймаут.
197197
Значение таймаута в прошивке ограничено диапазоном от `150` до `600` миллисекунд. Устанавливать значения выше можно только отредактировав исходные коды компонента. Но сильно задирать таймаут не стоит. Кондиционер периодически рассылает пакеты без запроса со стороны `aux_ac` и это приводит к сбою в отправке команды.
198198

199+
- **optimistic** (*Опциональный*, логическое, по умолчанию ``true``)
200+
199201
- **indoor_temperature** (*Опциональный*): Параметры создаваемого датчика температуры воздуха, если такой датчик нужен
200202
- **name** (**Обязательный**, строка): Имя датчика температуры.
201203
- **id** (*Опциональный*, [ID](https://esphome.io/guides/configuration-types.html#config-id)): Можно указать свой ID для датчика для использования в лямбдах.

components/aux_ac/aux_ac.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,10 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
756756
// если тут true, то 1 потушит дисплей, а 0 включит.
757757
bool _display_inverted = false;
758758

759+
// in optimistic mode, the entity states are updated immediately after receiving a command
760+
// from Home Assistant/ESPHome
761+
bool _optimistic = true;
762+
759763
// флаг типа кондиционера. инвертор - true, ON/OFF - false, начальная установка false
760764
// в таком режиме точность и скорость определения реального состояния системы для инвертора,
761765
// будет работать, но будет ниже, переменная устанавливается при первом получении большого пакета;
@@ -2472,6 +2476,7 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
24722476
ESP_LOGCONFIG(TAG, " [x] Period: %dms", this->get_period());
24732477
ESP_LOGCONFIG(TAG, " [x] Show action: %s", TRUEFALSE(this->get_show_action()));
24742478
ESP_LOGCONFIG(TAG, " [x] Display inverted: %s", TRUEFALSE(this->get_display_inverted()));
2479+
ESP_LOGCONFIG(TAG, " [x] Optimistic: %s", TRUEFALSE(this->get_optimistic()));
24752480
ESP_LOGCONFIG(TAG, " [x] Packet timeout: %dms", this->get_packet_timeout());
24762481

24772482
#if defined(PRESETS_SAVING)
@@ -2830,7 +2835,9 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
28302835

28312836
if (hasCommand) {
28322837
commandSequence(&cmd);
2833-
this->publish_all_states(); // Publish updated state
2838+
if (this->get_optimistic()) {
2839+
this->publish_all_states(); // Publish updated state
2840+
}
28342841

28352842
#if defined(PRESETS_SAVING)
28362843
// флаг отправки новой команды, для процедуры сохранения пресетов, если есть настройка
@@ -3267,6 +3274,9 @@ class AirCon : public esphome::Component, public esphome::climate::Climate {
32673274
}
32683275
uint32_t get_packet_timeout() { return this->_packet_timeout; }
32693276

3277+
void set_optimistic(bool optimistic) { this->_optimistic = optimistic; }
3278+
bool get_optimistic() { return this->_optimistic; }
3279+
32703280
// возможно функции get и не нужны, но вроде как должны быть
32713281
void set_supported_modes(const std::set<ClimateMode> &modes) { this->_supported_modes = modes; }
32723282
std::set<ClimateMode> get_supported_modes() { return this->_supported_modes; }

components/aux_ac/climate.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
CONF_DATA,
1111
CONF_ID,
1212
CONF_INTERNAL,
13+
CONF_OPTIMISTIC,
1314
CONF_PERIOD,
1415
CONF_POSITION,
1516
CONF_SUPPORTED_MODES,
@@ -193,7 +194,7 @@ def output_info(config):
193194
cv.Optional(CONF_SHOW_ACTION, default="true"): cv.boolean,
194195
cv.Optional(CONF_DISPLAY_INVERTED, default="false"): cv.boolean,
195196
cv.Optional(CONF_TIMEOUT, default=AC_PACKET_TIMEOUT_MIN): validate_packet_timeout,
196-
197+
cv.Optional(CONF_OPTIMISTIC, default="true"): cv.boolean,
197198
cv.Optional(CONF_INVERTER_POWER_DEPRICATED): cv.invalid(
198199
"The name of sensor was changed in v.0.2.9 from 'invertor_power' to 'inverter_power'. Update your config please."
199200
),
@@ -400,6 +401,7 @@ async def to_code(config):
400401
cg.add(var.set_show_action(config[CONF_SHOW_ACTION]))
401402
cg.add(var.set_display_inverted(config[CONF_DISPLAY_INVERTED]))
402403
cg.add(var.set_packet_timeout(config[CONF_TIMEOUT]))
404+
cg.add(var.set_optimistic(config[CONF_OPTIMISTIC]))
403405
if CONF_SUPPORTED_MODES in config:
404406
cg.add(var.set_supported_modes(config[CONF_SUPPORTED_MODES]))
405407
if CONF_SUPPORTED_SWING_MODES in config:

examples/advanced/ac_common.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ climate:
6565
period: 7s
6666
show_action: true
6767
display_inverted: true
68+
optimistic: true
6869
indoor_temperature:
6970
name: ${upper_devicename} Indoor Temperature
7071
id: ${devicename}_indoor_temp

tests/test-ext-for-engineer.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ climate:
7979
period: 7s
8080
show_action: true
8181
display_inverted: true
82+
optimistic: true
8283
indoor_temperature:
8384
name: $upper_devicename Indoor Temperature
8485
id: ${devicename}_indoor_temp

tests/test-local.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ climate:
6161
period: 7s
6262
show_action: true
6363
display_inverted: true
64+
optimistic: true
6465
indoor_temperature:
6566
name: $upper_devicename Indoor Temperature
6667
id: ${devicename}_indoor_temp

0 commit comments

Comments
 (0)