Использование enum в шаблонах устройств

Добрый день

Пытаюсь создать шаблон для приточно-вытяжной вент установки Royal Clima RCS350

У данного устройства в регистрах управления вентиляторами есть значения, которые необходимо пропускать. На просторах интернета нашел вот такой шаблон, и попытался следать по образу и подобию:

"channels": [
...
   {
    "name": "Supply fan speed",
    "reg_type": "holding",
    "address": "0x000A",
    "type": "value",
    "enum": [0, 1, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14],
    "enum_titles": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"],
    "min": 0,
    "max": 11,
    "readonly": false
   },
...
]

wb-mqtt-serial -g ни на что не ругается, но, судя по всему, такая конструкция игнорируется веб-интерфейсом и значения в регистр попадают не из enum а подряд от 0 до 11.
Можно ли как-то с этим побороться, не обкладывая кучей дополнительного кода?

Добрый день!
Попробуйте так:

"channels": [
...
   {
    "name": "Supply fan speed",
    "reg_type": "holding",
    "address": "0x000A",
    "type": "integer",
    "enum": [0, 1, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14],
    "minimum": 0,
    "maximum": 11,
        "options": {
    "enum_titles": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"]
        }
   },
...
]

К сожалению не помогло :frowning:

1 лайк

Драйвер и веб-интерфейс сейчас не поддерживают enums в каналах, только в параметрах.

Указанную задачу можно решить через виртуальное устройство на wb-rules, в котором пользователь будет задавать скорость от 0 до 10, а алгоритм внутри виртуального устройства будет публиковать соответствующие этому значения.

То есть обложить дополнительным кодом…
А какой смысл иметь enum в параметрах вообще?

Чтобы настроить устройства при ПНР, например:

Для каналов enums есть в планах, но приоритет низкий, спрашивают редко.

Продолжу тему:
написал Шаблон под RCS-Primo
Тоже ищу способ решения для управления скоростями вентиляторов

Вы еще не писали виртуальное устройство ?
Меня больше интересует управление c HomeAssistant через MQTT
Если создать виртуальное устройство на wb-rules с маппингом :

"enum": [0, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14],
"enum_titles": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],

То оно тоже будет доступно через mqtt со скоростями 0-10 ?
Или уже лучше прописывать маппинг в самом HA ?

Приветствую,

Как выяснилось, маппинги значений каналов не работают в wb-rules. Пришлось писать “костыль”:

var ventilationSupplySpeeds =  [0, 1, 2, 3, 5, 8,  9, 10, 11, 12, 13, 14];
var ventilationExhaustSpeeds = [0, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14, 15];

var supplyDevice = "rcs350p_11/Supply fan speed";
var exhaustDevice = "rcs350p_11/Exhaust fan speed";

function getSpeed (speed_set, speed) {
  log ("getSpeeed entry with {} {}".format(speed_set, speed))
  var result = 0;
  log(typeof(result));
  for (var i in speed_set) {
    if (speed_set[i] == speed) {
      result = parseInt(i);
      break;
    }
  }
  log("returning {} {}".format(result, typeof(result)))
  return result;
}

speedDevice = defineVirtualDevice("Ventilation speed", {
     title: "Ventilation Speed",
     cells: {
       "Supply fan speed" : {
         type: "value",
         min: 0,
         max: 11,
         value: getSpeed(ventilationSupplySpeeds, dev[supplyDevice]),
         forceDefault: true,
         readonly: false
       },
       "Exhaust fan speed" : {
         type: "value",
         min: 0,
         max: 11,
         value: getSpeed(ventilationExhaustSpeeds, dev[exhaustDevice]),
         forceDefault: true,
         readonly: false
       }
     }
});


log(dev["Ventilation speed/Supply fan speed"]);
log(dev["Ventilation speed/Exhaust fan speed"]);

log(typeof(getSpeed(ventilationSupplySpeeds, dev[supplyDevice])));
log(typeof(getSpeed(ventilationExhaustSpeeds, dev[exhaustDevice])));

defineRule({
  whenChanged: supplyDevice,
         then: function(newValue) {
           dev["Ventilation speed/Supply fan speed"] = getSpeed(ventilationSupplySpeeds, newValue);
         }
});

defineRule({
  whenChanged: exhaustDevice,
         then: function(newValue) {
           dev["Ventilation speed/Exhaust fan speed"] = getSpeed(ventilationExhaustSpeeds, newValue);
         }
});

defineRule({
  whenChanged: "Ventilation speed/Supply fan speed",
         then: function(newValue) {
           log("Ventilation speed: new Supply fan speed {}".format(newValue))
           dev[supplyDevice] = ventilationSupplySpeeds[newValue];
         }
});

defineRule({
  whenChanged: "Ventilation speed/Exhaust fan speed",
         then: function(newValue) {
           log("Ventilation speed: new Exhaust fan speed {}".format(newValue))           
           dev[exhaustDevice] = ventilationExhaustSpeeds[newValue];
         }
});

Как выяснилось в результате изысканий с анемометром, “рваные” значения скоростей относятся не только к притоку но и к оттоку тоже. Данный “костыль” создает виртуальное устройство и позволяет регулировать скорости притока и оттока в диапазоне от 0 до 11, проводя маппинг значений

Для интеграции в HA или для контроля собственной логикой работы вентмашины в MQTT появляются соответствующие топики (/devices/Ventilation speed/controls/Exhaust fan speed и /devices/Ventilation speed/controls/Supply fan speed)

1 лайк

Спасибо, что поделились решением.

Буквально на днях мы добавили поддержку enum для каналов, задавать так:

// Список возможных значений
 "enum": [1, 2, 3],

// Надписи значений
 "enum_titles": ["one", "two", "three"],

Пример в интерфейсе
изображение

Описано в документации на драйвер: GitHub - wirenboard/wb-mqtt-serial: Wiren Board MQTT serial protocol driver

Доступно в тестинге с версии wb-mqtt-serial (2.112.0)

В wb-rules enum заехали тоже с версии (2.20.1), доступно в тестинге вместе с переводами:

1 лайк

Осталось дождаться когда оно выйдет из тестинга – старый я стал чтобы отлавдивать баги :slight_smile:

Конец апреля/начало мая в wb-2404

1 лайк

В моей инструкции значения скоростей для обоих каналов одинаковые
выглядит так

var ventilationSupplySpeeds =  [0, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14];
var ventilationExhaustSpeeds = [0, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14];

В результате получилось с виртуальным устройством…
2024-03-28_00-09-09

Спасибо

Поделитесь пожалуйста кодом виртуального устройства!