airens / tion_home_assistant

Custom Tion component for Home Assistant
49 stars 16 forks source link

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

Open false-coder opened 7 months ago

false-coder commented 7 months ago

При вызове службы управления вентилятором 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

RealLord commented 7 months ago

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

aatemes commented 7 months ago

Это ошибка в 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

RealLord commented 7 months ago

В общем, есть предложение, как переделать модуль для работы по 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 commented 7 months ago

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

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

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

bisquit2003 commented 7 months ago

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

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

RealLord commented 7 months ago

Уточню, там не скрипт, а 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 не поднимается вообще.

bisquit2003 commented 7 months ago

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

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

bisquit2003 commented 7 months ago

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

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

RealLord commented 7 months ago

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

AlexeyTorch commented 7 months ago

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

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

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

bisquit2003 commented 7 months ago

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

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

dima81rus commented 7 months ago

@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"

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

bisquit2003 commented 7 months ago

@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₽ и получите локальный бризер

dima81rus commented 7 months ago

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

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

bisquit2003 commented 7 months ago

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

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

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

AlexeyTorch commented 7 months ago

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

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

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

Да, Вы правы, не заметил что 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/

dima81rus commented 7 months ago

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

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

RealLord commented 7 months ago

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

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

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

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

dima81rus commented 7 months ago

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

Rus-Senator commented 5 months ago

Выкатил релиз 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 и скорости потока. Буду благодарен за совет!