Skip to content

MQTT

Настройки драйвера

ts
export const MQTTSettingsSchema = z.object({
  settings: z.object({
    /** IP-адрес MQTT-брокера. */
    IP: nonEmptyString(t("shared_text.ip_required")),
    /** Порт MQTT-брокера. */
    Port: nonEmptyString(t("shared_text.port_required")),
    /** Логин для авторизации на брокере (пустая строка — без авторизации). */
    Login: z.string(),
    /** Пароль для авторизации на брокере (пустая строка — без авторизации). */
    Password: z.string(),
    /** Явная подписка на топики при подключении. */
    ExplicitSubscribe: z.boolean(),
  }),
});

Настройки связи по доступу

Настройки всегда хранятся в БД целиком — доступ связи (чтение/запись) определяет только видимость полей в редакторе и состав запроса, уходящего на контроллер.

НастройкаЧт.Зап.
тема
таймаут, сек
обработка удерживаемых сообщений
приоритет
без локальной доставки
сохранить в опубликованном виде

Типы

ts
export interface IMQTTDriverSettingsProps {
  /** тема MQTT (подписка для чтения, публикация для записи) */
  [EDriverSettingsType.TEXTAREA]: string;
  /** таймаут ожидания ответа брокера, секунд */
  [EDriverSettingsType.TIMEOUT_SEC]: string;
  /** уровень QoS 0–2 */
  [EDriverSettingsType.QOS]: string;
  /** не получать собственные публикации (no-local) */
  [EDriverSettingsType.NO_LOCAL_FLAG]: boolean;
  /** пересылать сообщение с исходным флагом retain */
  [EDriverSettingsType.RETAIN_AS_PUBLISHED]: boolean;
  /** политика retain при подписке: 0 — всегда, 1 — только новая, 2 — не запрашивать */
  [EDriverSettingsType.RETAIN_HANDLING]: string;
}

Стратегия импорта

О том что такое стратегия импорта можно почитать здесь Таб импорта в драйверах

Зависимость objectType от поля type

ts
const getObjectSettingsTypeFromMQTT = (
  type: string,
): { type: EObjectType; settings: any } | undefined => {
  switch (type) {
    case "AI":
      return { type: EObjectType.ANALOG_INPUT, settings: defaultAnalogInputSettings };
    case "AO":
      return { type: EObjectType.ANALOG_OUTPUT, settings: defaultAnalogOutputSettings };
    case "DI":
      return { type: EObjectType.DIGITAL_INPUT, settings: defaultDigitalInputSettings };
    case "DO":
      return { type: EObjectType.DIGITAL_OUTPUT, settings: defaultDigitalOutputSettings };
    case "M":
      return { type: EObjectType.MODE_OBJECT, settings: defaultModeObjectSettings };
    default:
      return undefined;
  }
};

ts
const getObjectDisplayFromMQTT = (
  type: string,
  csvRow: ICSVObject,
): ObjectDisplay | null => {
  let displayToImport: ObjectDisplay | null = null;

  switch (type) {
    case "AI":
      displayToImport = { ...defaultAnalogInputObjectDisplay };
      break;
    case "AO":
      displayToImport = { ...defaultAnalogOutputObjectDisplay };
      break;
    case "DI":
      displayToImport = { ...defaultDigitalInputObjectDisplay };
      break;
    case "DO":
      displayToImport = { ...defaultDigitalOutputObjectDisplay };
      break;
    case "M":
      displayToImport = { ...defaultModeObjectDisplay };
      break;
    default:
      return null;
  }

  if (displayToImport.name !== csvRow["#keyname"]) displayToImport.isNameTech = false;
  displayToImport.name = csvRow["name_translated"] || "";
  displayToImport.description = csvRow["description_translated"] || "";
  displayToImport.unit = bacnetUnitCodeReverseMap[csvRow["unit-code"]];

  return displayToImport;
};

Зависимость driverSettings от additionalData

ts
async updateDriverData({ additionalInfo, currentObject }): Promise<{
  objectsToUpdate?: UpdateObjectDto;
}> {
  // Обновляем настройки самого драйвера (не driverLink)
  const driverSettings = { ...currentObject.settings };

  if (additionalInfo?.IP) {
    driverSettings.IP = additionalInfo.IP;
  }
  if (additionalInfo?.PORT) {
    driverSettings.Port = additionalInfo.PORT;
  }
  if (additionalInfo?.LOGIN) {
    driverSettings.Login = additionalInfo.LOGIN;
  }
  if (additionalInfo?.PASSWORD) {
    driverSettings.Password = additionalInfo.PASSWORD;
  }

  const updatedObject: UpdateObjectDto = {
    id: currentObject.id,
    settings: {
      ...currentObject.settings,
      ...driverSettings,
    },
  };
  return {
    objectsToUpdate: updatedObject,
  };
},
ts
const getDriverLinkTypeFromSettable = (settable: string | undefined): EDriverLinkType => {
  // Если settable === "Y" - WRITE, иначе READ
  return !!settable && settable === "Y" ? EDriverLinkType.WRITE : EDriverLinkType.READ;
};

Настройки связи по доступу

Настройки всегда хранятся в БД целиком — доступ связи (чтение/запись) определяет только видимость полей в редакторе и состав запроса, уходящего на контроллер.

НастройкаЧт.Зап.
тема
таймаут, сек
обработка удерживаемых сообщений
приоритет
без локальной доставки
сохранить в опубликованном виде

Mentioned In

None yet.