Syberia 5

Добрый день!
хочу подключить к WB Универсальный одноплатный контроллер SYBERIA (версия 5.0) для управления вентиляционными установками. подскажите как я могу это сделать. Производитель прислал список Регистров. Устройство подключено ко второму порту RS-485 контроллера. Что-то подсказывает что нужно написать шаблон.

1 симпатия

Добрый день. Для начала - надо к нему подключиться, проверить что регистры можно считать. С помощью https://wirenboard.com/wiki/Modbus-client например.
А потом - да, шаблон. Если что - поможем, это несложно и пример недавно выкладывали.

{
"device_type": "syberia5",
"device": {
    "name": "syberia5",
    "id": "syberia5",
    "max_read_registers": 60,
    "channels": [
        {
            "name": "State_0",
            "type": "text",
            "reg_type": "input",
            "address": "2",
            "format": "u16"
        },
        { 
            "name": "State_1",
            "type": "text",
            "reg_type": "input",
            "address": "3",
            "format": "u16"
        },
        {
            "name": "Error_Code",
            "type": "text",
            "reg_type": "input",
            "address": "4",
            "format": "u16"
        },
        {
            "name": "Error_Code_1",
            "type": "text",
            "reg_type": "input",
            "address": "5",
            "format": "u16"
        },
        {
            "name": "Error_Code_2",
            "type": "text",
            "reg_type": "input",
            "address": "69",
            "format": "u16"
        },
        {
            "name": "Error_Code_3",
            "type": "text",
            "reg_type": "input",
            "address": "70",
            "format": "u16"
        },
        {
            "name": "ZagrFiltr1",
            "type": "text",
            "reg_type": "input",
            "address": "14",
            "format": "u16"
        },
        {
            "name": "TKomn_x10_P",
            "type": "temperature",
            "reg_type": "input",
            "address": "57",
            "format": "u16",
            "scale":0.1
        },
        {
            "name": "Room_Hum_P",
            "type": "humidity",
            "reg_type": "input",
            "address": "58",
            "format": "u16"
        },
        {
            "name": "Tkan_x10",
            "type": "temperature",
            "reg_type": "input",
            "address": "07",
            "format": "u16",
            "scale":0.1
        },
        {
            "name": "TNar_x10",
            "type": "temperature",
            "reg_type": "input",
            "address": "11",
            "format": "u16",
            "scale":0.1
        },
        {
            "name": "Fan_State_1",
            "type": "value",
            "reg_type": "input",
            "address": "25",
            "format": "u16"
        },
        {
            "name": "Reg",
            "type": "value",
            "reg_type": "input",
            "address": "18",
            "format": "u16"
        },
        {
            "name": "VAV",
            "type": "ppm",
            "reg_type": "input",
            "address": "66",
            "format": "u16"
        },
        {
            "name": "A_In_VAV_Code_I3",
            "type": "value",
            "reg_type": "input",
            "address": "34",
            "format": "u16"
        },
        {
            "name": "A_In_Rsv_I4",
            "type": "value",
            "reg_type": "input",
            "address": "35",
            "format": "u16"
        },
        {
            "name": "A_In_VAV_I3_mV",
            "type": "voltage",
            "reg_type": "input",
            "address": "42",
            "format": "u16",
            "scale": 0.001
        },
        {
            "name": "A_In_Rsv_I4_mV",
            "type": "voltage",
            "reg_type": "input",
            "address": "43",
            "format": "u16",
            "scale": 0.001
        },
        {
            "name": "Power_Dev",
            "type": "switch",
            "reg_type": "holding",
            "format" : "u16",
            "address": "2"
        },
        {
            "name": "Temp_Target",
            "type": "range",
            "reg_type": "holding",
            "address": "31",
            "scale": 0.1,
            "max": 30
        },
        {
            "name": "Fan_Target_1",
            "type": "range",
            "reg_type": "holding",
            "address": "32",
            "max": 10
        }
    ]
}}

Разместите этот код в файле. syberia5.json и скопируйте файл в папку /usr/share/wb-mqtt-serial/templates

Далее обновить веб интерфейс контроллера (F5) и в списке шаблонов устройств должен появится syberia5 доступным контроллер.

Важно ! Это не финальная версия, выкладываю потому что спрашиваете. Веду доработку шаблона и по сему, use with caution…

P/S Так как у меня этот контроллер установлен в ПВУ350 (вентмашина) с VAV, вам может недоставать каких то регистров или наоборот, будут видны не нужные. Сейчас пока работает кривовато в части VAV системы. Как закончу, попрошу опубликовать шаблон на сайте GTC.

PP/S Параметр устройства Interval between register reads может понадобится откорректировать для конкретно вашей установки. Не всегда контроллер успевает ответить на частые запросы.

2 симпатии

Сейчас попробую.

Доброго дня!
В прицепе все норм, но только не понимаю для чего функция VAV. И где достать таймер обратного отсчета для включения или выключения.

Дополнительно интересует описание ошибок например : Error_Code_1 у меня выдает 4096
А State_0 выдает 449

Ну и сюда выложите пожалуйста, добавим со ссылкой в поддерживаемые.

Хорошее описание именно VAV системы вы найдете вот в этом Видео: https://www.youtube.com/watch?v=Wb5Q1uifIcA

Таймер исполнения текущей операции находится в 0x07(07) регистре. (у меня не выведен). При правке файла учитывайте пожалуйста смещение (на самом деле 0x06 (06) вместо указанного в карте).

По кода ошибки, необходимо делать дополнительную обработку, поскольку контролер Syberia отдает обычную битовую последовательность как флаги состояния ошибок.
Для того чтобы понять какую именно ошибку выдает контроллер делаем следующее:

Берем код ошибки и вносим в windows калькулятор в виде программиста как Dec (4096). Затем меняем отображение на Bin. Получаем битовую маску: 1000000000000
Видим что у нас есть 13й бит (считаем справа налево). Остальные 0. Смотрим в карту регистров и видим:
Bit 12 – температура рекуператора больше заданной (начиная с версии 1.0.18)
Иначе говоря температура подачи воздуха больше заданной (должен на пульте гореть соответствующий индикатор.)

Насчет State_0 делаем аналогично… (111000001) 0 ,6,7,8 биты выставлены.

Смотрим в карту:
State_0 – Состояние устройства: слово 0 (битовое поле)
Bit 0 – установка включена (1) / выключена (0)
Bit 1 – переход к состоянию, указанному в «Bit 0»
Bit 2…Bit 5 – резерв
Bit 6 – режим нагрева есть (1) / нет (0)
Bit 7 – режим охлаждения есть (1) / нет (0)
Bit 8 – текущий режим работы системы: нагрев (1) / охлаждение (0)
Bit 9 – таймер на ближайшие сутки есть (1) / нет (0)
Bit 10 – таймер на ближайшую неделю есть (1) / нет (0)
Bit 11…Bit 12 – приоритеты
0 – нет
1 – влажность
2 – СО2
3 – давление
Bit 13…Bit 15 – резерв

Видим:
1 - установка включена.
6 - режим нагрева есть.
7 - режим охлаждения есть.
8 - текущий режим работы - нагрев.

Остальные регистры по образу и подобию… Очень надеюсь что описал достаточно точно для самостоятельного воспроизведения.

1 симпатия

Обязательно. Но боюсь без спецов команды Wiren и допиливания wb_mqtt_serial не обойтись… Текущий метод хранения флагов у контроллера Syberia не нативен для wiren. Либо нет, либо я пока не разобрался как привести шаблон к пониманию формата битовой маски что применена в контроллере Cyberia. Остальные параметры без проблем всосались и работают штатно фактически по всей карте регистров.

Мужик ты крут, а не пробывал это прикидывать в HomeKit через nodered

Это несколько другой уровень абстракции нежели тот о котором идет речь в этом топике. Позднее, на базе обрабатываемых данных от MQTT конечно можно будет прикрутить и Nodered и прочие системы. Но пока, речь идет лишь о низкоуровневой интеграции исполнительного устройства и контроллера в роли “церебральной” части системы.

Обновленный шаблон для контроллера Syberia 5. Поправил пару регистров, которые отдавали некалиброванные значения.

Usage:

  1. Залить в /usr/share/wb-mqtt-serial/templates
  2. Добавить в списке устройств шаблон “Syberia5”
  3. … профит.

Важно: Контроллер syberia 5 адекватно работает только на скоростях 115200.

P/S Выключение вентустановки выполняется переключением “Power_ON_OFF”
сначала в “On” и затем сразу в “Off”. Пока этот баг в прошивке не исправлен, однако авторы контроллера обещали поправить.

PP/S Регистры группы “Error_Code_X” предлагается анализровать программно так как это указано выше. В Шаблоне они добавлены.

файл шаблона:
config-syberia5.json (4.5 КБ)

PPP/S Прошу администраторов форума разрешить загружать файлы *.pdf.
Карту регистров для контроллера syberia 5 загрузить не удается.

3 симпатии

Сделаем. Может в Вики страничку завести?

Можно. Как я погляжу контроллер Syberia не очень активно меняется… На долго хватит.

Список регистров Оазис v.5.pdf (758.0 КБ)

Исправленная версия. config-syberia5.json (4.5 КБ)
Устранен баг. Исправлено отображение отрицательных значений температуры на входе в установку.

1 симпатия

Добавлю кое-чего своего полезного, в т.ч. разбирая по дороге битовые слова.
Это для версии 3 мозгов, но, почти уверен, для 5й версии будет аналогично.

Читаем состояние приточки, в т.ч. вкл/выкл и состояние перехода между ними

defineRule("GTC_state", { //накидываем правило, которое будет менять состояние обозначенных выше контролов после парсинга значения регистра модбас
  whenChanged: "GTCController/System State", //когда меняется контрол, считывающий регистр состояния приточки
  then: function (newValue, devName, cellName) {

var tempOutput = parseInt(newValue,10); //для начала силой переводим строку в десятичное целое
tempOutput = tempOutput.toString(2); //переводим число в двоичную систему
while (tempOutput.length < 16) { //добиваем слева нули для полного 16-символьного слова
tempOutput = '0' + tempOutput;
	}
tempOutput = tempOutput.split(''); //из 16-символьного слова делаем массив
	dev["GTC_state"]["Power"] = parseInt(tempOutput[15]); //переводим состояние контроля вкл-выкл к значению бита 0 из слова (считам с конца массива)
	dev["GTC_state"]["In transit"] = parseInt(tempOutput[14]); //то же самое для контрола транзита по биту 1 из слова    
  }
});

Разбирать ошибки можно аналогично разибирая слова на биты.

К счастью, единственный регистр обозванный битовым полем, в которой имеет какой-то смысл что-либо писать, это включить и выключить, и внутри него единственный бит незарезервиован и стоит в позиции “0”, поэтому разбирать на биты этот регистр необязательно. Он, кстати, не меняет своего значения с нуля в зависимости от того, что в него записать, но на запись реагирует адекватно.
Включаю и выключаю пока что так:

defineRule("GTC_state_set_on", { //накидываем правило, которое по кнопкам будет менять параметры приточки
  	whenChanged: "GTC_state/Turn ON", //при нажатии на эту кнопку
  	then: function (newValue, devName, cellName) {
    dev["GTCController"]["Power h2"] = 1; //включаем
  }
});

defineRule("GTC_state_set_off", { //накидываем правило, которое по кнопкам будет менять параметры приточки
  	whenChanged: "GTC_state/Turn OFF", //при нажатии на эту кнопку
  	then: function (newValue, devName, cellName) {
    dev["GTCController"]["Power h2"] = 0; //выключаем
  }
});

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

1 симпатия

Интересный вариант. А вот такой способ описания в шаблоне применим для 3й версии?:

{
    "name": "Status",
    "type": "switch",
    "reg_type": "input",
    "address": "2:0:1",        // нулевой бит маски в регистре 2 (регистр включения)
    "format": "u16"
}, {
    "name": "In progress",
    "type": "switch",
    "reg_type": "input",
    "address": "2:1:1",      // первый бит маски в регистре 2  (контроллер занят)
    "format": "u16"
}

Обратите внимание на параметр “address”, где указываются через двоеточие сразу регистр:смещение в битах:длина в битах
Таким образом каждый конкретный бит маски можно сразу вывести в нужный топик.

Что же касается бага с самопроизвольным переключением регистра 3 (Power_ON_OFF) разработчики софта для контроллера syberia обещали поправить. Имхо это решение чуть проще. Менее грузит контроллер , а вывести можно фактически любой параметр состояния контроллера сразу в топик, минуя правила.

1 симпатия

Если так работает (а я не знал, что так можно) то работает на трешке. На holding регистры запись так не сработает?

У меня сейчас одновременное и трешка, и пятерка. К пятерке пока не подключался, идет пуско-наладка всего климата (приточка, кондей, увлажнитель).

У меня вентмашина Колибри 500 с автоматикой от GTC. Так как к контролеру подключен пульт управления оазис, то правильно я понимаю что Syberia 5 к WB6 я уже не подключу так как в Modbus может быть только один мастер?