Appearance
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.