Кто-нибудь подключал кухонные вытяжки по modbus?

Какие посоветуете производителей?

Именно бытовых - не встречал.
Обычно что-то “промышленное” идет с управлением.
Типа https://www.vallox.com/files/3086/Manual_Vallox_51K_51_MV_RUS.pdf
Вытяжка с точки зрения управления:

  • Как правило три (иногда 4) скорости вентилятора
  • Канал света
    Для того чтобы управлять - надо 4 реле, плюс предусмотреть отключение “встроенных” переключателей, если их планируется оставить.
    Получается:
    Модуль https://wirenboard.com/wiki/R10A-8
    Используем каналы так:
  • K1 - первая скорость вентилятора
  • K2 - первая скорость вентилятора
  • K3 - первая скорость вентилятора
  • K4 - для отключения механических переключателей самой вытяжки
  • K5 - светильник вытяжки
    Важно, при написании алгоритма управления - не допускать включение более чем одного реле. Например так:
//disable_other.js
defineVirtualDevice("testvirtual", {
  title: "relay",
  cells: {  
   	relay_1: { 
           type: "switch",
           value: false
    },
    relay_2: { 
           type: "switch",
           value: false
    },
    relay_3: { 
           type: "switch",
           value: false
    }    
  },
});

var relay_1_String = "testvirtual/relay_1";
var relay_2_String = "testvirtual/relay_2";
var relay_3_String = "testvirtual/relay_3";



defineRule("Relay_1", { //название правила
  whenChanged: relay_1_String, //при изменении состояния
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if ( newValue == true ) {
      dev[relay_2_String] = false;
      dev[relay_3_String] = false;
    }
  }
});

defineRule("Relay_2", { //название правила
  whenChanged: relay_2_String, //при изменении состояния
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if (newValue == true) {
      dev[relay_1_String] = false;
      dev[relay_3_String] = false;
    }
  }
});

defineRule("Relay_3", { //название правила
  whenChanged: relay_3_String, //при изменении состояния
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if (newValue == true) {
      dev[relay_1_String] = false;
      dev[relay_2_String] = false;
    }
  }
});

Если есть какаянибудь мождель вытяжки на примете - напишите, посмотрим в документацию.