Skip to content

KNX

Общее

KNX IP (KNXnet/IP) — это коммуникационный протокол и аппаратный шлюз, который позволяет устройствам стандарта KNX (умный дом и автоматизация зданий) обмениваться данными через локальную сеть (LAN) или интернет. Он используется для программирования системы из программы ETS, подключения серверов визуализации и интеграции с голосовыми помощниками.

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

ts
export const KNXIPSettingsSchema = z.object({
  settings: z.object({
    /** IP-адрес KNX-шлюза. */
    IP: nonEmptyString(t("shared_text.ip_required")),
    /** Порт KNX-шлюза. */
    Port: nonEmptyString(t("shared_text.port_required")),
    /** Физический адрес. */
    PhysAddr: z.string(),
    /** Трансляция сетевых адресов NAT (0/1). */
    IsNat: z.number(),
    /** Защита соединения (0/1). */
    HasProtection: z.number(),
    /** Код аутентификации. Появляется только при HasProtection === 1. */
    authenticationCode: z.string().optional(),
    /** Пароль пусконаладки. Появляется только при HasProtection === 1. */
    commissioningPassword: z.string().optional(),
    /** Устройства вкладки «Безопасность». Записывается в настройки, чтобы не менять структуру BaseObject. */
    Security: ZodSecurityDevicesArray.optional().default([]),
  }),
});

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

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

НастройкаЧт.Зап.
групповой адрес
тип данных

Типы

ts
export interface IKNXDriverSettingProps {
  /** групповой адрес KNX в форме a/b/c (валидация: зона 0–31, линия 0–7, устройство 0–255) */
  [EDriverSettingsType.KNX_ADDRESS]: string;
  /** тип данных DPT; хранится кодом («1.001»), лейблы enum — человекочитаемые ключи */
  [EDriverSettingsType.DATA_TYPE]: EKNXDataType;
}

Вкладка безопасность

О том что такое стратегия импорта можно почитать здесь Таб 'безопасность' в драйверах. В данном случае мы импортируем файл .knxproj, в котором есоть xml файл. В этом файле есть теги Topology address="", Area address="", Lines address="", GroupAddress address="" Из этих тегов нам нужно собрать массив из утсройств. Главными его свойствами устройств являются адрес и групповые адреса.

Устройство KNX безопасности

ts
export const ZodSecurityDevice = z.object({
  /** uuid устройства. */
  id: z.string().uuid(),
  /** Название устройства. */
  name: z.string().min(1, t("shared_text.name_required")),
  /** Составной адрес в формате "1.2.3". */
  address: z
    .string()
    .regex(/^\d+\.\d+\.\d+$/, t("driver_security.validation.address_format")),
  /** Частота опроса (раз в секунду, 1–60). */
  frequencyPerSec: z.number().min(1).max(60),
  /** Массив групповых адресов в формате "31/7/255". */
  groupAddresses: z.array(
    z
      .string()
      .regex(
        /^\d{1,3}\/\d{1,3}\/\d{1,3}$/,
        t("driver_security.validation.group_address_format"),
      ),
  ),
  /** Белый список. Если false — устройство не учитывается при синхронизации. */
  isEnabled: z.boolean(),
});

Адрес

Адрес - это собирательное свойство, т.е его значение состоит из адресов Topology, Area и Line Рассмотрим на примере: Topology с адресом "1", в этом теге есть тег Area с адресом 5 и в нем Line с адресом 7, получается состовной адрес будет равен 1.5.7. Внутри Topology может быть много Area, а в этих Area может быть много Line

Групповой адрес

Групповые адреса - это сущности, которые привязываются к Line через аттрибут link и таким образом мы привязываем их к конечному устройству. Они могут дублироваться у всех устройств. У одного устройства их может быть неограниченное количество.

Выбор конкретных Topology, Area и Lines для создания

Мы, посредством диалогового окна KNXSelectLinesDialog, в котором иерархия этих тегов отображена в виде дерева, может выбирать нужные нам Topology, Area и Lines

Создание, удаление и редактирование устройств

После того как мы импортировали необходимые нам устройства из файла - мы забываем о нем. Связи между файлом и нашими устройствами в дальнейшем нет никакой, мы можем удалять все устройства (как массово так и поодиночке), редактировать и создавать новые в ручную

Валидация при создании и редактировании

Валидация при создании и редактиравании довольно простая - состовные адреса не должны дублироваться. Т.е если у нас есть два устройства с состовными адресами 1.3.5 и 1.3.7, и мы захотим поменять у второго последнию цифру адреса на 5, чтобы получлось 1.3.5, нам выдаст ошибку и не даст сохранить данное устройство

Валидация при создании и привязке новых, и уже существующих, групповых адресов

vue
// Поиск адресов
const searchAddresses = (query: string): void => {
  searchQuery.value = query;

  if (!query) {
    // Если нет запроса, показываем все доступные адреса
    filteredAddresses.value = props.allAddresses.map((addr) => ({ address: addr }));
    return;
  }

  // Фильтруем существующие адреса
  const existingMatches = props.allAddresses
    .filter((addr) => addr.toLowerCase().includes(query.toLowerCase()))
    .map((addr) => ({ address: addr }));

  // Проверяем, является ли запрос валидным, существующим адресом
  if (isValidGroupAddress(query) && !props.allAddresses.includes(query)) {
    // Если запрос - валидный адрес, добавляем его в предложения
    filteredAddresses.value = [{ address: query }, ...existingMatches];
  } else {
    // Если такого адреса нет, то предоставляем пользователю для выбора, то что он ввел
    filteredAddresses.value = existingMatches;
  }
};
        Мы создаем новые или привязываем уже существующие адреса в компоненте GroupAddressAutocomplete.

        - при создании нового, мы начинаем вводить групповой адрес в формате 31/7/255,
          и нам выводится для выбора то что мы ввели.
          При нажатии, создается групповой адрес, который можно привязать ко всем адресам

        - при привязке существуюшего мы вводим адрес и нам выпадают адреса для привязки

Security при синхронизации

При синхронизации мы мапим IDevice в структуру которую ожидает runtime <<< @/generated-snippets/entities/project/object/drivers/KNXIP/model/entity.ts#knx-settings-sync

,

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

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

НастройкаЧт.Зап.
групповой адрес
тип данных

Mentioned In

None yet.