Поставил тот же шаблон (устройства у меня нет) температура в поле меняется. У вас нет элемента управления?
В поле-то она меняется, но тут же возвращается к дефолтным 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
}
Можете добавлять РТМ-2000 в список поддерживаемых устройств)
Благодарю, очень приятно когда заботятся о остальных. Всячески приветствуем открытое ПО и сами так поступаем.
Почему может быть так, что на одном WB value можно поменять, а на другом- фиг?
Оба обновлены
Конфиг при этом одинаковый, отличаются только названия топиков и адрес регистра.
Конфиг
{
"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 что-то есть - ото выводится. Другой вопрос - что сейчас можно очищать топики прями из веб-интерфейса. Но пока не нажать на “корзинку” - очистка не произойдет.
Почему-то внезапно перестал читаться РТМ-2000, ребут WB не помогает, ребут РТМ-2000 помогает, то на день, то на несколько минут. Ничего не менялось, до этого всё работало исправно. В чём может быть дело? Заранее спасибо!
Конфиг
{
"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": "switch",
"reg_type": "holding",
"address": "176",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": true,
"readonly": true
},
{
"name": "Relay1State",
"type": "switch",
"reg_type": "holding",
"address": "177",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": true,
"readonly": true
},
{
"name": "Relay2State",
"type": "switch",
"reg_type": "holding",
"address": "178",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": true,
"readonly": true
},
{
"name": "Relay3State",
"type": "switch",
"reg_type": "holding",
"address": "179",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": true,
"readonly": true
},
{
"name": "Relay4State",
"type": "switch",
"reg_type": "holding",
"address": "180",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": true,
"readonly": true
},
{
"name": "Relay5State",
"type": "switch",
"reg_type": "holding",
"address": "181",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": true,
"readonly": true
},
{
"name": "Addres_Teploskat_Air_Min",
"type": "value",
"reg_type": "holding_multi",
"address": "0x012F",
"format": "s16",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": false
},
{
"name": "Addres_Teploskat_Air_Max",
"type": "value",
"reg_type": "holding_multi",
"address": "0x0130",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": false
},
{
"name": "Addres_Teploskat_Time_Delay_Ch1",
"type": "value",
"reg_type": "holding_multi",
"address": "0x0137",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": false,
"max": "180"
},
{
"name": "Manual_Auto_Teploskat",
"type": "switch",
"reg_type": "holding_multi",
"address": "0x153",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": false,
"max": "1"
},
{
"name": "Manual_Auto_Relay_1",
"type": "switch",
"reg_type": "holding_multi",
"address": "0x014F",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": false,
"max": "1"
},
{
"name": "Manual_Control_Relay_1",
"type": "switch",
"reg_type": "holding_multi",
"address": "0xAC",
"scale": 1,
"poll_interval": 1000,
"channel_readonly": false,
"max": "1"
}
],
"device_max_fail_cycles": 1000
}
],
"baud_rate": 9600,
"parity": "N",
"data_bits": 8,
"stop_bits": 1,
"poll_interval": 1000,
"enabled": true
}
Но вообще в протоколе максимальный адрес - 247 ведь.
Ошибки типа
Serial protocol error: malformed response: invalid data size
как правило говорит о неполадках в линии. Ну или о неверной настройке количества стопбит. Включите debug wb-mqtt-serial - будет видно ответы.
Да, получает лишь нулевой байт. Судя по таймингу - он, байт, не может быть хвостом предыдущего пакета. Есть ли на линии терминирующий регистор у RTM-2000?
Если опрашивать вручную, с помощью modbus_client - отвечает всегда?
Перепроверили, дело было в отсутствии сопротивления на РТМ, включили, проблема ушла, благодарю.