Работа с РТМ-2000

Здравствуйте! На объекте используется контроллер РТМ-2000, подключен по ModBus к WB6. У него какая-то хитрая схема передачи отрицательной температуры, интересует, как мне элегантнее настроить всё это дело в WB. Прикрепляю скрин переписки с их поддержкой:

Инструкция к РТМ-2000: https://probatum-est.ru/upload/iblock/054/RTM-2000_manual.pdf

Заранее спасибо!

Добрый день!
Вы хотите, чтобы через веб интерфейс WB можно было задавать установки минимальной и максимальной температуры? Если так, то я попробую написать Вам правило.

Именно. Хочется управлять температурой по MQTT. Максимальная (положительная) работает исправно, в человеческом формате. А вот минимальная (отрицательная) вот так.

Добрый день!
Попробовал сделать не правило, а новый шаблон для вашего контроллера.

Что нужно сделать:

  1. Скопируйте файл config-ptm-2000.json в папку /etc/wb-mqtt-serial.conf.d/templates
    config-ptm-2000.json (669 Байт)
  2. Перезапустите сервис service wb-mqtt-serial restart
  3. Далее добавьте новое устройство согласно данной инструкции - Начальное конфигурирование устройств через веб-интерфейс — Wiren Board
  4. В Devices появится новое устройство PTM-2000 с возможностью указать MIN и MAX температуру.

Для управления через MQTT используйте топики, которые появится в MQTT Channels

1 лайк

Спасибо, температура стала читаться, но почему-то не удаётся её поменять.

На всякий случай прикладываю конфиг, в котором всё работало и менялось (за исключением минимальной температуры). Так же ещё вопрос: все эти регистры мне нужны. Как стоит поступить? Добавите их в шаблон? Или мне просто создать два устройства с одним адресом, одно из которых по шаблону, а второе это, самописное?

Конфиг
{
  "slave_id": "255",
  "name": "RTM-2000",
  "id": "RTM2000",
  "enabled": true,
  "protocol": "modbus",
  "poll_interval": 2000,
  "channels": [
    {
      "name": "OsadCh1",
      "type": "value",
      "reg_type": "holding",
      "address": "90",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "WaterCh1",
      "type": "value",
      "reg_type": "holding",
      "address": "0x5C",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "TST01_1",
      "type": "temperature",
      "reg_type": "holding",
      "address": "0x0",
      "format": "s16",
      "scale": 0.1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "TST01_1_10",
      "type": "value",
      "reg_type": "holding",
      "address": "0x01",
      "format": "s16",
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "TST01_1_mult",
      "type": "value",
      "reg_type": "holding",
      "address": "0x02",
      "format": "s16",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "TST01_1_check",
      "type": "value",
      "reg_type": "holding",
      "address": "0x03",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "Relay0State",
      "type": "value",
      "reg_type": "holding",
      "address": "176",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "Relay1State",
      "type": "value",
      "reg_type": "holding",
      "address": "177",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "Relay2State",
      "type": "value",
      "reg_type": "holding",
      "address": "178",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "Relay3State",
      "type": "value",
      "reg_type": "holding",
      "address": "179",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "Relay4State",
      "type": "value",
      "reg_type": "holding",
      "address": "180",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "Relay5State",
      "type": "value",
      "reg_type": "holding",
      "address": "181",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": true
    },
    {
      "name": "Manual_Auto_Teploskat",
      "type": "range",
      "reg_type": "holding_multi",
      "address": "0x153",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": false,
      "max": "1"
    },
    {
      "name": "Manual_Control_Relay_1",
      "type": "range",
      "reg_type": "holding_multi",
      "address": "0x9F",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": false,
      "max": "1"
    },
    {
      "name": "Addres_Teploskat_Air_Min",
      "type": "range",
      "reg_type": "holding_multi",
      "address": "0x012F",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": false,
      "max": "40"
    },
    {
      "name": "Addres_Teploskat_Air_Max",
      "type": "range",
      "reg_type": "holding_multi",
      "address": "0x0130",
      "scale": 1,
      "poll_interval": 1000,
      "channel_readonly": false,
      "max": "40"
    }
  ],
  "device_max_fail_cycles": 1000
}

Попробуйте в шаблоне указать тип регистра holding в место holding_single

Думаю лучше будет все сделать в одном шаблоне, второе устройство с таким же адресом не появится в Devices.

Указал, service wb-mqtt-serial restart, не помогло

Поставил тот же шаблон (устройства у меня нет) температура в поле меняется. У вас нет элемента управления?
Screenshot from 2021-03-03 19-16-46

В поле-то она меняется, но тут же возвращается к дефолтным 15/-15

Попробуйте остановить wb-mqtt-serial и записать с помощью modbus_client в регистр какое-нибудь значение. И потом прочитать.

Что-то он ругается:

root@wirenboard-ACF6YBP3:~# service wb-mqtt-serial stop
root@wirenboard-ACF6YBP3:~# modbus_client --debug -mrtu -pnone -s1 /dev/ttyRS485-2 -b9600 -a255 -t0x03 -r0x0130
Opening /dev/ttyRS485-2 at 9600 bauds (N, 8, 1)
modbus_client: modbus-rtu.c:119: _modbus_rtu_build_request_basis: Assertion `ctx->slave != -1' failed.
Aborted

Напомню, что в самописном конфиге (кидал выше) MAX температура у меня исправно управляется (записывается и читается).

В документации я не нашел настройки порта, почему один стоп бит указали? WB используется 2 по умолчанию.

И адрес конечно странный,адрес устройства, может принимать значение от 0 до 247, адреса с 248 до 255 зарезервированы. Попробуйте его сменить и снова modbus_client проверить.

Попробуйте в Ваш config дописать "format": "s16" где температура.

Адрес 255 дефолтный с завода в нём) Сейчас попробую через ModBus поменять и проверю.

Методом научного тыка, с одним стоп-битом и тем моим конфигом всё заработало, других настроек не пробовал.

И всё-таки, зачем мне modbus_client проверять, если я однозначно понято, что с моим конфигом MAX температура настраивается, а с Вашим шаблоном- нет?)

Но всё же проверю, раз вы настаиваете)

Укажите здесь формат переменой, которую считываем с регистра, "format": "s16".
Это даст понять, что нужно учитывать и отрицательные числа.

У Вас 2 порта RS485 задействованы? Если нет, то думаю лучше на второй порт опрашиваемый контроллер подключить и уже на этом порте менять настройки.

Блин, сразу бы так)
Теперь всё работает как надо!

Выкладываю конфиг:

Конфиг
{
  "path": "/dev/ttyRS485-2",
  "devices": [
    {
      "slave_id": "255",
      "name": "RTM-2000",
      "id": "RTM2000",
      "enabled": true,
      "protocol": "modbus",
      "poll_interval": 2000,
      "channels": [
        {
          "name": "OsadCh1",
          "type": "value",
          "reg_type": "holding",
          "address": "90",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "WaterCh1",
          "type": "value",
          "reg_type": "holding",
          "address": "0x5C",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "TST01_1",
          "type": "temperature",
          "reg_type": "holding",
          "address": "0x0",
          "format": "s16",
          "scale": 0.1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "TST01_1_10",
          "type": "value",
          "reg_type": "holding",
          "address": "0x01",
          "format": "s16",
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "TST01_1_mult",
          "type": "value",
          "reg_type": "holding",
          "address": "0x02",
          "format": "s16",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "TST01_1_check",
          "type": "value",
          "reg_type": "holding",
          "address": "0x03",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "Relay0State",
          "type": "value",
          "reg_type": "holding",
          "address": "176",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "Relay1State",
          "type": "value",
          "reg_type": "holding",
          "address": "177",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "Relay2State",
          "type": "value",
          "reg_type": "holding",
          "address": "178",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "Relay3State",
          "type": "value",
          "reg_type": "holding",
          "address": "179",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "Relay4State",
          "type": "value",
          "reg_type": "holding",
          "address": "180",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "Relay5State",
          "type": "value",
          "reg_type": "holding",
          "address": "181",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": true
        },
        {
          "name": "Manual_Auto_Teploskat",
          "type": "range",
          "reg_type": "holding_multi",
          "address": "0x153",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": false,
          "max": "1"
        },
        {
          "name": "Manual_Control_Relay_1",
          "type": "range",
          "reg_type": "holding_multi",
          "address": "0x9F",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": false,
          "max": "1"
        },
        {
          "name": "Addres_Teploskat_Air_Min",
          "type": "value",
          "reg_type": "holding_multi",
          "address": "0x012F",
          "format": "s16",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": false,
          "max": "65536"
        },
        {
          "name": "Addres_Teploskat_Air_Max",
          "type": "value",
          "reg_type": "holding_multi",
          "address": "0x0130",
          "scale": 1,
          "poll_interval": 1000,
          "channel_readonly": false,
          "max": "40"
        }
      ],
      "device_max_fail_cycles": 1000
    }
  ],
  "baud_rate": 9600,
  "parity": "N",
  "data_bits": 8,
  "stop_bits": 1,
  "poll_interval": 10,
  "enabled": true
}

image

Можете добавлять РТМ-2000 в список поддерживаемых устройств)

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

Почему может быть так, что на одном WB value можно поменять, а на другом- фиг?

Оба обновлены

image

Конфиг при этом одинаковый, отличаются только названия топиков и адрес регистра.

Конфиг
{
  "name": "FloorSetTemp_4_Set",
  "type": "value",
  "reg_type": "holding_multi",
  "address": "0x0142",
  "scale": 1,
  "poll_interval": 1000,
  "channel_readonly": false,
  "max": "40"
}

И ещё вопрос: в новой версии, как я вижу, вы добавили удаление несуществующих топиков. Но на одном контроллере я сейчас обновился до последней версии, а мёртвые топики остались.

Какая версия wb-mqtt-homeui на обоих? И для уверенности - поставьте на оба идентичные конфиги.

Несуществующие топики и не отображались никогда… Если в MQTT что-то есть - ото выводится. Другой вопрос - что сейчас можно очищать топики прями из веб-интерфейса. Но пока не нажать на “корзинку” - очистка не произойдет.