tion_home_assistant icon indicating copy to clipboard operation
tion_home_assistant copied to clipboard

Перестала правильно работать служба управления вентилятором set_fan_mode

Open false-coder opened this issue 1 year ago • 21 comments

При вызове службы управления вентилятором climate.set_fan_mode происходит ошибка, когда в качестве параметра заданы диапазоны скорости и/или CO (вообще при наличии любых чисел в тексте параметра), например 2-4:800:

  - service: climate.set_fan_mode
    metadata: {}
    data:
      fan_mode: 2-4:800
    target:
      entity_id: climate.tion_breezer_4s_1

Службу вызываю из автоматизации, созданной в графическом интерфейсе. Даже без выполнения всей автоматизации, просто при запуске одного блока вручную прямо из графического редактора автоматизации, вылезает окно "Ошибка при выполнении действия Unknown error".

Если в fan_mode задано "auto" или "off", то срабатывает правильно. Во всех остальных случаях пишет, что ожидается str, а найден int. Раньше работало, но в какой-то момент перестало, заметил с месяц назад. При попытке вызова службы set_fan_mode в логе выскакивает сразу две ошибки:

2024-01-15 12:34:15.309 ERROR (MainThread) [homeassistant.helpers.script.websocket_api_script] websocket_api script: Error executing script. Unexpected error for call_service at pos 1: sequence item 2: expected str instance, int found
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 713, in _async_call_service_step
    response_data = await self._async_run_long_action(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 675, in _async_run_long_action
    return long_task.result()
           ^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2149, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2186, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 272, in handle_service
    return await service.entity_service_call(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 882, in entity_service_call
    single_response = await _handle_entity_call(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 952, in _handle_entity_call
    result = await task
             ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 565, in async_handle_set_fan_mode_service
    self._valid_mode_or_raise("fan", fan_mode, self.fan_modes)
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 526, in _valid_mode_or_raise
    modes_str: str = ", ".join(modes) if modes else ""
                     ^^^^^^^^^^^^^^^^
TypeError: sequence item 2: expected str instance, int found
2024-01-15 12:34:15.324 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [139681795744064] Error handling message: Unknown error (unknown_error) Сергей from 172.16.0.1 (Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 YaBrowser/23.11.0.0 Safari/537.36)
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/decorators.py", line 26, in _handle_async_response
    await func(hass, connection, msg)
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 782, in handle_execute_script
    script_result = await script_obj.async_run(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1587, in async_run
    return await asyncio.shield(run.async_run())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 426, in async_run
    await self._async_step(log_exceptions=False)
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 479, in _async_step
    self._handle_exception(
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 502, in _handle_exception
    raise exception
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _async_step
    await getattr(self, handler)()
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 713, in _async_call_service_step
    response_data = await self._async_run_long_action(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 675, in _async_run_long_action
    return long_task.result()
           ^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2149, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2186, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/entity_component.py", line 272, in handle_service
    return await service.entity_service_call(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 882, in entity_service_call
    single_response = await _handle_entity_call(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 952, in _handle_entity_call
    result = await task
             ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 565, in async_handle_set_fan_mode_service
    self._valid_mode_or_raise("fan", fan_mode, self.fan_modes)
  File "/usr/src/homeassistant/homeassistant/components/climate/__init__.py", line 526, in _valid_mode_or_raise
    modes_str: str = ", ".join(modes) if modes else ""
                     ^^^^^^^^^^^^^^^^
TypeError: sequence item 2: expected str instance, int found

Пробовал задавать значение по всякому, и в кавычках, и через | и >-, и даже так - {{ ("2-4:800")|string }}, безрезультатно.

Бризер Тион 4S. Версия компонента c055732 (1.03) Core 2024.1.3 Supervisor 2023.12.0 Operating System 11.4

false-coder avatar Jan 15 '24 10:01 false-coder

Это ошибка в HomeAssistant Core в версии 2024.01.хх Вот описание проблемы не только с Тионом https://github.com/home-assistant/core/issues/107633

RealLord avatar Jan 16 '24 12:01 RealLord

Это ошибка в HomeAssistant Core в версии 2024.01.хх Вот описание проблемы не только с Тионом home-assistant/core#107633

В HomeAssistant Core ошибок нет, они просто в этой версии привели тип данных к обязательному str. Об этом писали тут еще в декабре 2022: https://github.com/airens/tion_home_assistant/issues/37 На стороне HA это поправлено не будет, надо править интеграцию.

Но я согласен с airens, https://github.com/airens/tion_home_assistant/issues/47#issuecomment-1890846214 вообще непонятно, как теперь передать в бризер целевой уровень CO2 и ограничения по скорость (1-2, например), если согласно спецификации fan_modes должны быть предустановлены заранее.

Наверное, только городить input_number'ы для целевого CO2 и типа приточки (дом, улица, смешанный), и еще input_text для режимов работы вентилятора с ограничениями ("1-3").
А в fan_mode и fan_modes оставить жесткие режимы (0,1,2,3,4,5, auto, off) для того, чтобы в другие системы (в умный дом яндекса и гугл) улетало то, что они способны увидеть, а также, чтобы можно было через стандартную карточку включить этот жесткий режим. Ну и увидеть текущий.

Вот тут еще похожее предложение писали: https://github.com/airens/tion_home_assistant/issues/46#issuecomment-1892000281

aatemes avatar Jan 17 '24 08:01 aatemes

В общем, есть предложение, как переделать модуль для работы по CO2. Я пока остановился на том, чтобы сделать:

  1. Управление воздухозабором через swing_modes: например swing_horisontal = outside, swing_vertical = inside, swing_both = mixed
  2. Управление CO2 можно уже сейчас делать через разные скрипты, текущий уровень CO2 уже есть в переменных. Его можно получить и обработать в НА. Переменная например: sensor.magicair_co2
  3. Часть режимов можно сделать через PRESET_MODE: SLEEP, ACTIVITY, BOOST и т.п. там их 7 штук. Можно задать типовые варианты сразу в коде.

Например у меня все 5 бризеров работают всего в 2-х режимах, и у знакомы тоже так же. В спальне, включаем с 20:00 и до 08:00 на 1 скорость. Например режим PRESET_SLEEP В гостиной и кабинете, включаем с 08:00 до 21:00 на 2 скорость. Например режим PRESET_ACTIVITY

Написать типовой скрипт несложно: Получили текущее значение CO2 в НА, выставили нужную скорость через службу.

RealLord avatar Jan 22 '24 17:01 RealLord

Обновил компонент, вроде все что хотел сделал. Описание: https://github.com/RealLord/tion_home_assistant У меня 5 бризеров дома, в кабинетах, в спальне, в гостинной. Все работает стабильно, на 3S/4S.

4 бризера работают по пресету:

  • два по SLEEP в спальнях в 21:00
  • два в кабинетах по пресету ACTIVITY в 08:00

Один по CO2 от Air Magic в гостиной по скрипту, который раз в минуту запускается, определяет СО2 и выставляет скорость вентилятора.

RealLord avatar Jan 24 '24 17:01 RealLord

Один по CO2 от Air Magic в гостиной по скрипту, который раз в минуту запускается, определяет СО2 и выставляет скорость вентилятора

приветствую, покажите, пожалуйста, скрипт ПС: как же нам усложнили жизнь, как прекрасно жилось с целевой уставкой типа 1-4:800

bisquit2003 avatar Jan 26 '24 06:01 bisquit2003

Уточню, там не скрипт, а 4 типовые автоматизации, неправильно выразился. Руки пока не доходят собрать из них скрипт с условиями скорости в зависимости от CO2 .

description: "Кабинет TION СО2 500-600"
mode: single
trigger:
  - platform: time_pattern
    minutes: "5"
condition:
  - condition: numeric_state
    entity_id: sensor.magicair_co2
    above: 500
    below: 600
action:
  - service: climate.set_fan_mode
    target:
      entity_id: climate.tion_breezer_3s_2_2
    data:
      fan_mode: "2"

description: "Кабинет TION СО2 600-700"
mode: single
trigger:
  - platform: time_pattern
    minutes: "5"
condition:
  - condition: numeric_state
    entity_id: sensor.magicair_co2
    above: 601
    below: 700
action:
  - service: climate.set_fan_mode
    target:
      entity_id: climate.tion_breezer_3s_2_2
    data:
      fan_mode: "3"
description: "Кабинет TION СО2 700-800"
mode: single
trigger:
  - platform: time_pattern
    minutes: "5"
condition:
  - condition: numeric_state
    entity_id: sensor.magicair_co2
    above: 701
    below: 800
action:
  - service: climate.set_fan_mode
    target:
      entity_id: climate.tion_breezer_3s_2_2
    data:
      fan_mode: "4"
description: "Кабинет TION СО2 900+"
mode: single
trigger:
  - platform: time_pattern
    minutes: "5"
condition:
  - condition: numeric_state
    entity_id: sensor.magicair_co2
    above: 901
action:
  - service: climate.set_fan_mode
    target:
      entity_id: climate.tion_breezer_3s_2_2
    data:
      fan_mode: "6"

У меня бризеры включены почти все время, поэтому реально скорость выше 3 не поднимается вообще.

RealLord avatar Jan 26 '24 08:01 RealLord

Уточню, там не скрипт, а 4 типовые автоматизации, неправильно выразился. Руки пока не доходят собрать из них скрипт с условиями скорости в зависимости от CO2 .

https://pastebin.com/raw/t71fex2e спасибо, накидал скрипт и одна автоматизация, в которой триггер - любое изменение датчика со2 из скрипта действие - запуск скрипта принимаю критику по значениям уровня со2) Зы: в условиях везде кроме 0 скорости - сигнализация, чтоб оно по итогу просто выключило бризер

bisquit2003 avatar Jan 26 '24 16:01 bisquit2003

Обновил компонент, вроде все что хотел сделал.

Простите, не знаю как в вашем форке отписаться. Не очень понимаю как режим вентилятора бризера auto работает. Пытаюсь его выбрать, он либо сбрасывается на предыдущий числовой, либо выключает бризер (закономерность не понял, проверял на низком уровне со2 около 550, целевая 800) Так же у вас пресеты в форке описаны, но ха их не понимает и просит другие (в целом ха пишет какие, поэтому это не доставило проблем, а потом я от пресетов отказался в принципе)

bisquit2003 avatar Jan 27 '24 21:01 bisquit2003

Напишите в телегу @Dmitry_Durandin И проверьте пожалуйста, последняя ли у Вас версия с моего форка.

RealLord avatar Jan 28 '24 16:01 RealLord

Уточню, там не скрипт, а 4 типовые автоматизации, неправильно выразился. Руки пока не доходят собрать из них скрипт с условиями скорости в зависимости от CO2 .

https://pastebin.com/raw/t71fex2e спасибо, накидал скрипт и одна автоматизация, в которой триггер - любое изменение датчика со2 из скрипта действие - запуск скрипта принимаю критику по значениям уровня со2) Зы: в условиях везде кроме 0 скорости - сигнализация, чтоб оно по итогу просто выключило бризер

посмотрел код. сразу вопросы- показатели CO2 это 0,01% CO2 в воздухе. считается что воздухе (если вы не в оранжерее где растения активно поглощают углекислый газ его содержание 4% - 400). у вас первое условие - выключить бризер при CO2 <350. Как такое может быть?

AlexeyTorch avatar Jan 30 '24 09:01 AlexeyTorch

посмотрел код. сразу вопросы- показатели CO2 это 0,01% CO2 в воздухе. считается что воздухе (если вы не в оранжерее где растения активно поглощают углекислый газ его содержание 4% - 400). у вас первое условие - выключить бризер при CO2 <350. Как такое может быть?

я думаю чо датчик подвирает, потому что меньше 400 показывает изредка. в отпуске были, показывал 269. понимаю что фантастика

bisquit2003 avatar Jan 30 '24 09:01 bisquit2003

@RealLord к сожалению у Вас похоже запрещено создавать Issues в проекте, или я не нашёл где быть первым :(

подскажите, может я что-то не так делаю. в NodeRed пытаюсь передать "авто" следующим образом: msg.payload = { data: { "fan_mode": "auto" } } в Call Services. Нода говорит что всё ок, команда прошла. но бризер не переводится в Авто Режим. Проверил в приложении от тионов. Хотя если той же строкой передать цифру или off - то всё отлично отрабатывает.

Если я пытаюсь обоготить строку добавив target_co2: msg.payload = { data: { "fan_mode": "auto","target_co2":"800" } } то получаю ошибку: "HomeAssistantError: extra keys not allowed @ data['target_co2']"

Возможно я что-то не учитываю? Раньше достаточно было передать просто "авто", теперь похоже что-то изменилось, но я ни как не пойму что.

чуть уточню: мне не нужно передавать бризеру параметры по моей задумке. мне просто нужно включить его в Авто режим, чтобы он настройки взял из тех, что у него были настроены в приложении. раньше это работало просто через передачу "auto"

заранее спасибо за помощь :)

dima81rus avatar Feb 02 '24 17:02 dima81rus

@RealLord к сожалению у Вас похоже запрещено создавать Issues в проекте, или я не нашёл где быть первым :(

подскажите, может я что-то не так делаю. в NodeRed пытаюсь передать "авто" следующим образом: msg.payload = { data: { "fan_mode": "auto" } } в Call Services. Нода говорит что всё ок, команда прошла. но бризер не переводится в Авто Режим. Проверил в приложении от тионов. Хотя если той же строкой передать цифру или off - то всё отлично отрабатывает.

Если я пытаюсь обоготить строку добавив target_co2: msg.payload = { data: { "fan_mode": "auto","target_co2":"800" } } то получаю ошибку: "HomeAssistantError: extra keys not allowed @ data['target_co2']"

Возможно я что-то не учитываю? Раньше достаточно было передать просто "авто", теперь похоже что-то изменилось, но я ни как не пойму что.

чуть уточню: мне не нужно передавать бризеру параметры по моей задумке. мне просто нужно включить его в Авто режим, чтобы он настройки взял из тех, что у него были настроены в приложении. раньше это работало просто через передачу "auto"

заранее спасибо за помощь :)

переходите на проект esp_tion. Стоимость «флешки» 1500₽ и получите локальный бризер

bisquit2003 avatar Feb 02 '24 18:02 bisquit2003

переходите на проект esp_tion. Стоимость «флешки» 1500₽ и получите локальный бризер

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

dima81rus avatar Feb 02 '24 18:02 dima81rus

переходите на проект esp_tion. Стоимость «флешки» 1500₽ и получите локальный бризер

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

Реализован сторонним разработчиком, у меня работает. И автор проекта обещает в скором времени релиз с авто режимом

bisquit2003 avatar Feb 02 '24 18:02 bisquit2003

буду за ним так же следить. но в данный момент он не поможет мне решить мою задачу с автоматическим режимом - он в нём пока ещё не реализован

Ну как как мы говорим про интеграции в HA то для ESP HOME есть как минимум два варианта автоматизации.

  1. Полностью автоматический режим внутри ESP, когда из HA берутся показания внешнего датчика CO2,
  2. с помощью template sensor, в котором описывается скорость, в зависимости о времени суток и внешнего co2, и автоматизации реагирующей на этот template

AlexeyTorch avatar Feb 02 '24 18:02 AlexeyTorch

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

К сожалению, пока не смог придумать никакого способа нормально сделать изменение target_co2. В текущей реализации объекта Climate просто нет никаких доступных методов указать СО2. Я уже пару недель думаю над этим вопросом, пока кроме пары пресетов AUTO (speed=1:6, target_co2=800) и COMFORT (speed=1:4, target_co2=600) ничего придумать не смог. Нельзя в текущей организации HomeAssistant добавлять методы и задавать переменные. Свойства - можно сколько угодно, а вот методы жестко заданы в Объекте Climate НА.

Для интересующихся, вот ссылка на описание объекта Climate https://developers.home-assistant.io/docs/core/entity/climate/

RealLord avatar Feb 03 '24 09:02 RealLord

Для интересующихся, вот ссылка на описание объекта Climate https://developers.home-assistant.io/docs/core/entity/climate/

а мы не можем как то сначала преднастраивать бризер через параметры, а только потом пытаться включить его через климат в авто режим? в НодРеде это решалось бы через 2 итерации. но это и не проблема. как бы это выглядило в ХА - не знаю, давно ушёл в ноду, уже и забыл как там всё в жинже пишется.

dima81rus avatar Feb 03 '24 09:02 dima81rus

Выкатил релиз 1.06 https://github.com/RealLord/tion_home_assistant/blob/master/CHANGELOG.md

а мы не можем как то сначала преднастраивать бризер через параметры, а только потом пытаться включить его через климат в авто режим? в НодРеде это решалось бы через 2 итерации. но это и не проблема. как бы это выглядило в ХА - не знаю, давно ушёл в ноду, уже и забыл как там всё в жинже пишется.

Здесь примерно то же самое, вот чем можно управлять:

  • источник воздуха через swing_mode
  • скорость вентилятора через fan_mode (здесь же режим авто)
  • обогреватель ON/OFF через HVACMode (OFF, HEAT, FAN_ONLY)

Порядок управления не имеет значения. Но самое простое включение через пресет и потом если надо, дополнительно регулировка необходимого параметра.

RealLord avatar Feb 04 '24 10:02 RealLord

предлагаю перенести дискуссию с идеей по включению в проект: https://github.com/RealLord/tion_home_assistant/discussions/3

dima81rus avatar Feb 04 '24 12:02 dima81rus

Выкатил релиз 1.06 https://github.com/RealLord/tion_home_assistant/blob/master/CHANGELOG.md

а мы не можем как то сначала преднастраивать бризер через параметры, а только потом пытаться включить его через климат в авто режим? в НодРеде это решалось бы через 2 итерации. но это и не проблема. как бы это выглядило в ХА - не знаю, давно ушёл в ноду, уже и забыл как там всё в жинже пишется.

Здесь примерно то же самое, вот чем можно управлять:

  • источник воздуха через swing_mode
  • скорость вентилятора через fan_mode (здесь же режим авто)
  • обогреватель ON/OFF через HVACMode (OFF, HEAT, FAN_ONLY)

Порядок управления не имеет значения. Но самое простое включение через пресет и потом если надо, дополнительно регулировка необходимого параметра.

Здравствуйте!

Можно ли как-то сделать кастомизацию ваших пресетов на локальной установке? Я могу подправить код под себя прямо в файле, но это неправильный путь. Мне нужно создать пресеты под свои условия, там несколько другие значения СО2 и скорости потока. Буду благодарен за совет!

Rus-Senator avatar Mar 15 '24 17:03 Rus-Senator