Управление кондиционером IR/ИК через WB-MSW v.3

Добрый день! Следующая задача стоит: есть два кондиционера в разных комнатах. В каждой комнате свой WB-MSW3, с которого планировалось управлять кондиционерами через WB6.Клиентские панели на Iridium. Кондиционеры к слову Samsung A12AW1 NFR4 и A09AW1 NFR4 (может быть произойдет чудо и доброжелатель поделится наработками).

Я прочитал одну полезную статью https://habr.com/ru/company/iridiummobile/blog/389049/
После чего у меня начался тремор.

Так вот с задачей сталкиваюсь впервые поэтому вопросы возможно будут глупыми:

  1. Верно ли утверждение что для реализации управления кондиционером по ИК не достаточно запомнить ИК команды кнопки, потребуется запоминать команды для “состояния кондиционера”, т.е. 1. команда включить 2. выключить 3. режим холод, скорость 2, температура 19С,жалюзи вверх… и т.д. с кучей вариативности?
  2. Если верно утверждение в пункте №1, то как можно управлять через MSW v.3 c 8 командами кондиционером?? Получается нужно что-то разработать чтобы налету подменивать команды записанные в RAM?
  3. Есть ли готовые наработки по организации замены команд на лету? Потребуются скрипты для WB. Будьте любезны поделитесь наработками.
  4. Наработки будут бесполезны пока я не прогоню все состояния/вариации на своем пульте и не составлю базу сигналов/команд. Как это можно сделать на WB с максимальной дружественностью интерфейса? Возможно есть какие-то скрипты, программы? Какой технологический процесс в деталях?
  5. Решив выше обозначенные вопросы останется только написать скрипты под иридиум, где исходя из выбранного состояния потребуется брать нужную команду и направлять WB, чтобы тот складывал ее в RAM. Верно?

Или общественность скажет, не парься - лучше возьми global cache сэкономишь на нервах и времени?

somebody, добрый день!
Пульты от кондиционера передают набор всех текущих установленных параметров, не коды нажатых кнопок, совершенно верно.
WB-MSW v.3 имеет память на 32 команды. Так что состояний можно передать довольно много. Я нигде никогда столько не использовал :slight_smile: Но если хочется больше, то есть два варианта:

  1. Записывать команды в RAM по Modbus и их воспроизводить (это не мгновенно, конечно). Готового решения нет, но можете написать решение хоть на bash, через modbus_client.
  2. Купить еще один WB-MSW v.3 и дозаписать в него недостающие команды.

Web-интерфейс не добавит какой-то особенной дружественности в процесс – используйте скрипты.Обратите внимание, что когда модуль опрашивается wb-mqtt-serial, записать в него что-то из командной строки не получится. Описывать каждый регистр в шаблоне – совсем плохо.

Посмотрел объект автоматизации, вздохнул с облегчением - у данных кондиционеров есть интеллектуальный режим (автоматическое поддержание заданной температуры с ±2С). Под этим соусом можно исключить другие режимы работы кондиционера, за исключением режима естественной вентиляции. Нодаже при таком подходе 32 команды будет не достаточно, поэтому убрал команды через 1 связанные с регулеровкой температуры и получил следующую таблицу с 27 командами:

%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5

Какие мои дальнейшие действия? Я беру пульт подбираю нужную комбинацию согласно таблицы и в режиме записи через WUI записываю в WB-MSW v.3 команду в нужный банк? Верно?

Далее на уровне иридиума формирую через MQTT команды на воспроизведение того или иного банка? Т.е. писать скрипты на WB6 не придется, только на уровне Irirdium? Верно?

Вполне рабочее компромиссное решение.
Да, после обучения через Web-интерфейс вам надо будет просто отправлять с иридиума команды в контрол “Play from ROMxx”.

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

Я решил сделать виртуальное устройство в которое складировать “команды” которые формируются на иридиуме и уже на WB их разбирать и в зависимости от команды отправлять команды в контрол.

Запили следующий скрипт на скорую руку:

defineVirtualDevice("conditioner",{
    title: "conditioner",
    cells:{
        command: { //определили виртуальное устройство диапазон, у которого каждое значение является определенной командой в perl скрипте
            type: "range",
			min: 0,
          	max: 3000,
          	value: 0,
        },      
    }
});

defineRule("conditioner", { //название правила
  whenChanged: "conditioner/command",
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    switch (newValue)
    {
      case 1000: //  1000 - кондиционер 1, выключили
    	dev["1US1-MSW3"]["Play from ROM1"] = 1;
     	break;

      case 1111: //  1111 - кондиционер 1, включили
    	dev["1US1-MSW3"]["Play from ROM2"] = 1;
     	break;

      case 1120: //  1120 - кондиционер 1, скорость low, температура 20
    	dev["1US1-MSW3"]["Play from ROM3"] = 1;
     	break;

      case 1121: //  1121 - кондиционер 1, скорость low, температура 21
    	dev["1US1-MSW3"]["Play from ROM4"] = 1;
     	break;
        
      case 1122: //  1122 - кондиционер 1, скорость low, температура 22
    	dev["1US1-MSW3"]["Play from ROM5"] = 1;
     	break;

      case 1123: //  1122 - кондиционер 1, скорость low, температура 23
    	dev["1US1-MSW3"]["Play from ROM6"] = 1;
     	break;

      case 1124: //  1124 - кондиционер 1, скорость low, температура 24 // заменяем на температуру 25
    	dev["1US1-MSW3"]["Play from ROM7"] = 1;
     	break;

      case 1125: //  1125 - кондиционер 1, скорость low, температура 25
    	dev["1US1-MSW3"]["Play from ROM7"] = 1;
     	break;

      case 1126: //  1126 - кондиционер 1, скорость low, температура 26 // заменяем на температуру 25
    	dev["1US1-MSW3"]["Play from ROM7"] = 1;
     	break;

      case 1127: //  1127 - кондиционер 1, скорость low, температура 27
    	dev["1US1-MSW3"]["Play from ROM8"] = 1;
     	break;

      case 1128: //  1128 - кондиционер 1, скорость low, температура 28 // заменяем на температуру 27
    	dev["1US1-MSW3"]["Play from ROM8"] = 1;
     	break;

      case 1129: //  1129 - кондиционер 1, скорость low, температура 29 // заменяем на температуру 30
    	dev["1US1-MSW3"]["Play from ROM8"] = 1;
     	break;

      case 1130: //  1130 - кондиционер 1, скорость low, температура 30 // заменяем на температуру 30
    	dev["1US1-MSW3"]["Play from ROM9"] = 1;
     	break;
        
    }    
}
});

По скольку кондиционера в настоящий момент нет рядом, то отработку смотрел по состоянию контролов в WUI.

Наблюдал как прилетала команда от иридиума (менялось состояние виртуального устройства), а также срабатывал скрипт и появлялась 1 у контролов Play from ROMхх. Затем единицы сменялись нулями, ну вроде как полная аналогия нажатия кнопки в WUI для Play from ROMхх.

В какой-то момент 1 перестали сменятся нулями и появилось сообщение об ошибке:

%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5

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

Вопрос:

  1. мой подход выбран рабочий?
  2. правильно ли я отдаю команду на Play from ROMхх ? WB после отработки команды сам из 1 в 0 переводит состояние?
  3. Как понять в чем ошибка? какой командой в ssh? что сделать чтобы снять ошибку?

simebody, добрый день!
Подход вполне рабочий, у вас там опечатка в коде:
в case 1129: нужно "Play from ROM9", если следовать логике комментариев.
Обычно ИК-команды с пульта для кондиционеров задают просто текущее состояние независимо от предыдущего. То есть нажатие кнопки “увеличить на один градус” передает на кондиционер команду "установить такую-то температуру (как на дисплее), а не “увеличь температуру на градус”.

А в Devices как отображается MSW? Полностью недоступен? Включить пищалку из Web-интерфейса контроллера вы можете на нем, например? Такое ощущение, что MSW просто не опрашивается. В settings у "1US1-MSW3" все топики красные?

Зайдя в консоль контроллера по SSH можно попробовать опросить его командой modbus_client. Но сначала надо понять, доступен ли модуль вообще.

Возобновляю беседу.
Пробую записать команду с пульта кондиционера через SSH. Для начала решил удалить все команды которые были возможно ранее записаны. У меня MSW3 висит на второй шине 485, адрес устройства 55 (HW 4.8 , FW4.2-rc.1)

Выполнил команду service wb-mqtt-serial stop
Опрос модулей прекратился.

Далее выполняю следующую
root@wirenboard:~# modbus_client --debug -m rtu -b9600 -s2 -pnone /dev/ttyRS485-2 -a55 -t5 -r5000 1

В ответ command not found

Пробывал и с другими MSW3, аналогично. Что не так делаю?

Простите, а какой вывод команды:
which modbus_client

/usr/bin/modbus_client

Что еще порекомендуете проверить? Вывод который я указал это хорошо или плохо? Не томите.

Вывод хороший, но по предыдущим сообщениям создается впечатление, что modbus_client у вас не установлен или не в PATH.

Покажите, пожалуйста, скриншот выполнения команды
/usr/bin/modbus_client --debug -m rtu -b9600 -s2 -pnone /dev/ttyRS485-2 -a55 -t5 -r5000 1
Не понимаю пока, что происходит.

однако, спустя некоторое время вроде как успешно - см фото

путь не прописан? где что поправить?

А, кажется, понял. остановите сначала wb-mqtt-serial:
service wb-mqtt-serial stop
модбас-клиент и wb-mqtt-serial одновременно шлют данные в шину и зачастую получается каша.

это и делал изначально, см выше.
почему-то спустя время команды принимает, команду ИК записывает.

Добрый день!
Есть MSWv3, но в devices у него всего 7 кнопок play, как добавить остальные?

Нужно править шаблон устройства, шаблоны находятся в папке /usr/share/wb-mqtt-serial

Темплейт я поправил + создал еще 1, что сделать что бы он появился в UI и применился для уже добавленных девайсов?
Спасибо.

https://wirenboard.com/wiki/index.php?title=Драйвер_wb-mqtt-serial:Примеры_написания_шаблонов/ru

Удалить устройства, создать новые с новым шаблоном.

Добрый день! А без удаления шаблон после чего должен появиться, сейчас при добавлении новых устройств я его не вижу.

Ищите ошибки в своём шаблоне

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

dpkg -s wb-rules |grep Version
Version: 2.6.3

Посмотрел логи, есть такие строки связанные с устройством и скриптом:
Jun 7 15:53:38 wirenboard-ATHZMXRM wb-rules[1913]: ERROR: control 1US1-MSW3/Play from ROM27 SetValue() error: can’t convert control value ‘1’ (type float64) to datatype ‘pushbutton’

Возникают догадки в части синтаксиса, где у меня сейчас ошибка в скрипте с учетом новвоведений движка правил 2.0. Помню были требования указывать не 1 а “true”. В моем случае я даю команду pushbotton как правильно ей отдать команду?

Пробывал:

dev["1US1-MSW3/Play from ROM1"] = true;
dev["1US1-MSW3"]["Play from ROM1"] = 1;
dev["1US1-MSW3/Play from ROM1"] = 1;

Но комбинации не дали искомого результата.