Статья

Автоматизация кондиционера по внешнему датчику температуры в Home Assistant

В этой статье рассмотрим пример автоматизации установки режимов кондиционера, основываясь на показаниях внешнего датчика. Все действия будут происходить в интерфейсе Home Assistant (HA). Будем рассматривать летний режим кондиционера - охлаждение.

Какую температуру я хочу поддерживать в помещениях?

Кондиционеры должны поддерживать температуру в гостиной 22°C, а в спальне 21°C. Желательно, чтобы разброс температур был не более 0.5°C. В квартире также установлена приточная система вентиляции, которая подаёт горячий воздух с улицы. Кондиционеры не должны включатся/выключатся каждые 10 минут, т.к. это вредно для кондиционера. Также скорость вентилятора не должна быть всегда на максимуме, чтобы не раздражать своей громкостью присутствующих.

Зачем нужна автоматизация?

У меня стоят неплохие кондиционеры LG B07TS и они умеют "пытаться" держать заданную температуру. Проблема возникает по утрам из-за того, что окна выходят на восток и жара начинается в 4 утра. Конечно, стоят и шторы блэкаут и отражающие шторы-плиссе, но это не помогает. Также, если приходят гости, то температура медленно ползет вверх и нужно или увеличивать скорость вентилятора кондиционера или уменьшать целевую температуру вручную. И не стоит забывать о том, что кондиционер измеряет температуру на себе, а не у кровати, где вы спите. По сути, нужно сделать аналог термостата, но с более сложной логикой работы, а не только вкл/выкл.

Если у вас кондиционер умеет всё вышеописанное, то это идеально и можно дальше не читать.

Зоопарк возможных устройств

Нам понадобится НА, кондиционер ("умный" или "тупой") и внешний датчик температуры, который прокинут в НА. У меня кондиционер считается "умным" и живет в экосистеме LG Thinq, но сервера LG, а также вайфай самого кондиционера, живут какой-то своей жизнью. В итоге я купил ИК передатчик Avatto S06 на али за ~500 р каждый. Можно его перепрошить в ESPHome, но я не стал запариваться и остался на облаке Tuya (падает облако редко ~2 раза в год). В приложении Tuya я добавил мгновенные сценарии для кондиционеров под каждый режим работы. Эти сценарии появились в НА через стандартную интеграцию Tuya.

Сейчас в продаже появился ИК передатчик Avatto S06 Pro и в нем есть сразу датчик температуры. Я не знаю, можно ли его пробросить в НА, но идея иметь только одно устройство для автоматизации кондиционера мне нравится (в автоматизациях туи можно простенькие условия накидать).

Для наблюдения за температурой подойдет любой датчик, но лучше использовать более точные устройства, которые реагируют на изменение температуры в 0,1 градус и отдают данные часто. Почти все xiaomi зигби датчики не посылают показания, если изменения были меньше, чем 0.5°C, а это критично, если мы хотим держать температуру в узком коридоре градусов с хорошей точностью.

Подготовка к автоматизациям (вспомогательные элементы)

В итоге, нам нужно любым способом сделать сценарии в НА, которые будут устанавливать конкретные режимы работы кондиционера. Далее я буду описывать всё на примере одного кондиционера - в гостиной.

Работу любого кондиционера в конкретном пространстве можно привести к конечному набору режимов его работы. У меня таких режимов для кондиционера в гостиной получилось 6. Они были заведены через мгновенные сценарии (ИК команды) в приложении Tuya:

Возможно, это избыточное количество сценариев, но я стараюсь повышать скорость кондиционера плавно. Обратите внимание, что в сценариях соблюдается логика "от минимального охлаждения до максимального", т.е. 0 - выключен, а 5 - максимальный режим охлаждения в кондиционере.

Если у вас кондиционер с локальным управлением и есть сущность climate, то вообще супер и я рад за вас - многое можно будет пропустить (например, блок с переменными "Заданная температура" и "Скорость потока").

Считаем наш кондиционер "тупым" и сущности HA climate у нас нет, а это значит, что неплохо было бы перед глазами видеть режимы работы в текущий момент. Для этого создаем через интерфейс НА: "настройки" - вспомогательные элементы.

Заданная температура

input_number.ac_gost_target_temp

initial: null

editable: false
min: 0
max: 30
step: 1
mode: slider
friendly_name: ac_gost_target_temp
icon: mdi:thermometer

Скорость потока

input_text.ac_gost_fan_speed
editable: false
min: 0
max: 100
pattern: null
mode: text
friendly_name: ac_gost_fan_speed

Добавляем элементы (число) для нижней и верхней границы диапазона допустимых температур

Создаем счетчик

Счетчик мы будем использовать для того, чтобы было легче переключать режимы кондиционера, увеличивая или уменьшая его скорость обдува и температуру. Ранее я писал про сценарии в приложении Tuya (6 сценариев от 0 до 5) и теперь создаем счетчик с минимальным значением 0 и максимальным 5. Для каждого значения счётчика от 0 до 5 надо поставить в соответствие наши сценарии Tuya.

Создаем автоматизацию на счётчик

Для этого делаем простенькую автоматизацию, которая будет завязана на изменение значений счетчика.

Общая логика, если я, например, устанавливаю счетчик в положение 1, выглядит следующим образом:
- послать команду на кондиционер "21°C минимальная скорость" (соответствует 1 сценарию Tuya);
- установить переменную скорости вентилятора в LOW;
- установить переменную целевой температуры в 21.

Я приведу автоматизацию в текстовом варианте, но "писал" я ее через интерфейс.

alias: AC_GOST_lvl_to_ir description: '' trigger: - platform: state entity_id: counter.ac_gost_counter condition: [] action: - choose: - conditions: - condition: state entity_id: counter.ac_gost_counter state: '0' sequence: - scene: scene.q2j1zyzqlh1jwhlr - service: input_number.set_value target: entity_id: input_number.ac_gost_target_temp data: value: 0 - service: input_text.set_value data: value: выкл target: entity_id: input_text.ac_gost_fan_speed - conditions: - condition: state entity_id: counter.ac_gost_counter state: '1' sequence: - scene: scene.cbnb88hk8hm6j6wa - service: input_number.set_value target: entity_id: input_number.ac_gost_target_temp data: value: 21 - service: input_text.set_value data: value: LOW target: entity_id: input_text.ac_gost_fan_speed - conditions: - condition: state entity_id: counter.ac_gost_counter state: '2' sequence: - scene: scene.zcmzb93i1iifokeg - service: input_number.set_value target: entity_id: input_number.ac_gost_target_temp data: value: 19 - service: input_text.set_value data: value: LOW-MID target: entity_id: input_text.ac_gost_fan_speed - conditions: - condition: state entity_id: counter.ac_gost_counter state: '3' sequence: - scene: scene.asxxu5vyxl8mbciu - service: input_number.set_value data: value: 19 target: entity_id: input_number.ac_gost_target_temp - service: input_text.set_value data: value: MID target: entity_id: input_text.ac_gost_fan_speed - conditions: - condition: state entity_id: counter.ac_gost_counter state: '4' sequence: - scene: scene.s1qehk3vocldq7to - service: input_number.set_value data: value: 18 target: entity_id: input_number.ac_gost_target_temp - service: input_text.set_value data: value: MID-HIGH target: entity_id: input_text.ac_gost_fan_speed - conditions: - condition: state entity_id: counter.ac_gost_counter state: '5' sequence: - scene: scene.unlnhb4kuyytw7r6 - service: input_number.set_value data: value: 18 target: entity_id: input_number.ac_gost_target_temp - service: input_text.set_value data: value: HIGH target: entity_id: input_text.ac_gost_fan_speed default: [] mode: single

Чем хорош счетчик?

Теперь у нас есть механизм, который инкапсулирует в себе логику climate (оооочень с большой натяжкой). Мы можем удобно делать следующие операции:
- увеличить значение счетчика (counter.increment);
- уменьшить значение счетчика (counter.decrement);
- сбросить значение счетчика (counter.reset) до 0 и кондиционер выключится.

Также можно реализовать кнопки в интерфейсе для управления кондиционером и в них использовать counter.configure для задания конкретного значения счетчика.

PS: можно также всё сделать не через счетчик, а через input_number.

Общий алгоритм автоматизации управления кондиционером

Сначала я приведу описание моего алгоритма обычным текстом, а потом вставлю код.

Мы будем каждые 15 минут (или при включении автоматизации) выполнять определенные действия. Экспериментальным путем я получил, что 15 минут - оптимальный интервал, чтобы кондиционер успел как-то изменить температуру воздуха, но при этом не стало слишком холодно или жарко.

Варианты действий:

  1. Если температура в помещении выше параметра input_number.ac_gost_temp_above, то увеличиваем счетчик на 1. Таким образом, если кондиционер был выключен (счетчик 0), то счетчик перейдет в состояние 1 и кондиционер включится в 1 режим. Если кондиционер уже работает на максимальном режиме (5), то состояние изменяться не будет и, соответственно, не будут уходить лишние сигналы на кондиционер.
  2. Если температура в помещении в диапазоне между input_number.ac_gost_temp_below и input_number.ac_gost_temp_above, то уменьшаем счетчик на единицу. Таким образом, если температура в указанном диапазоне, то режим кондиционера будет понижаться до выключения (0), но мне это в итоге не понравилось и было добавлено условие, что счетчик >1.
  3. Если температура в помещении ниже параметра input_number.ac_gost_temp_below, то выключаем кондиционер - сбрасываем счетчик до 0.
  4. Если температура на улице (можно использовать внешний датчик, температуру приточной вентиляции или данные Gismeteo) ниже 18 градусов и счетчик = 1 более одного часа, то выключаем кондиционер.

Код приведен с наименованием моих сенсоров.

alias: AC_GOST_inc_dec_lvl description: '' trigger: - platform: time_pattern minutes: /15 - platform: state entity_id: automation.ac_gost_inc_dec_lvl to: 'on' condition: [] action: - choose: - conditions: - condition: numeric_state entity_id: sensor.ble_temperature_582d34113362 above: input_number.ac_gost_temp_above sequence: - service: counter.increment target: entity_id: counter.ac_gost_counter - conditions: - condition: numeric_state entity_id: sensor.ble_temperature_582d34113362 above: input_number.ac_gost_temp_below below: input_number.ac_gost_temp_above - condition: numeric_state entity_id: counter.ac_gost_counter above: '1' sequence: - service: counter.decrement target: entity_id: counter.ac_gost_counter - conditions: - condition: numeric_state entity_id: sensor.ble_temperature_582d34113362 below: input_number.ac_gost_temp_below sequence: - service: counter.reset target: entity_id: counter.ac_gost_counter - conditions: - condition: state entity_id: counter.ac_gost_counter state: '1' for: '00:59:00' - condition: numeric_state entity_id: sensor.satellite_current_temp below: '18' sequence: - service: counter.reset target: entity_id: counter.ac_gost_counter default: [] mode: single

Немного примера колхозного интерфейса (выделено красным)

- entity: switch.sw_ac_gostinaia type: 'custom:multiple-entity-row' state_color: true name: Кондиционер icon: 'mdi:air-conditioner' toggle: true state_header: выкл/вкл secondary_info: entity: binary_sensor.ac_gostinaia name: false entities: - entity: counter.ac_gost_counter name: режим - entity: automation.ac_gost_inc_dec_lvl name: авто toggle: true - type: history-graph entities: - entity: counter.ac_gost_counter hours_to_show: 24 refresh_interval: 60 - type: entities entities: - type: 'custom:paper-buttons-row' buttons: - name: 21°С icon: 'mdi:fan-speed-1' layout: icon_name style: button: border-radius: 4px font-size: 12px background-color: var(--primary-color) height: 40px name: color: |- {% if is_state('counter.ac_gost_counter', '1') %} green {% else%} white {% endif %} icon: color: |- {% if is_state('counter.ac_gost_counter', '1') %} green {% else%} white {% endif %} tap_action: action: call-service service: counter.configure service_data: value: 1 entity_id: counter.ac_gost_counter - name: 19°С icon: 'mdi:fan-chevron-up' layout: icon_name style: button: border-radius: 4px font-size: 12px background-color: var(--primary-color) height: 40px name: color: |- {% if is_state('counter.ac_gost_counter', '2') %} green {% else%} white {% endif %} icon: color: |- {% if is_state('counter.ac_gost_counter', '2') %} green {% else%} white {% endif %} tap_action: action: call-service service: counter.configure service_data: value: 2 entity_id: counter.ac_gost_counter - name: 19°С icon: 'mdi:fan-speed-2' layout: icon_name style: button: border-radius: 4px font-size: 12px background-color: var(--primary-color) height: 40px name: color: |- {% if is_state('counter.ac_gost_counter', '3') %} green {% else%} white {% endif %} icon: color: |- {% if is_state('counter.ac_gost_counter', '3') %} green {% else%} white {% endif %} tap_action: action: call-service service: counter.configure service_data: value: 3 entity_id: counter.ac_gost_counter - name: 18°С icon: 'mdi:fan-speed-2' layout: icon_name style: button: border-radius: 4px font-size: 12px background-color: var(--primary-color) height: 40px name: color: |- {% if is_state('counter.ac_gost_counter', '4') %} green {% else%} white {% endif %} icon: color: |- {% if is_state('counter.ac_gost_counter', '4') %} green {% else%} white {% endif %} tap_action: action: call-service service: counter.configure service_data: value: 4 entity_id: counter.ac_gost_counter - name: 18°С icon: 'mdi:fan-speed-3' layout: icon_name style: button: border-radius: 4px font-size: 12px background-color: var(--primary-color) height: 40px name: color: |- {% if is_state('counter.ac_gost_counter', '5') %} green {% else%} white {% endif %} icon: color: |- {% if is_state('counter.ac_gost_counter', '5') %} green {% else%} white {% endif %} tap_action: action: call-service service: counter.configure service_data: value: 5 entity_id: counter.ac_gost_counter hold_action: action: call-service service: scene.turn_on service_data: entity_id: scene.xblhsfekhw1rwvji confirmation: text: Турбо режим включится на полчаса! - icon: 'mdi:lightbulb-on-outline' style: button: border-radius: 4px font-size: 12px background-color: 'rgb(47, 75, 112)' height: 40px name: color: white icon: color: yellow tap_action: action: call-service service: scene.turn_on service_data: entity_id: scene.segkcquip0optwyk - name: 'OFF' icon: 'mdi:air-conditioner' layout: icon_name style: button: border-radius: 4px font-size: 12px background-color: 'rgb(47, 75, 112)' height: 40px name: color: |- {% if is_state('switch.sw_ac_gostinaia', 'off' ) %} red {% else%} white {% endif %} icon: color: red tap_action: action: call-service service: counter.configure service_data: value: 0 entity_id: counter.ac_gost_counter - entity: input_number.ac_gost_temp_above type: 'custom:multiple-entity-row' name: Границы icon: 'mdi:format-line-spacing' toggle: false state_header: верхняя entities: - entity: input_number.ac_gost_temp_below name: нижняя - entity: input_number.ac_gost_target_temp type: 'custom:multiple-entity-row' state_color: true name: Показатели icon: 'mdi:air-conditioner' toggle: false state_header: задана unit: °С entities: - entity: counter.ac_gost_counter name: режим - entity: input_text.ac_gost_fan_speed name: скорость

Немного ЧаВо :)

В: Может ли быть другой алгоритм (проще)?
О: Конечно, я описал пример, к которому пришел за полтора года. До этого логика была значительно проще.

В: Почему лучше считывать раз в 15 минут, а не делать триггер на изменение значения температуры?
О: Проверка раз в 15 минут надежнее в случаях, если датчик кратковременно отключается или значение часто пересекает одну из границ. Также можно сделать проверку не только внутренней, но и внешней температуры.

В: Не холодно ли жить в 22 градусах?
О: Нет, не холодно. Если у вас хорошие кондиционеры и есть приток воздуха, то можете сделать стабильный климат по температуре. Я бы советовал в первый год использования кондиционера ставить температуру на 23-24 градуса, в следующий - 22. Для спальни идеально подошел 21 градус - сон отличный.

В: Не нервирует ли постоянный писк кондиционера (раз в 15 минут) при переключении режимов (если функционально его нельзя отключить)?
О: Да, и еще как. Для устранения этого недоразумения открываем кондиционер, добираемся до платы управления (все кондиционеры легко разбираются) и находим там диммер. Чаще всего, это черный цилиндр, диаметром 1см с дыркой по центру, а внутри железная мембрана. Берем саморез черного цвета (чтобы подходил под цвет диммера), стачиваем небольшой участок острия. На затупленный кончик приклеиваем маленький (1мм) фрагмент двустороннего скотча и медленно вкручиваем саморез в диммер. Задача - докоснуться до мембраны и заглушить колебания. Если будут обращения по гарантии, то можно этот саморез выкрутить.

В: Не нервирует ли ночью горящий экран температуры на кондиционере (если функционально его нельзя отключить)?
О: Да, нервирует. Открываем кондиционер и заклеиваем дисплей малярным скотчем или изолентой)




Для неколхозного интерфейса можно использовать связку SmartIR (https://github.com/smartHomeHub/SmartIR">https://github.com/smartHomeHu...) + Simple Thermostat (https://github.com/nervetattoo/simple-thermostat">https://github.com/nervetattoo...) для HACS.

https://sprut.ai/static/media/cache/00/42/17/5/9098681/79759/1000x_image.png?1625923557" alt="1000x_image.png?1625923557" />

Внешний вид термостата неплохо кастомизируется.

Да, это хорошая реализация, если можно сделать сущность climate в НА. В моем случае на Avatto S06 надо делать перепрошивку в ESPHome и тогда будет climate. Но как показывает практика, изменять температуру вручную не требуется, если есть настроенная автоматизация.

Тогда да. Не учел, что переделывать ИК-передатчик нужно.

А в чем заключался смысл использования Ир из tuya? Они же из всего многообразия устройств tuya точно не работают с local tyua. 

Просто тот же broadlink отлично описан в smartir для локального режима. 

у меня кондеем управляет Алиса. И датчик температуры покинут в smartir.

Вариантов управления много. При покупке не думал, что локальный режим не получится в НА сделать

Эх, никак не дойдут руки для нормальной автоматизации. Есть инверторный кондиционер с wifi и полной интеграцией в HA. Есть внешний датчик температуры. Есть измеритель мощности на питании кондиционера. И есть мысль контролировать дельту между заданной и фактической температурой а также потребляемую кондиционером мощность. Если дельта большая а кондиционер ленится работать - малая мощность потребления, то снижаем целевую температуру. Тут минус - при обновлении режима, кондиционер издает звук, это может немного напрягать )

Второй вариант - вмешаться в схему кондиционера и заменить его внутренний датчик температуры электронным потенциометром на ESP8266, которым эмулировать показания термодатчика с уже фактической температурой, полученной от внешнего датчика.

Третий вариант - кондиционер имеет функцию работы от датчика температуры в пульте. Кладем пульт в нужное место, направив его на кондиционер. Пульт по ИК каналу передает температуру и кондиционер работает по ней, а не по своему внутреннему датчику. Разобрать бы протокол и сделать эмуляцию - это было бы оптимально, на мой взгляд.

Про писк и решение проблем с ним я в статье описАл вариант решения.
А по поводу протоколов, то по большому количеству кондеев это уже реализовано. Например, Mitsubishi electric может принимать внешнюю температуру как свою через стик ESP8266 и MQTT: https://mysku.ru/blog/diy/80716.html">https://mysku.ru/blog/diy/8071...

https://mysku.ru/blog/diy/80716.html">

Передача температуры от внешнего датчика на кондиционер происходит по MQTT топику HA_ROOMTEMP_SET_TOPIC. При получении значения кондиционер отключает считывание значений с внутреннего датчика от следующего отключения от питания.

Да понятное дело, что бипер можно физически заглушить или отключить.

Кондиционер у меня Cooper&Hunter (Gree) - в интеграциях там нет возможности указывать температуру с внешнего датчика, увы.

У меня тоже C&H ICY2 и с наступлением холодов задумался о подобной автоматизации.

Проблема в том, что похоже кондиционер периодически переходит с датчика температуры на пульте на внутренний датчик, а вернуть его обратно получается только с пульта.

Еще хочу в автоматизации добавить переход в режим увеличенной скорости, если никого нет дома - эффективность отопления растет (потребляемая мощность падает)

А вот второй вариант решения был бы оптимальным... 

Да, второй вариант мне тоже кажется оптимальным, но сейчас обновили интеграцию в HA и она теперь отдает температуру с датчика в кондиционере, так что дельту можно вычислять между истинной температурой и той, что видит кондиционер, регулируя исходя из этого температуру установки.

Для отопления не очень подходит. У меня внутренний блок стоит наверху и у потолка он быстро догоняет до 28-30 градусов и стопорит.

пока сделал автоматизацию, если датчик кондиционера (с учётом того что включен датчик пульта) более чем на 6 градусов выше внешнего датчика, то надо дойти до пульта и нажать кнопку. Наблюдаю...



Коллеги подскажите пожалуйста где в данной плате "пищалка" динамик?. Это faikin ftxb25c. Весь интернет перерыл, только у вас есть подсказка, но описанного элемента не видно(

https://drive.google.com/file/d/1HBh8M-ri6a_Eg5TE5bmJ1-qujHfnZs80/view?usp=sharing">https://drive.google.com/file/...

https://drive.google.com/file/d/1KNgWYe6ql8zK7h6ZZ0sb1EM87kCC4lSY/view?usp=sharing">https://drive.google.com/file/...

У меня что-то типа такого - гуглится по "Пассивный пьезодинамик (buzzer)"
Недавно только сделал себе поддержку климата в доме для конкретной температуры с использованием разных устройств в связке, но никак не мог придумать, как бы использовать больше режимов кондиционера, а не только максимальный на вкл/выкл. Статья очень интересная, беру доделывать к себе ваши идеи :)

Вернуться назад
Вернуться назад