Управление кондиционером через IR порт MSW в Home Assistant

Всем привет, кто-то пробовал реализовать возможность полноценного управления кондиционерами в Home Assistant через встроенный в MSW инфракрасный порт? Просто включить на один раз заданную температуру или выключить не проблема, но вот реализовать полноценное управления через интеграцию Climate пока не пойму как. Вроде интеграция SmartIR имеет возможность управлять через mqtt, но что-то пока не пойму как это реализовать.

Пока вижу такой вариант:

  1. Используя SmartIR публикую в топик mqtt выбранный в карточке HA climate режим из кастомного файла с кодами управления из карточки в формате json, пример:

{"Mode":"auto","Power":"on","Temp":16,"FanSpeed":"auto"}

  1. Разбираю json, создаю сенсоры с режимами из топика mqtt

mqtt:
  sensor:
  - name: "bm_cliamate_ir_state"
    state_topic: "smartir/bedroom_ac/command"
    value_template: "{{ value_json.Power }}"
  - name: "bm_cliamate_ir_mode"
    state_topic: "smartir/bedroom_ac/command"
    value_template: "{{ value_json.Mode }}"
  - name: "bm_cliamate_ir_temp"
    state_topic: "smartir/bedroom_ac/command"
    value_template: "{{ value_json.Temp }}"  
  - name: "bm_cliamate_ir_fanspeed"
    state_topic: "smartir/bedroom_ac/command"
    value_template: "{{ value_json.FanSpeed }}"  
  1. Записываю вручную коды с пульта в ROM датчика MSW
  2. В HA создаю свичи для воспроизведения команд из ROM, создавать нужно для каждой записанной команды, т.е. если у меня три режима (cool, fan, heat) и температура изменяется в диапазоне от 16 до 32 градусов с шагом 1 градус, то необходимо создать 51 switch для команд состояний + 1 на выключение кондиционера, пример:
mqtt:
     - switch:
       - name: "wb_msw_65_play_from_rom1"
         state_topic: "/devices/wb-msw-v3_65/controls/Play from ROM1"
         command_topic: "/devices/wb-msw-v3_65/controls/Play from ROM1/on"
         payload_off: "0"
         payload_on: "1"
  1. Создаю автоматизацию которая реагирует на изменение статуса состояния переданного из карточки HA climate (п. 2 сенсоров), на отключение кондея:
automation:
    - alias: bm_ac_off
      trigger: 
        - platform: state
          entity_id: sensor.bm_cliamate_ir_state
          from: "on"
          to: "off"

      condition:
        - condition: state
          entity_id: switch.control_mode
          state: 'on'

      action:
                - service: switch.turn_on
                  target:
                    entity_id:
                     - switch.wb_msw_65_play_from_rom1
  1. Самый трудоемкий после п.3, прописать все условия и сопоставить условия получаемые от сенсоров записанным в РОМ датчика командам и выбрать правильную IR команду для воспроизведения, вот тут может кто-то сможет помочь упростить (как я вижу возможность упрощения ниже):
    - alias: bm_ac_on

      trigger: 
        - platform: state
          entity_id: sensor.bm_cliamate_ir_state
          not_from:
            - "unknown"
            - "unavailable"
            - "0"
            - "" 
        - platform: state
          entity_id: sensor.bm_cliamate_ir_mode
          not_from:
            - "unknown"
            - "unavailable"
            - "0"
            - "" 
        - platform: state
          entity_id: sensor.bm_cliamate_ir_temp
          not_from:
            - "unknown"
            - "unavailable"
            - "0"
            - "" 
        - platform: state
          entity_id: sensor.bm_cliamate_ir_fanspeed
          not_from:
            - "unknown"
            - "unavailable"
            - "0"
            - "" 

      condition:
        - condition: state
          entity_id: switch.control_mode
          state: 'on'

      action:
      - choose:
          # IF on
          - conditions: >
              {{ is_state('sensor.bm_cliamate_ir_state', 'on') and
                 is_state('sensor.bm_cliamate_ir_mode', 'auto') and
                 is_state('sensor.bm_cliamate_ir_fanspeed', 'auto') and
                 is_state('sensor.bm_cliamate_ir_temp', '16')
               }}
            sequence:
                - service: switch.turn_on
                  target:
                    entity_id:
                     - switch.wb_msw_65_play_from_rom2
            ..... и так далее для каждого режима

По п. 6 как я вижу возможность упрощения, если возможно как-то считать команды из записанных в ROM (нашел скрипт считывания команд из памяти, но пока считать не удалось) или RAM датчика MSW, сохранить их в файл и в соответсвии с выбранным условием записывать нужную команду в RAM датчика для последующего воспроизведения.

Не очень хорошая идея.

Регистров в команде много… Запись каждой команды - это пара секунд, нет смысла. Проще в банках датчика держать уже записанные ии вызывать при необходимости, то есть работать штатным спомсобом.

ну, еще под каждую банку Свитч нужно создавать и вызывать нужный по определенным правилам. От записи то все равно никуда не уйти, так что это не проблема. Подскажите пожалуйста, как получить доступ к остальным банкам, в интерфейсе и в топках MQTT только 7, в шаблоне я вижу, что расписаны до 32, сколько их всего в последних прошивках.

Как и описано в документации - 80
Вообще из внешней счистемы можно вызывать выполнение, да и запись банков просто записчывая номер банка в регистр косвенного вызова, 5500, 5502.

У меня устройства WB интегрируется в Home Assistant через MQTT, не получится писать в регистры. Мне нужно как-то все банки пробросить в топики, на сколько я понимаю нужно править файл шаблона для устройства, может подскажите, что конкретно нужно указывать? в документации такая информация не попадалась.
ну и сложность со способом обучения датчика, что для другого датчика в другой комнате нужно будет опять проходить это все заново ну или разобраться как считать команды из памяти в файл.

UPD: нашел - “enabled”: false, думаю тут

Прямо через веб-интерфейс включаются они.

1 лайк

Вообще из внешней счистемы можно вызывать выполнение, да и запись банков просто записчывая номер банка в регистр косвенного вызова, 5500, 5502.

А можно об этом поподробней пожалуйста, правильно я понял, для воспроизведения команды допустим из ROM1 мне нужно передать в значение регистра 5500 номер регистра ROM1 - 5100
Как 5500 пробросить в MQTT, вероятно необходимо добавить описание в шаблон и через брокер уже передавать номер банка для вызова. Буду благодарен, если дадите пример строк для шаблона.

Нет, для воспроизведения первого банка - в 5500 записать 1. Для воспроизведения второго - записать в тот же регистр 2.

Включаем кастомные каналы


Добавляем канал

И получаем
Screenshot_20240503_120412

1 лайк

Спасибо большое, очень помогли. Очень сильно упростил.
В итоге все сводится к подготовке кастомного файла управления кондиционером для интеграции smartir и записи команд в банки ROM:
шаг 1: создаем файл для интеграции smartir, имя 333333.json

{
    "manufacturer": "AUX",
    "supportedModels": [
      "002E"
    ],
    "supportedController": "MQTT",
    "commandsEncoding": "Raw",
    "minTemperature": 16,
    "maxTemperature": 32,
    "precision": 1,
    "operationModes": [
        "cool",
        "heat"
    ],
    "fanModes": [
        "auto"
    ],
    "commands": {
        "off": "1",
        "cool": {
            "auto": {
                "16": "2",
                "17": "3",
                "18": "4",
                "19": "5",
                "20": "6",
                "21": "7",
                "22": "8",
                "23": "9",
                "24": "10",
                "25": "11",
                "26": "12",
                "27": "13",
                "28": "14",
                "29": "15",
                "30": "16",
                "31": "17",
                "32": "18"
          }
        },
        "heat": {
            "auto": {
                "16": "19",
                "17": "20",
                "18": "21",
                "19": "22",
                "20": "23",
                "21": "24",
                "22": "25",
                "23": "26",
                "24": "27",
                "25": "28",
                "26": "29",
                "27": "30",
                "28": "31",
                "29": "32",
                "30": "33",
                "31": "34",
                "32": "35"
          }
        }
    }
}

шаг 2: обучаем датчик командам с пульта
шаг 3: настраиваем интеграцию smartir, чтоб команд из файла сразу писал в регистр 5500 датчика:

  climate:
    - platform: smartir
      name: Master bedroom AC
      unique_id: bedroom_ac
      device_code: 333333
      controller_data: "/devices/wb-msw-v3_65/controls/PlayBank/on"
      temperature_sensor: sensor.wb_msw_65_temperature
      humidity_sensor: sensor.wb_msw_65_humidity
      power_sensor: binary_sensor.bm_air_conditioner_state
      power_sensor_restore_state: true

И собственно все работает.
Жалко только что всего 80 регистров, если прописать еще все режими работы вентиляторов auto, High, Mid, Low, то потребуется более 100 ячеек.

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

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

Рад что смог помочь!

PS: И да, витает в воздухе идея переделать механизм команд, хранить не длительности импульсов а динамически их генерировать. То есть передавать систему кодирования (RC5 например) и само содержимое. Будет, ну пусть 20-30-50 байт. Немного.

1 лайк