Статья

Подключение кондиционеров Haier к Home Assistant

Предисловие

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

Способ управления

Для интеграции кондиционера Haier в HA он должен иметь модуль управления по Wi-Fi (я установил внутренние блоки серии Lightera). Штатное управление кондиционером по Wi-Fi осуществляется через серверы Haier, как и любые другие аналогичные решения, например, Xiaomi. Такой подход нам не годится.

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

Блок управления кондиционером
Штатный Wi-Fi модуль

И тут мне повезло наткнуться на одну статью, в которой представлена вся техническая часть по созданию собственного модуля для управления кондиционерами Haier по протоколу MQTT, в качестве сервера у автора использовался ioBrocker. В силу того, что с изготовлением подобных устройств я никогда не сталкивался, то просто связался с автором статьи и заказал сразу 3 модуля - по 1 штуке на каждую комнату.

Итого для интеграции требуется:

  • внутренний блок Haier с поддержкой Wi-Fi (в моем случае - Lightera);
  • специальный модуль управления;
  • сервер умного дома с MQTT (в моем случае - hassio, в связке с mosquitto).

Подключение

Получив заказанные модули аккурат перед первой неделей самоизоляции, я принялся к подключению кондиционера к Home Assistant, его дальнейшей настройке и написанию интерфейса.

Далее по шагам:

2. Находим в окне настройки свою Wi-Fi сеть 2,4ГГц, вводим пароль и заполняем следующие поля:

  • ip адрес MQTT сервера - у меня это адрес малины;
  • порт сервера MQTT, не трогаем;
  • логин от mosquitto;
  • пароль от mosquitto;
  • имя кондиционера (как я понял, ни на что не влияет);
  • путь к топикам MQTT для конкретного модуля. Если у вас 1 кондиционер - можно не править. Если 2 и более - у каждого должен быть уникальный путь, у меня это "myhome/topic", "myhome/topic2" и "myhome/topic3".

После заполнения граф и нажатия кнопки "save", модуль подключится к домашней сети Wi-Fi и к MQTT-серверу.

3. Для проверки работоспособности подключенного модуля, я использую MQTT explorer. Тут все довольно просто: логинимся на свой MQTT сервер, включаем кондиционер с пульта, и если все работает - видим все топики кондиционера. Самые важные:

  • Power - питание - on, off;
  • Set_Temp - целевая температура - от 16 до 30 градусов по Цельсию;
  • Current_Temp - температура, которую измеряет кондиционер;
  • Mode - режим работы кондиционера - cool, heat, smart, vent, dry;
  • Fan_speed - скорость потока - min, mid, max, auto;
  • Swing - направление потока воздуха - ud (вверх/вниз), lr (влево/вправо), off, (нет движения), all (движение шторок в обоих направлениях);
  • Lock_Remote - блокировка кнопок пульта - true, false;

  • RAW - код команды, который считывает кондиционер.

Настройка

Убедившись, что кондиционер подключён к MQTT-серверу, добавляем в configuration. yaml компонент климата:

climate: - platform: mqtt name: cond_zal modes: - "cool" - "heat" - "smart" - "vent" - "dry" fan_modes: - "min" - "mid" - "max" - "auto" swing_modes: - "ud" - "lr" - "all" - "off" max_temp: 30 min_temp: 16 precision: 1.0 retain: true power_command_topic: "myhome/topic/set/Power" mode_command_topic: "myhome/topic/set/Mode" mode_state_topic: "myhome/topic/Mode" temperature_command_topic: "myhome/topic/set/Set_Temp" temperature_state_topic: "myhome/topic/Set_Temp" fan_mode_command_topic: "myhome/topic/set/Fan_Speed" fan_mode_state_topic: "myhome/topic/Fan_Speed" swing_mode_command_topic: "myhome/topic/set/Swing" swing_mode_state_topic: "myhome/topic/Swing" current_temperature_topic: "myhome/topic/Current_Temp"

P.S. Опытным путем установлено, что топик для чтения состояния имеет путь "myhome/topic/***", а топик для изменения состояния - "myhome/topic/set/***". 

Однако со штатным компонентом климата не все так гладко.

Во-первых. Выбор режимов работы кондиционера ограничивается встроенными в компонент состояниями: “auto”, “off”, “cool”, “heat”, “dry”, “fan_only”, из-за чего режимами "smart" и "vent" воспользоваться не удастся.

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

P.S. Если Вам известна возможность отладить эту интеграцию при помощи средств HA, прошу отписаться в комментариях :) 

Настройка. Другой путь

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

1. Питание. Включение и выключение кондиционера отдельным переключателем.

switch: - platform: mqtt name: ac_zal_power icon: mdi:power-standby command_topic: "myhome/topic/set/Power" state_topic: "myhome/topic/Power" payload_off: "off" payload_on: "on" state_off: "off" state_on: "on"

2. Сенсоры. Прописываем необходимые сенсоры: целевая температура, текущая температура, режим работы, скорость и направление потока. Остальное не нужно, если им не пользоваться.

# Выставленная температура - platform: mqtt name: ac_zal_set_temp state_topic: 'myhome/topic/Set_Temp' unit_of_measurement: "°C" icon: mdi:thermometer # Текущая температура - platform: mqtt name: ac_zal_current_temp state_topic: 'myhome/topic/Current_Temp' unit_of_measurement: "°C" icon: mdi:thermometer # Режим работы - platform: mqtt name: ac_zal_mode state_topic: 'myhome/topic/Mode' icon: mdi:hvac # Скорость потока - platform: mqtt name: ac_zal_fan_speed state_topic: 'myhome/topic/Fan_Speed' icon: mdi:concourse-ci # Направление потока - platform: mqtt name: ac_zal_swing state_topic: 'myhome/topic/Swing' icon: mdi:tailwind

3. Скрипты. Для управления кондиционером создаем скрипты. Для себя я сделал дополнительные условия их срабатывания - кондиционер должен быть включен. Вы же эту часть кода можете вырезать без потери основного функционала.

############################## #### Режимы #### ############################## # Обогрев ac_zal_heat_on: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: template value_template: "{{ not is_state ('sensor.ac_zal_mode', 'heat') }}" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Mode' payload: 'heat' # Охлаждение ac_zal_cool_on: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: template value_template: "{{ not is_state ('sensor.ac_zal_mode', 'cool') }}" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Mode' payload: 'cool' # Автоматический режим ac_zal_smart_on: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: template value_template: "{{ not is_state ('sensor.ac_zal_mode', 'smart') }}" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Mode' payload: 'smart' # Режим вентиляции ac_zal_vent_on: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: template value_template: "{{ not is_state ('sensor.ac_zal_mode', 'vent') }}" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Mode' payload: 'vent' # Осушение ac_zal_dry_on: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: template value_template: "{{ not is_state ('sensor.ac_zal_mode', 'dry') }}" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Mode' payload: 'dry' ################################# #### Регулировка температуры #### ################################# # Прибавить ac_zal_temp_up: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: numeric_state entity_id: sensor.ac_zal_set_temp below: 30 - service: mqtt.publish data_template: topic: 'myhome/topic/set/Set_Temp' payload_template: "{{ states.sensor.ac_zal_set_temp.state|int 1 }}" # Убавить ac_zal_temp_down: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: numeric_state entity_id: sensor.ac_zal_set_temp above: 16 - service: mqtt.publish data_template: topic: 'myhome/topic/set/Set_Temp' payload_template: "{{ states.sensor.ac_zal_set_temp.state|int - 1 }}" ############################## #### Скорость потока #### ############################## # Минимальная ac_zal_fan_speed_min: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: template value_template: "{{ not is_state ('sensor.ac_zal_fan_speed', 'min') }}" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Fan_Speed' payload: 'min' # Средняя ac_zal_fan_speed_mid: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: template value_template: "{{ not is_state ('sensor.ac_zal_fan_speed', 'mid') }}" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Fan_Speed' payload: 'mid' # Максимальная ac_zal_fan_speed_max: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: template value_template: "{{ not is_state ('sensor.ac_zal_fan_speed', 'max') }}" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Fan_Speed' payload: 'max' # Автоматическая ac_zal_fan_speed_auto: sequence: - condition: and conditions: - condition: state entity_id: switch.ac_zal_power state: "on" - condition: template value_template: "{{ not is_state ('sensor.ac_zal_fan_speed', 'auto') }}" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Fan_Speed' payload: 'auto' ############################ #### Регулировка шторок #### ############################ # Регулировка по вертикали ac_zal_swing_up_down: sequence: - condition: state entity_id: switch.ac_zal_power state: "on" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Swing' payload_template: > {% if is_state('sensor.ac_zal_swing', 'all') %} {{ "lr" }} {% elif is_state('sensor.ac_zal_swing', 'lr') %} {{ "all" }} {% elif is_state('sensor.ac_zal_swing', 'off') %} {{ "ud" }} {% else %} {{ "off" }} {% endif %} # Регулировка по горизонтали ac_zal_swing_left_right: sequence: - condition: state entity_id: switch.ac_zal_power state: "on" - service: mqtt.publish data_template: topic: 'myhome/topic/set/Swing' payload_template: > {% if is_state('sensor.ac_zal_swing', 'all') %} {{ "ud" }} {% elif is_state('sensor.ac_zal_swing', 'ud') %} {{ "all" }} {% elif is_state('sensor.ac_zal_swing', 'off') %} {{ "lr" }} {% else %} {{ "off" }} {% endif %}

По поводу регулировки шторок.

Когда топик "Swing" имеет значение "ud" (или "all"), шторки, регулирующие направление потока по вертикали, начинают плавно двигаться, при смене значения топика на "lr" или "off" - останавливаются и фиксируются в нужном положении.

Когда топик "Swing" имеет значение "lr" (или "all"), шторки, регулирующие направление потока по горизонтали, начинают плавно двигаться. Однако, при отключении этой регулировки (значение топика "ud" или "off"), они возвращаются в центральное положение. Т.е. тут реализуется либо постоянное изменение направления потока воздуха по горизонтали, либо блокировка потока только по направлению "вперед". Как быть в такой ситуации:

установить комфортное направление потока воздуха по горизонтали с пульта ДУ и больше никогда не трогать эту регулировку;периодически пользоваться пультом.Т.к. используемый Wi-Fi модуль повторяет функционал штатного модуля и приложения "Smart Air", то приходится мириться с некоторыми ограничениями данной интеграции.

Интерфейс

Для управления кондиционером через lovelace можно воспользоваться следующими решениями:

  • специальные карточки, например: раз, два, три. Однако, как написано выше, часть функционала может быть недоступна;
  • проявить фантазию и воспользоваться всеми доступными инструментами HA.
Прописать все кнопки управления в lovelace, используя button-card.
Вывести только основные кнопки в lovelace, используя button-card. При помощи browser_mod создать всплывающие окна для выбора режимов работы, установки скорости и регулировки шторок.
Пример всплывающих окон.

Заключение

В данной статье я постарался изложить основные положения интеграции кондиционеров Haier в Home Assistant. Штатные функции кондиционера, доступные с пульта ДУ (например, "sleep" и "здоровый сон"), можно воссоздать при помощи автоматизаций, а при желании - создать свои уникальные связки с другими компонентами вашей системы.

Спасибо за внимание! Буду рад почитать ваши решения по интеграции и автоматизации кондиционеров в системы умного дома!


А не проще было подыграть родному модулю при помощи компонента REST в Home Assistant?

Я компонентом REST никогда не пользовался. Как через него это можно сделать?

REST компонент позволяет делать веб-запросы. Очевидно, что устройство управляется через родной стик именно ими. Нужно лишь "подслушать" его протокол общения с родным приложением и воспроизвести его компонентом

Всего лишь подслушать зашифрованный REST API, написать генератор токенов, на роутере настроить редирект пакетов. Это слишком просто, так любой дурак может.

Как оказалось это действительно возможно.

https://github.com/bstuff/haier-ac-remote/tree/master/packages/haier-ac-remote">https://github.com/bstuff/haie...

Отличная статья!А что слать в топик для опроса?Я чуть иначе опрос сделал, шлю команду FF FF 0A 00 00 00 00 00 01 01 4D 01 5A в топик RAW

Спасибо!

Достаточно включить кондиционер либо с пульта, либо из HA и все состояния топиков (сенсоров и переключателя) считаются автоматически. Топиком ROW я вообще не пользуюсь, достаточно топиков Power, Set_Temp и т.п.


Да не)Пульты я убрал в шкаф.Делаю автоматически опрос каждые 2 сек.Чтоб текущее состояние всегда актуально было.Та же температура

Модуль самостоятельно опрашивает кондей каждые 2 сек.

не проще ли https://github.com/bstuff/haier-ac-remote/tree/master/packages/homebridge-haier-ac">сразу в хоумбридж?

Может быть, но пользуюсь именно Home Assistant

Автор, дайте, пожалуйста, контакт того, кто делал этот стик) тоже хочу такой, готов приобрести.

Можно ещё ссылку на ваш кондиционер? Не могу разобраться в этих сериях.

У меня установлены внутренние блоки AS09NS4ERA и AS09NS5ERA. Их можно приобрести либо отдельно, либо в составе сплитсистемы

Не возникло проблем с этой серией внутренних блоков за это время ? Не шумные? А то пишут, что от перепада температур потрескивает пластик, мешает спать. Так ли это ?

UPD


Откорректирована прошивка Wi-Fi модуля, теперь кондиционер полностью работает через https://www.home-assistant.io/integrations/climate.mqtt/">MQTT HVAC

Т.е. теперь можно пользоваться стандартным компонентом Home-assistant и работает ВКЛ/ВЫКЛ.


Просто недели 2 назад купил модуль, только сегодня руки дошли, все заработало, а вот вкл/выкл не работает - печалька...

UPD. Если добавить в конфиг строчки 

  • aux_command_topic: "myhome/topic/set/Power" 
  • aux_state_topic: "myhome/topic/Power

Можно через дополнительный переключатель включать и выключать кондер. т.е. не нужны кастомные скрипты.

Выходит эту проблему можно было каким-то образом доделать штатными средствами :)

Однако обновление прошивки позволило добавить в HA режимы "авто" и "вентиляция".

Если пользоваться штатной или кастомной карточкой для ловеласа, то да, от скриптов можно отказаться. Но я все равно остановился на них, так как не нашел карточек, которые вписались бы в уже написанный интерфейс.

Прошивку сами допиливали? у автора статьи  по ссылке в гите прошивка обновлялась два года тому назад

Прошивку доделал Instalator по выявленным мной особенностям работы модуля в HA.
По поводу версии прошивки на гитхабе - не могу сказать какая именно выгружена, но https://github.com/instalator/ioBroker.haier">описание уже отредактировано с учетом доработок кода, таких как замена "smart" на "auto", "vent" на "fan_only", а включение\выключение продублировано через режимы работы кондиционера.

Статья на гитхабе, на которую вы ссылаетесь относится к ioBroker. Это ошибка или я что-то не понимаю? 

Скажите, а configuration.yaml в статье актуальный?
Сегодня пришел модуль, mqtt его видит, при прописывании в home assistant конфига из статьи ловлю ошибки:
ERROR (MainThread) [homeassistant.components.mqtt.climate] Invalid modes mode: auto
ERROR (MainThread) [homeassistant.components.mqtt.climate] Invalid modes mode: off



Подозреваю  что проблема примитивная но опята с  hass очень мало.

Остальные режимы работают?

Я просто до конца не понял, про какой из  топиков ругань.
Если про  modes, то в конфиге есть режимы modes:
- "cool"
- "heat"
- "smart" - "vent"
- "dry", а управляя с пульта и смотря что видит mqtt explorer мой внутренний блок умеет только  cool, heat и dry.
Еще раз - с hass опыта маловато - мне надо понять, про какой кусок конфига ошибка.

Напишите мне в телеграмм. Помогу разобраться

Там можно самому допилить несколько строк. Переименовать режимы и добавить off через RAW команду.

Подскажите в ХК будет работать? И буде ли работать такой свисток с кондиционерами midea, принцип работы через облако один в один?



В HomeKit работает.

Свисток сделан специально haier.

https://sprut.ai/static/media/cache/00/52/36/5/3478175/56091/1000x_image.png?1587118502" alt="1000x_image.png?1587118502" />

Здравствуйте. Я ни как не могу понять, прямо сейчас в данный момент у вас что зашито в esp8266 чтобы работало по mqtt с HomeAssistant? 

Можете прямо ссылку дать? Насколько я понял, в данный момент автор данного шилда использует его просто как шлюз обмена данных между его системой ioBroker и кондиционером. Что делать нам, HomeAssistant'цам?  Что шить? 

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

А какого размера smd компоненты под эту плату?
А какого размера smd компоненты под эту плату?
А какого размера smd компоненты под эту плату?

Доброго времени суток всем. А вот задачка такая: с чем может быть связано долгое обновление состояний?
Сейчас, например, время 18:09. Обновление «power» = 15:22, «fanspeed» = 16:26. Сейчас 9 утра, последнее обновление на полночь ("health" на 2 ночи. Проскакивает периодически обновление с интервалом в пару минут или с неправильными данными (фанспид на "max" или температура в комнате 0, заданная 199). При этом управление (из iobroker) [включение, задатчик температуры] работают. Индикатор мигает когда включен драйвер - опрос, по всей видимости идёт. Идеи?)

Так вы используете iobroker или homeassistant?

Эм..я, походу, не совсем в тему попал :/ 

Но может тут дельная мысль найдётся :)


iobroker+драйвер+самопрошитая по инструкции esp


И снова поправка: Ответ приходит в виде 5-12 строк различной длины и общей длиной 36-37 байт за ~70мс. И свежий драйвер начинает ругаться на них (на каждую отдельно). Видимо, истина где-то рядом. Маловероятно, но теперь может подскажет кто как подкрутить драйвер, чтоб он объединял все отдельные строки в одну целую?) 

Супер конечно, спасибо. Но это только для Haier, а есть хоть какое-то решение для любого тупого кондиционера сделать его умный с помощью какой-нибудь платы ESP? Перерыл весь интернет. Не нашел решения. Универсальные пульты не вариант. Не берут большинство моделей. Да ИК не надежные.

ну кроме обратной связи, все остальное можно сделать и с помощью ИК пульта

Александр, если не сложно, дайте пожалуйста кусок Lovelace, относящийся к button-card.

Если кто (как я) проникнется покупкой инверторного Haier на 35кв.м., делюсь своим опытом. Самый дешевый выходит HSU-12HTM103/R3(DB), на маркетах указана опциональная поддержка wi-fi. На прошлой неделе получил такой. Во внутреннем блоке есть место для wi-fi  модуля, но порта USB "мама" не оказалось. На плате порт CN35 распаян. В техподдержке Haier сказали, что нужно в сервисе купить кабель парт-номер A0010402992 (в zip-магазинах 850р., у официалов 300р.) или wi-fi модуль (не наш случай) KZW-W002(W).

Спасибо за статью. Главной проблемой для меня оставался именно кондей в HA. Есть какие-то новости по этому моменту. Через пару-тройку месяцев буду заказывать 4 кондея себе. Пока остановился на таком же, как у Александра (alex.pod) - AS09NS4ERA. Но если проверенные варианты дешевле? У меня комнаты 15кв.м.
И кстати, я правильно понимаю, что готовые модули никто не делал на поток? Нужно самому делать его?

Массовых продаж этих свистков я не видел. Либо у умельцев под заказ искать, либо самому делать.
С таким стиком должен работать любой внутренний блок от хаера, для которого предусмотрено дистанционное управление через вай фай модуль (2ое фото в статье) через приложение HaierSmartAir2. 

Александр, а к таким умельцам не относите себя? Было бы классно

Увы ) пришлось заказывать ))

А не подскажешь, где?

В статье есть ссылка

В Sprut.HUB получилось у кого-нибудь завести?

Поделитесь, пожалуйста интерфейсом управление кондером с button-card и browser_mod из статьи.

Сегодня наконец-то появилась возможность реализовать данное чудо. из 4 кондеев пока на одном проверил. Спасибо автору за статью и разработчику за дивайс.

Alex.pod, не поделишься интерфейсом? У тебя красиво получилось



Спасибо :)

Основа интерфеса взята https://github.com/matt8707/hass-config">отсюда.
Вариант с моими доработками: https://drive.google.com/drive/folders/1h42yvO14u5eBsMI3WjudrewFqsLPuihn">тут

Спасибо!!!
Кстати, вот тут мой HA ругается. У тебя нет проблем и предупреждений?:

#################################
#### Регулировка температуры ####
#################################
# Прибавить
ac_zal_temp_up:
sequence:
- condition: and
conditions:
- condition: state
entity_id: switch.ac_zal_power
state: "on"
- condition: numeric_state
entity_id: sensor.ac_zal_set_temp
below: 30
- service: mqtt.publish
data_template:
topic: 'myhome/topic/set/Set_Temp'
payload_template: "{{ states.sensor.ac_zal_set_temp.state|int 1 }}"
# Убавить
ac_zal_temp_down:
sequence:
- condition: and
conditions:
- condition: state
entity_id: switch.ac_zal_power
state: "on"
- condition: numeric_state
entity_id: sensor.ac_zal_set_temp
above: 16
- service: mqtt.publish
data_template:
topic: 'myhome/topic/set/Set_Temp'
payload_template: "{{ states.sensor.ac_zal_set_temp.state|int - 1 }}

Изменил 

states.sensor.ac_zal_set_temp.state|int   1

и добавил +

states.sensor.ac_zal_set_temp.state|int + 1

Скрипт еще не проверил, но ошибка пропала


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