# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/device/v1/keyapis_device_access_v1.proto, keyapis/device/v1/keyapis_device_cms_phone_v1.proto, keyapis/device/v1/keyapis_device_device_v1.proto, keyapis/device/v1/keyapis_device_event_alert_v1.proto, keyapis/device/v1/keyapis_device_events_v1.proto, keyapis/device/v1/keyapis_device_model_v1.proto, keyapis/device/v1/keyapis_device_sip_phone_v1.proto, keyapis/device/v1/keyapis_device_system_v1.proto, keyapis/device/v1/keyapis_device_trunk_config.proto
# plugin: python-betterproto
# This file has been @generated
import warnings
from collections.abc import AsyncIterator
from datetime import datetime
from typing import TYPE_CHECKING

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase
from pydantic import model_validator
from pydantic.dataclasses import (
    dataclass,
    rebuild_dataclass,
)

if TYPE_CHECKING:
    import grpclib.server
    from betterproto.grpc.grpclib_client import MetadataLike
    from grpclib.metadata import Deadline


class ModelCapabilityType(betterproto.Enum):
    """Список возможностей"""

    CAPABILITY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    CHANGE_PASSWORD = 1
    """Возможность смены пароля"""

    DTMF_CODE = 2
    """DTMF коды"""

    FLAT_AUTOCOLLECT = 3
    """Поддержка квартирного автосбора"""

    SIP_CALL = 4
    """Поддержка звонков"""

    REINSTALL = 5
    """Поддержка реконфигурирования устройства"""

    EMERGENCY_DOOR = 6
    """Аварийное открытие двери"""

    TICKER = 7
    """Поддержка бегущей строки"""

    CONCIERGE_CALL = 8
    """Вызов на номер консьержа"""

    AUTOCOLLECT = 9
    """Поддержка умного автосбора"""

    TEMPORARY_KEY = 10
    """Временные ключи"""

    OPEN_DOOR = 11
    """Открытие двери"""

    GATE = 12
    """Поддержка калитки"""

    SIP_VIDEO = 13
    """SIP видео вызов"""

    CONSTANT_KEY = 14
    """Постоянные ключи"""

    CMS_PHONES = 15
    """Поддержка аналоговых трубок"""

    SL3 = 16
    """Поддержка шифрования ключей SL3"""

    SYSLOG = 17
    """Поддержка стандарта Syslog"""

    NTP = 18
    """Поддержка протокола NTP"""

    FACE_RECOGNITION = 19
    """Распознавание лиц"""

    CAMERA = 20
    """Видеокамера"""

    EMERGENCY_CALL = 21
    """Вызов экстренной службы"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DevicePresetStatusType(betterproto.Enum):
    """
    Справочник статусов установки пресета.
     # Тип: byte
    """

    PRESET_STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    PROCESSING = 1
    """Устанавливается"""

    SUCCESS = 2
    """Установлен"""

    ERROR = 3
    """Ошибка"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceType(betterproto.Enum):
    """
    Справочник назначений типов устройств (в качестве чего выступает устройство).
     # Тип: byte
    """

    TYPE_UNKNOWN = 0
    """Значение не указано"""

    INTERCOM = 1
    """Домофон"""

    VIDEOCAMERA = 2
    """Видеокамера"""

    BARRIER = 3
    """Шлагбаум"""

    GATE = 4
    """Калитка"""

    ACCESS_CONTROL_PANEL = 5
    """СКУД"""

    OUTDOOR_CAMERA = 6
    """Наружняя видеокамера"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceModelType(betterproto.Enum):
    """
    Модель устройства.
     # Тип: byte
    """

    MODEL_TYPE_UNKNOWN = 0
    """Значение не указано"""

    RODOS8 = 1
    """Модель RODOS-8"""

    BEWARD = 2
    """Модель Beward"""

    QTECH = 3
    """Модель QTECH"""

    NATEKS = 4
    """Модель Натекс"""

    TNB = 5
    """Модель ТНБ"""

    MAXETLINE = 6
    """Модель Maxet Line"""

    TNB_DO2 = 7
    """Модель Двойная открывашка"""

    BEWARD_DS86017CP = 8
    """Модель Beward DS86017CP"""

    BEWARD_DS85006MP = 9
    """Модель Beward DS85006MP"""

    DAHUA_VTO2101E_P = 10
    """Модель Dahua DHI-VTO2101E-P"""

    HIKVISION_DS_KV8155_IM = 11
    """Модель Hikvision DS-KV8155-IM"""

    RODOS8_2 = 12
    """Модель RODOS-8-2"""

    AKUVOX_R29C = 13
    """Модель Akuvox R29C"""

    SAFE_LOGIC = 14
    """Модель Safe-logic"""

    BEWARD_DS86006AP = 15
    """Модель Beward DS86006AP"""

    SPUTNIK_IO = 16
    """Модель Спутник Ио"""

    BEWARD_FR = 17
    """Модель Beward c FR"""

    QTECH_FR = 18
    """Модель QTECH с FR"""

    ELTEX_IPA_ER_010 = 19
    """Модель Eltex IPA-ER-10"""

    BEWARD_MIFARE = 20
    """Модель Beward с новым API ключей"""

    BAS_IP_AA_12FB = 21
    """Модель BAS-IP AA-12FB"""

    AKUVOX_X915S = 22
    """Модель Akuvox X915S"""

    RUBETEK_RV_3434 = 23
    """Модель Rubetek RV-3434"""

    SOKOL_PLUS = 24
    """Модель Сокол плюс"""

    BEWARD_LOW_COST = 25
    """Модель Beward Эконом"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceStatusType(betterproto.Enum):
    """
    Справочник статусов устройства.
     # Тип: byte
    """

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    OFFLINE = 1
    """Не в сети"""

    ONLINE = 2
    """В сети"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceSipTrunkSipType(betterproto.Enum):
    """
    Тип сети связи.
     # Тип: byte
    """

    SIP_TYPE_UNKNOWN = 0
    """Значение не указано"""

    VIMS = 1
    """Тип Viprtual IP Multimedia Subsystem"""

    NGN = 2
    """Тип Next Generation Networks"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceCredentialsUserAccessType(betterproto.Enum):
    """
    Тип доступа пользователя.
     # Тип: byte
    """

    USER_ACCESS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    API = 1
    """Доступ к api"""

    WEB = 2
    """Доступ к web-интерфейсу"""

    RTSP = 3
    """Доступ к rtsp-потоку"""

    SU = 4
    """Полный доступ"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceConfigurationStatusConfigurationType(betterproto.Enum):
    """
    Тип конфигурации.
     # Тип: byte
    """

    CONFIGURATION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    PRESET = 1
    """Пресет"""

    SIP_ACCOUNT = 2
    """Сип-аккаунт"""

    SIP_ROOMS = 3
    """сип-номера в помещениях"""

    GATE = 4
    """Калитка"""

    RFIDS = 5
    """Ключи"""

    CODES = 6
    """Коды"""

    FACE_RECOGNITION = 7
    """Распознование лиц"""

    CONCIERGE = 8
    """Консьерж"""

    AUTOCOLLECT = 9
    """Автосбор"""

    SL3 = 10
    """Режим Sl3"""

    EMERGENCY_CALL = 11
    """Вызов экстренной службы"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceConfigurationStatusStatusType(betterproto.Enum):
    """
    Справочник статусов конфигурации настройки устройства.
     # Тип: byte
    """

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    SUCCESS = 1
    """Настроен"""

    ERROR = 2
    """Ошибка"""

    PENDING = 3
    """В ожидании обработки"""

    PROCESSING = 4
    """В процессе обработки"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CameraStatusStatusType(betterproto.Enum):
    """
    Статус камеры.
     # Тип: byte
    """

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    PROCESSING = 1
    """В процессе регистрации"""

    PROCESSING_ERROR = 2
    """Ошибка регистрации"""

    ACTIVE = 3
    """Активна"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class SyncStatusStatusType(betterproto.Enum):
    """
    Статус синхронизации.
     # Тип: byte
    """

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    NEW = 1
    """Новый"""

    PENDING = 2
    """В процессе"""

    ERROR = 3
    """Ошибка"""

    SUCCESS = 4
    """Успешно"""

    DISABLED = 5
    """Выключено"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DevicePagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ID = 1
    """По идентификатору"""

    TITLE = 2
    """По наименованию"""

    SYNC_AT = 3
    """По дате последней попытки синхронизации"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DevicePagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки.
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceConfigurationStatusGroupedPagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DEVICE_ID = 1
    """По идентификатору устройства"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceConfigurationStatusGroupedPagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки.
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PresetStatusType(betterproto.Enum):
    """
    Справочник статусов.
     # Тип: byte
    """

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ACTIVE = 1
    """Активный"""

    ARCHIVE = 2
    """Архивный"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PresetSyslogProtocolType(betterproto.Enum):
    """
    Тип протокола.
     # Тип: byte
    """

    PROTOCOL_TYPE_UNKNOWN = 0
    """Значение не указано"""

    UDP = 1
    """Протокол UDP"""

    TCP = 2
    """Протокол TCP"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PresetVideoConfigQualityType(betterproto.Enum):
    """
    Справочник качеств.
     # Тип: byte
    """

    QUALITY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    HIGH = 1
    """Высокое качество"""

    MEDIUM = 2
    """Среднее качество"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PresetFaceRecognitionConfigurationType(betterproto.Enum):
    """
    Тип конфигурации.
     # Тип: byte
    """

    CONFIGURATION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DEFAULT = 1
    """По умолчанию"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class TrunkConfigPagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ID = 1
    """По идентификатору"""

    CHANGED_AT = 2
    """Дата последнего изменения"""

    CREATED_AT = 3
    """Дата создания"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class TrunkConfigPagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки;
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CmsPhoneStatusType(betterproto.Enum):
    """
    Справочник статусов аналоговой трубки.
     # Тип: byte
    """

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    PENDING_ACTIVE = 1
    """Ожидает активации"""

    ACTIVE = 2
    """Активна"""

    PENDING_BLOCKED = 3
    """Ожидает блокировки"""

    BLOCKED = 4
    """Заблокирована"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CmsPhonePagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ID = 1
    """По идентификатору"""

    STATUS = 2
    """По статусу доступности"""

    CHANGED_AT = 3
    """Дата последнего изменения"""

    CREATED_AT = 4
    """Дата создания"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class CmsPhonePagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки;
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PrepareStartTaskPlayType(betterproto.Enum):
    """
    Тип проигрывания.
     # Тип: byte
    """

    PLAY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    HANDSET_ONLY = 1
    """Только на аналоговые трубки"""

    SPEAKER_ONLY = 2
    """Только на динамик домофона"""

    HANDSET_AND_SPEAKER = 3
    """
    Сначала на аналоговые трубки проигрываем заданное количество тактов, затем на динамик домофона
    """

    SPEAKER_AND_HANDSET = 4
    """
    Сначала на динамик домофона проигрываем заданное количество тактов, затем на аналоговые трубки
    """

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PlayStartTaskPlayType(betterproto.Enum):
    """
    Тип проигрывания.
     # Тип: byte
    """

    PLAY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    HANDSET_ONLY = 1
    """Только на аналоговые трубки"""

    SPEAKER_ONLY = 2
    """Только на динамик домофона"""

    HANDSET_AND_SPEAKER = 3
    """
    Сначала на аналоговые трубки проигрываем заданное количество тактов, затем на динамик домофона
    """

    SPEAKER_AND_HANDSET = 4
    """
    Сначала на динамик домофона проигрываем заданное количество тактов, затем на аналоговые трубки
    """

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class SipPhoneStatusType(betterproto.Enum):
    """
    Справочник статусов SIP-трубки.
     # Тип: byte
    """

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ACTIVE = 1
    """Активна"""

    BLOCKED = 2
    """Заблокирована"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class SipPhonePagingOrderByType(betterproto.Enum):
    """
    Справочник типов значений сортировки.
     # Тип: byte
    """

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ID = 1
    """По идентификатору"""

    STATUS = 2
    """По статусу доступности"""

    CHANGED_AT = 3
    """Дата последнего изменения"""

    CREATED_AT = 4
    """Дата создания"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class SipPhonePagingDirectionType(betterproto.Enum):
    """
    Справочник типов направлений сортировки;
     # Тип: byte
    """

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class DeviceAccessAccessorType(betterproto.Enum):
    """Тип субъекта доступа"""

    ACCESSOR_TYPE_UNKNOWN = 0
    """Значение не указно"""

    GROUP = 1
    """ГРуппа"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class ConfigureDeviceResultTaskSettingsStatusType(betterproto.Enum):
    """
    Справочник статусов конфигурации устройства.
     # Тип: byte
    """

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано"""

    SUCCESS = 1
    """Настроен"""

    ERROR = 2
    """Ошибка"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Model(betterproto.Message):
    """Модель устройства"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Device(betterproto.Message):
    """
    Устройство.
     # Описание модели
    """

    id: int = betterproto.int32_field(1)
    """
    Идентификатор.
     # Диапазон: 0..2147483647
    """

    preset_id: int = betterproto.int32_field(2)
    """
    Идентификатор пресета.
     # Диапазон: 1..2147483647
    """

    preset_status_type: "DevicePresetStatusType" = betterproto.enum_field(3)
    """
    Статус установки пресета.
     # Поле вычисляется в коде приложения
    """

    preset_configured_at: datetime = betterproto.message_field(4)
    """
    Дата установки пресета на устройство.
     # Тип: DateTime
    """

    is_sl3_mode_enabled: bool = betterproto.bool_field(5)
    """Настройка режима SL3"""

    type: "DeviceType" = betterproto.enum_field(6)
    """Тип назначения устройства"""

    mac_address: str = betterproto.string_field(7)
    """
    MAC-адрес.
     # Диапазон: 17..17.
     # Паттерн: /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/
    """

    title: str = betterproto.string_field(8)
    """
    Наименование устройства.
     # Диапазон: 3..256
    """

    model_type: "DeviceModelType" = betterproto.enum_field(9)
    """Модель устройства"""

    owner_company_id: int = betterproto.int32_field(10)
    """
    Идентификатор компании владельца.
     # Диапазон: 1..2147483647
    """

    serial_number: str = betterproto.string_field(11)
    """
    Серийный номер.
     # Диапазон: 1..16
    """

    flatgramm_id: int = betterproto.int32_field(12)
    """
    Идентификатор квартирограммы.
     # Диапазон: 1..2147483647
    """

    utc_offset: int = betterproto.int32_field(13)
    """
    Смещение таймзоны в минутах.
     # Диапазон: -720..840
    """

    status_type: "DeviceStatusType" = betterproto.enum_field(14)
    """Статус устройства"""

    ip_address: "str | None" = betterproto.message_field(
        15, wraps=betterproto.TYPE_STRING
    )
    """
    Сетевой адрес.
     # Диапазон: 0..250
    """

    port: "int | None" = betterproto.message_field(16, wraps=betterproto.TYPE_INT32)
    """
    Сетевой порт.
     # Диапазон: 0..65535
    """

    sputnik_credentials: "DeviceSputnikCredentials" = betterproto.message_field(17)
    """
    Учетные данные.
     Используется для устройств с типом модели SPUTNIK_IO
    """

    location: "DeviceLocation" = betterproto.message_field(18)
    """Координаты"""

    camera_id: "str | None" = betterproto.message_field(
        19, wraps=betterproto.TYPE_STRING
    )
    """
    Идентификатор камеры uid.
     # Тип: Guid
    """

    tags: "list[str]" = betterproto.string_field(20)
    """
    Список тегов устройства.
     # Диапазон: 1..50
    """

    settings: "DeviceSettings" = betterproto.message_field(21)
    """Настройки устройства"""

    hardware_version: str = betterproto.string_field(22)
    """Версия аппаратного обеспенения"""

    software_version: str = betterproto.string_field(23)
    """Версия программного обеспенения"""

    dispatching: "DeviceDispatching" = betterproto.message_field(24)
    """Диспетчеризации"""

    sip_trunk: "DeviceSipTrunk" = betterproto.message_field(25)
    """Транк"""

    redirect: "DeviceRedirect" = betterproto.message_field(26)
    """Переадресация"""

    autochange_password_settings: "DeviceAutochangePasswordSettings" = (
        betterproto.message_field(27)
    )
    """Настройки автозамены пароля"""

    credentials: "list[DeviceCredentials]" = betterproto.message_field(28)
    """Учетные данные пользователей"""

    sip_account: "str | None" = betterproto.message_field(
        29, wraps=betterproto.TYPE_STRING
    )
    """Сип-аккаунт"""

    sync_status: "SyncStatus" = betterproto.message_field(30)
    """Статус синхронизации"""

    def __post_init__(self) -> None:
        super().__post_init__()
        if self.is_set("preset_status_type"):
            warnings.warn("Device.preset_status_type is deprecated", DeprecationWarning)
        if self.is_set("preset_configured_at"):
            warnings.warn(
                "Device.preset_configured_at is deprecated", DeprecationWarning
            )
        if self.is_set("is_sl3_mode_enabled"):
            warnings.warn(
                "Device.is_sl3_mode_enabled is deprecated", DeprecationWarning
            )


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSputnikCredentials(betterproto.Message):
    """
    Учетные данные.
     Используется для устройств с типом модели SPUTNIK_IO
    """

    login: str = betterproto.string_field(1)
    """
    Логин.
     # Тип: Guid
    """

    password: "str | None" = betterproto.message_field(2, wraps=betterproto.TYPE_STRING)
    """
    Пароль.
     На чтение выводится только для пользователя с типом service
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceLocation(betterproto.Message):
    """Координаты"""

    latitude: float = betterproto.float_field(1)
    """Широта"""

    longitude: float = betterproto.float_field(2)
    """Долгота"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSettings(betterproto.Message):
    """Настройки устройства"""

    coordinate_matrix_switch: "DeviceSettingsCoordinateMatrixSwitch" = (
        betterproto.message_field(1)
    )
    """Настройки ККМ"""

    concierge_call: "DeviceSettingsConciergeCall" = betterproto.message_field(2)
    """
    Настройки вызова консьержа.
     Требуется капабилити CONCIERGE_CALL
    """

    autocollect: "DeviceSettingsAutocollect" = betterproto.message_field(3)
    """Настройки автосбора"""

    face_recognition: "DeviceSettingsFaceRecognition" = betterproto.message_field(4)
    """Настройки распознования лиц"""

    sl3_mode: "DeviceSettingsSl3Mode" = betterproto.message_field(5)
    """Настройки режима SL3"""

    emergency_call: "DeviceSettingsEmergencyCall" = betterproto.message_field(6)
    """
    Настройки вызова экстренной службы.
     Только для устройств с CapabilityType=EMERGENCY_CALL
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSettingsCoordinateMatrixSwitch(betterproto.Message):
    """
    Настройки ККМ.
     Коммутатор координатно-матричный (устройство для подключения аналоговых трубок к домофону)
    """

    is_enabled: bool = betterproto.bool_field(1)
    """Состояние"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSettingsConciergeCall(betterproto.Message):
    """Настройки вызова консьержа"""

    is_enabled: bool = betterproto.bool_field(1)
    """Статус настройки вызова консьержа"""

    orpon: int = betterproto.int64_field(2)
    """Идентификатор ОРПОН"""

    room_number: str = betterproto.string_field(3)
    """
    Номер квартиры.
     # Диапазон: 1..5
    """

    sip_number: str = betterproto.string_field(4)
    """Номер сип-трубки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSettingsAutocollect(betterproto.Message):
    """Настройки автосбора"""

    is_enabled: bool = betterproto.bool_field(1)
    """Статус настройки автосбора"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSettingsFaceRecognition(betterproto.Message):
    """Настройки распознования лиц"""

    is_enabled: bool = betterproto.bool_field(1)
    """Статус настройки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSettingsSl3Mode(betterproto.Message):
    """Настройки режима SL3"""

    is_enabled: bool = betterproto.bool_field(1)
    """Статус настройки"""

    encryption_profile_id: "str | None" = betterproto.message_field(
        2, wraps=betterproto.TYPE_STRING
    )
    """Идентификатор профиля шифрования"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSettingsEmergencyCall(betterproto.Message):
    """
    Настройки вызова экстренной службы.
     Только для устройств с CapabilityType=EMERGENCY_CALL
    """

    is_call_available: bool = betterproto.bool_field(1)
    """Возможность вызова экстренной службы"""

    emergency_number: str = betterproto.string_field(2)
    """
    АБС-номер экстренной службы.
     # Паттерн: /^\+[1-9][0-9]{10}$/
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceDispatching(betterproto.Message):
    """Диспетчеризации"""

    is_enabled: bool = betterproto.bool_field(1)
    """Статус настройки диспетчеризации"""

    public_identity: "str | None" = betterproto.message_field(
        2, wraps=betterproto.TYPE_STRING
    )
    """
    Публичный номер.
     # Паттерн: /^[1-9]\d{3,7}$/
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSipTrunk(betterproto.Message):
    """
    Транк.
     Параметры для соединения между устрйоством и телефонной сетью общего пользования.
     Требуется капабилити SIP_CALLS
    """

    abc_number: str = betterproto.string_field(1)
    """
    ABC-номер.
     # Паттерн: /^(\+7)(\d{10})$/
    """

    host: "str | None" = betterproto.message_field(2, wraps=betterproto.TYPE_STRING)
    """
    Хост.
     # Диапазон: 0..250
    """

    port: "int | None" = betterproto.message_field(3, wraps=betterproto.TYPE_INT32)
    """
    Порт.
     # Диапазон: 0..65535
    """

    sip_type: "DeviceSipTrunkSipType" = betterproto.enum_field(4)
    """Тип сети связи"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceRedirect(betterproto.Message):
    """
    Переадресация.
     Требуется капабилити SIP_CALLS
    """

    is_enabled_sip: bool = betterproto.bool_field(1)
    """Переадресация на SIP"""

    is_enabled_phone: bool = betterproto.bool_field(2)
    """Переадресация на телефон"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceAutochangePasswordSettings(betterproto.Message):
    """Настройки автозамены пароля"""

    is_enabled: bool = betterproto.bool_field(1)
    """Статус настройки автозамены пароля"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceCredentials(betterproto.Message):
    """Учетные данные пользователей"""

    login: "str | None" = betterproto.message_field(1, wraps=betterproto.TYPE_STRING)
    """
    Логин.
     # Диапазон: 0..100
    """

    password: "str | None" = betterproto.message_field(2, wraps=betterproto.TYPE_STRING)
    """
    Пароль.
     # Диапазон: 0..100
    """

    user_access_type: "DeviceCredentialsUserAccessType" = betterproto.enum_field(3)
    """Тип доступа пользователя"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingError(betterproto.Message):
    """
    Ошибка сохранения.
     Эти проверки выполняются при работе с базой данных и сторонними сервисами
    """

    mac_address_invalid: "DeviceSavingErrorMacAddressInvalid | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Переданный мак-адрес не валидный"""

    serial_number_invalid: "DeviceSavingErrorSerialNumberInvalid | None" = (
        betterproto.message_field(2, optional=True, group="reason")
    )
    """Переданный серийный номер не валидный"""

    not_allowed_for_type: "DeviceSavingErrorNotAllowedForType | None" = (
        betterproto.message_field(3, optional=True, group="reason")
    )
    """Нельзя изменить тип назначения девайса"""

    not_allowed_for_model: "DeviceSavingErrorNotAllowedForModel | None" = (
        betterproto.message_field(4, optional=True, group="reason")
    )
    """Нельзя изменить модель девайса"""

    serial_number_for_model_is_exist: (
        "DeviceSavingErrorSerialNumberForModelIsExist | None"
    ) = betterproto.message_field(5, optional=True, group="reason")
    """Серийный номер для данной модели уже существует на платформе"""

    mac_address_is_exist: "DeviceSavingErrorMacAddressIsExist | None" = (
        betterproto.message_field(6, optional=True, group="reason")
    )
    """MAC-адрес уже существует на платформе"""

    capability_is_not_supported: "DeviceSavingErrorCapabilityIsNotSupported | None" = (
        betterproto.message_field(7, optional=True, group="reason")
    )
    """Настройка не поддерживается"""

    abc_number_is_exist_on_another_device: (
        "DeviceSavingErrorAbcNumberIsExistOnAnotherDevice | None"
    ) = betterproto.message_field(8, optional=True, group="reason")
    """ABC-номер присвоен другому устройству"""

    public_identity_is_exist: "DeviceSavingErrorPublicIdentityIsExist | None" = (
        betterproto.message_field(9, optional=True, group="reason")
    )
    """Публичный номер уже существует на платформе"""

    concierge_room_not_found: "DeviceSavingErrorConciergeRoomNotFound | None" = (
        betterproto.message_field(10, optional=True, group="reason")
    )
    """Не найдена квартира для консьержа"""

    login_is_exist: "DeviceSavingErrorLoginIsExist | None" = betterproto.message_field(
        11, optional=True, group="reason"
    )
    """Логин уже существует на платформе"""

    credentials_are_required: "DeviceSavingErrorCredentialsAreRequired | None" = (
        betterproto.message_field(12, optional=True, group="reason")
    )
    """Отсутствуют реквизиты для модели "Спутник"""

    field_is_not_supported: "DeviceSavingErrorFieldIsNotSupported | None" = (
        betterproto.message_field(13, optional=True, group="reason")
    )
    """Переданное поле не поддерживается"""

    def __post_init__(self) -> None:
        super().__post_init__()
        if self.is_set("mac_address_invalid"):
            warnings.warn(
                "DeviceSavingError.mac_address_invalid is deprecated",
                DeprecationWarning,
            )
        if self.is_set("serial_number_invalid"):
            warnings.warn(
                "DeviceSavingError.serial_number_invalid is deprecated",
                DeprecationWarning,
            )

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorMacAddressInvalid(betterproto.Message):
    """Переданный мак-адрес не валидный"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorSerialNumberInvalid(betterproto.Message):
    """Переданный серийный номер не валидный"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorNotAllowedForType(betterproto.Message):
    """Нельзя изменить тип назначения девайса"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorNotAllowedForModel(betterproto.Message):
    """Нельзя изменить модель девайса"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorSerialNumberForModelIsExist(betterproto.Message):
    """Серийный номер для данной модели уже существует на платформе"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorMacAddressIsExist(betterproto.Message):
    """MAC-адрес уже существует на платформе"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorCapabilityIsNotSupported(betterproto.Message):
    """Функциональность не поддерживается моделью устройства"""

    model_capability_type: "ModelCapabilityType" = betterproto.enum_field(1)
    """Возможность"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorAbcNumberIsExistOnAnotherDevice(betterproto.Message):
    """ABC-номер присвоен другому устройству"""

    device_id: int = betterproto.int32_field(1)
    """Идентификатор устройства на котором находится ABC-номер"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorPublicIdentityIsExist(betterproto.Message):
    """Публичный номер уже существует на платформе"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorConciergeRoomNotFound(betterproto.Message):
    """Не найдена квартира для консьержа"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorLoginIsExist(betterproto.Message):
    """Логин уже существует на платформе"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorCredentialsAreRequired(betterproto.Message):
    """Отсутствуют реквизиты для модели "Спутник"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceSavingErrorFieldIsNotSupported(betterproto.Message):
    """Переданное поле не поддерживается"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceLite(betterproto.Message):
    """
    Облегчённое устройство.
     # Описание модели
    """

    id: int = betterproto.int32_field(1)
    """
    Идентификатор.
     # Диапазон: 0..2147483647
    """

    type: "DeviceType" = betterproto.enum_field(2)
    """Тип назначения устройства"""

    title: str = betterproto.string_field(3)
    """# Диапазон: 3..256"""

    location: "DeviceLocation" = betterproto.message_field(4)
    """Координаты"""

    status_type: "DeviceStatusType" = betterproto.enum_field(5)
    """Статус устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceConfigurationStatus(betterproto.Message):
    """
    Статус конфигурации устройства.
     # Описание модели
    """

    id: int = betterproto.int32_field(1)
    """Идентификатор"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    configuration_type: "DeviceConfigurationStatusConfigurationType" = (
        betterproto.enum_field(3)
    )
    """Тип конфигурации"""

    status_type: "DeviceConfigurationStatusStatusType" = betterproto.enum_field(4)
    """Статус конфигурации настройки устройства"""

    configured_at: datetime = betterproto.message_field(5)
    """
    Дата последней конфигурации устройства.
     # Тип: DateTime
    """

    error_message: "str | None" = betterproto.message_field(
        6, wraps=betterproto.TYPE_STRING
    )
    """Текст ошибки"""

    retry_count: int = betterproto.int32_field(7)
    """Количество попыток"""

    payload: "DeviceConfigurationStatusPayload" = betterproto.message_field(8)
    """Дополнительная полезная нагрузка"""

    next_retry_at: datetime = betterproto.message_field(9)
    """
    Минимально возможная дата выполнения следующей попытки.
     # Тип: DateTime
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceConfigurationStatusPayload(betterproto.Message):
    """Дополнительная полезная нагрузка"""

    autocollect: "DeviceConfigurationStatusPayloadAutocollect | None" = (
        betterproto.message_field(1, optional=True, group="attribute")
    )
    """Автоколлект"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceConfigurationStatusPayloadAutocollect(betterproto.Message):
    """Автоколлект"""

    enabled_at: datetime = betterproto.message_field(1)
    """
    Дата включения автосбора.
     # Тип: DateTime
    """

    to_be_disabled_at: datetime = betterproto.message_field(2)
    """
    Дата отключения автосбора.
     # Тип: DateTime
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceConfigurationStatusGrouped(betterproto.Message):
    """Сгруппированный по устройству список конфигураций"""

    device_id: int = betterproto.int32_field(1)
    """Идентификатор устройства"""

    statuses: "list[DeviceConfigurationStatus]" = betterproto.message_field(2)
    """Список конфигураций"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CameraStatus(betterproto.Message):
    """
    Статус камеры.
     # Описание модели
    """

    id: "str | None" = betterproto.message_field(1, wraps=betterproto.TYPE_STRING)
    """
    Идентификатор камеры uid.
     # Тип: Guid
    """

    status_type: "CameraStatusStatusType" = betterproto.enum_field(2)
    """Статус камеры"""

    error_message: str = betterproto.string_field(3)
    """Сообщение об ошибке"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SyncStatus(betterproto.Message):
    """
    Статус синхронизации.
     # Описание модели
    """

    status_type: "SyncStatusStatusType" = betterproto.enum_field(1)
    """Статус синхронизации"""

    error_message: str = betterproto.string_field(2)
    """Сообщение об ошибке"""

    retry_count: int = betterproto.int32_field(3)
    """Количество попыток"""

    successful_at: datetime = betterproto.message_field(4)
    """
    Дата последней успешной синхронизации.
     # Тип: DateTime
    """

    sync_at: datetime = betterproto.message_field(5)
    """
    Дата последней синхронизации.
     # Тип: DateTime
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceRequest(betterproto.Message):
    """Запрос получения устройства"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceResponse(betterproto.Message):
    """Ответ на запрос получения устройства"""

    data: "Device | None" = betterproto.message_field(1, optional=True, group="type")
    """Устройство"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceLiteRequest(betterproto.Message):
    """Запрос получения устройства"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceLiteResponse(betterproto.Message):
    """Ответ на запрос получения устройства"""

    data: "DeviceLite | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Устройство"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceRequest(betterproto.Message):
    """Запрос на создание/изменение устройства"""

    data: "Device" = betterproto.message_field(1)
    """Устройство"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceResponse(betterproto.Message):
    """Ответ на запрос на создание/изменение устройства"""

    data: "Device | None" = betterproto.message_field(1, optional=True, group="type")
    """Устройство"""

    error: "PostDeviceResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceResponseError(betterproto.Message):
    """Ошибка запроса сохранения устройства"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    saving: "DeviceSavingError | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Ошибка сохранения"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceListRequest(betterproto.Message):
    """Запрос получения списка устройств"""

    filter: "DeviceFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "DevicePaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Пагинация"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceListResponse(betterproto.Message):
    """Ответ на запрос получения списка устройств"""

    data: "Device | None" = betterproto.message_field(1, optional=True, group="type")
    """Устройство"""

    error: "GetDeviceListResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceListResponseError(betterproto.Message):
    """Ошибка запроса на получение списка устройств"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceCountRequest(betterproto.Message):
    """Запрос получения количества устройств"""

    filter: "DeviceFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceCountResponse(betterproto.Message):
    """Ответ на запрос получения количества устройств"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Количество"""

    error: "GetDeviceCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceCountResponseError(betterproto.Message):
    """Ошибка"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutDeviceRequest(betterproto.Message):
    """Запрос изменения устройства"""

    id: int = betterproto.int32_field(1)
    """Идентификатор устройства"""

    preset_id: int = betterproto.int32_field(2)
    """Идентификатор пресета"""

    is_sl3_mode_enabled: bool = betterproto.bool_field(3)
    """Настройка режима SL3"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PutDeviceResponse(betterproto.Message):
    """ответ на завпрос изменения устройства"""

    data: "Device | None" = betterproto.message_field(1, optional=True, group="type")
    """Устройство"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceInstallPresetRequest(betterproto.Message):
    """Запрос установки пресета на устройство"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceInstallPresetResponse(betterproto.Message):
    """Ответ на запрос установки пресета на устройство"""

    error: "PostDeviceInstallPresetResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка при установке пресета"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceInstallPresetResponseError(betterproto.Message):
    """Ошибка при установке пресета"""

    preset_status_is_processing: (
        "PostDeviceInstallPresetResponseErrorPresetStatusIsProcessing | None"
    ) = betterproto.message_field(1, optional=True, group="reason")
    """Пресет в процессе установки"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceInstallPresetResponseErrorPresetStatusIsProcessing(betterproto.Message):
    """Пресет в процессе установки"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReplaceRequest(betterproto.Message):
    """Запрос на замену устройства"""

    id: int = betterproto.int32_field(1)
    """Идентификатор устройства"""

    host: str = betterproto.string_field(2)
    """Хост"""

    mac_address: str = betterproto.string_field(3)
    """
    MAC-адрес.
     # Диапазон: 17..17.
     # Паттерн: /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/
    """

    serial_number: str = betterproto.string_field(4)
    """Серийный номер"""

    login: str = betterproto.string_field(5)
    """Логин (для модели спутник)"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReplaceResponse(betterproto.Message):
    """Ответ на запрос на замену устройства"""

    error: "PostDeviceReplaceResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка замены устройства"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReplaceResponseError(betterproto.Message):
    """Ошибка замены устройства"""

    validation_error: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    host_exists: "PostDeviceReplaceResponseErrorHostExists | None" = (
        betterproto.message_field(2, optional=True, group="reason")
    )
    """На платформе уже существует устройство с таким хостом"""

    mac_address_exists: "PostDeviceReplaceResponseErrorMacAddressExists | None" = (
        betterproto.message_field(3, optional=True, group="reason")
    )
    """На платформе уже существует устройство с таким MAC-адресом"""

    serial_number_exists: "PostDeviceReplaceResponseErrorSerialNumberExists | None" = (
        betterproto.message_field(4, optional=True, group="reason")
    )
    """На платформе уже существует устройство с таким серийным номером"""

    login_exists: "PostDeviceReplaceResponseErrorLoginExists | None" = (
        betterproto.message_field(5, optional=True, group="reason")
    )
    """
    На платформе уже существует устройство с таким логином (для устройст модели "Спутник")
    """

    login_is_required: "PostDeviceReplaceResponseErrorLoginIsRequired | None" = (
        betterproto.message_field(6, optional=True, group="reason")
    )
    """Отсутствует поле Login для модели "Спутник"""

    reinstall_error: "ReinstallError | None" = betterproto.message_field(
        7, optional=True, group="reason"
    )
    """Ошибка реинстала"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReplaceResponseErrorHostExists(betterproto.Message):
    """На платформе уже существует устройство с таким хостом"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReplaceResponseErrorMacAddressExists(betterproto.Message):
    """На платформе уже существует устройство с таким MAC-адресом"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReplaceResponseErrorSerialNumberExists(betterproto.Message):
    """На платформе уже существует устройство с таким серийным номером"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReplaceResponseErrorLoginExists(betterproto.Message):
    """
    На платформе уже существует устройство с таким логином (для устройст модели "Спутник")
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReplaceResponseErrorLoginIsRequired(betterproto.Message):
    """Отсутствует поле Login для модели "Спутник"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReconfigureRequest(betterproto.Message):
    """Запрос на переконфигурирование устройства"""

    id: int = betterproto.int32_field(1)
    """Идентификатор устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReconfigureResponse(betterproto.Message):
    """Ответ на запрос на переконфигурирование устройства"""

    error: "PostDeviceReconfigureResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка переконфигурирования устройства"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceReconfigureResponseError(betterproto.Message):
    """Ошибка переконфигурирования устройства"""

    validation_error: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    reinstall_error: "ReinstallError | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Ошибка реинстала"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceConfigurationStatusesRequest(betterproto.Message):
    """Запрос получения статусов конфигурации устройства"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceConfigurationStatusesResponse(betterproto.Message):
    """Ответ на запрос получения статусов конфигурации устройства"""

    data: "GetDeviceConfigurationStatusesResponseStatuses | None" = (
        betterproto.message_field(1, optional=True, group="type")
    )
    """Устройство"""

    error: "GetDeviceConfigurationStatusesResponseError | None" = (
        betterproto.message_field(2, optional=True, group="type")
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceConfigurationStatusesResponseStatuses(betterproto.Message):
    """Статусы"""

    device_configuration_statuses: "list[DeviceConfigurationStatus]" = (
        betterproto.message_field(1)
    )
    """Статусы конфигурации устройства"""

    camera_status: "CameraStatus" = betterproto.message_field(2)
    """Статус камеры"""

    sync_status: "SyncStatus" = betterproto.message_field(3)
    """Статус синхронизации"""

    device_status_type: "DeviceStatusType" = betterproto.enum_field(4)
    """Статус устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceConfigurationStatusesResponseError(betterproto.Message):
    """Ошибка"""

    validation_error: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceConfigurationStatusRequest(betterproto.Message):
    """Запрос на изменение статуса конфигурации устройства"""

    data: "DeviceConfigurationStatus" = betterproto.message_field(1)
    """Статус конфигурации устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceConfigurationStatusResponse(betterproto.Message):
    """Ответ на запрос на изменение статуса конфигурации устройства"""

    data: "DeviceConfigurationStatus | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Статус конфигурации устройства"""

    error: "PostDeviceConfigurationStatusResponseError | None" = (
        betterproto.message_field(2, optional=True, group="type")
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostDeviceConfigurationStatusResponseError(betterproto.Message):
    """Ошибка запроса сохранения статуса конфигурации устройства"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceConfigurationStatusGroupedListRequest(betterproto.Message):
    """Запрос получения списка конфигураций сгруппированных по устройству"""

    filter: "DeviceConfigurationStatusGroupedFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "DeviceConfigurationStatusGroupedPaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Стандартный постраничный вывод"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceConfigurationStatusGroupedListResponse(betterproto.Message):
    """
    Ответ на запрос получения списка конфигураций сгруппированных по устройству
    """

    data: "DeviceConfigurationStatusGrouped | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Конфигурации устройства"""

    error: "GetDeviceConfigurationStatusGroupedListResponseError | None" = (
        betterproto.message_field(2, optional=True, group="type")
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceConfigurationStatusGroupedListResponseError(betterproto.Message):
    """Ошибка"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceConfigurationStatusGroupedCountRequest(betterproto.Message):
    """
    Запрос получения количества конфигураций сгруппированных по устройству
    """

    filter: "DeviceConfigurationStatusGroupedFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDeviceConfigurationStatusGroupedCountResponse(betterproto.Message):
    """
    Ответ на запрос получения количества конфигураций сгруппированных по устройству
    """

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Количество"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteDeviceRequest(betterproto.Message):
    """Запрос удаления устройства"""

    id: int = betterproto.int32_field(1)
    """Идентификатор устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteDeviceResponse(betterproto.Message):
    """Ответ на запрос удаления устройства"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ReinstallError(betterproto.Message):
    """Ошибки реинстала"""

    sip_login_is_missing: "ReinstallErrorSipLoginIsMissing | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Сип-логин отсутствует на устройстве"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ReinstallErrorSipLoginIsMissing(betterproto.Message):
    """Сип-логин отсутствует на устройстве"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceFilter(betterproto.Message):
    """Фильтр устройств"""

    owner_company_ids: "list[int]" = betterproto.int32_field(1)
    """По идентификаторам компании владельца"""

    text: "str | None" = betterproto.message_field(2, wraps=betterproto.TYPE_STRING)
    """
    Поиск по тексту.
     Если значение не передано то поиск по нему не производится.
     # Диапазон: 3..64.
     # Поиск производится по полям:
     # - Наименование;
     # - MAC-адрес;
     # - Список тегов устройства;
     # - Сетевой адрес;
     # - Серийный номер
    """

    flatgramm_ids: "list[int]" = betterproto.int32_field(3)
    """Идентификатор квартирограммы"""

    serial_numbers: "list[str]" = betterproto.string_field(4)
    """Серийный номер"""

    device_status_types: "list[DeviceStatusType]" = betterproto.enum_field(5)
    """Статус устройства"""

    device_types: "list[DeviceType]" = betterproto.enum_field(6)
    """Тип назначения устройства"""

    device_model_types: "list[DeviceModelType]" = betterproto.enum_field(7)
    """Модель устройства"""

    is_concierge_enabled: "bool | None" = betterproto.message_field(
        8, wraps=betterproto.TYPE_BOOL
    )
    """Переадресация на консъержа"""

    is_dispatching_enabled: "bool | None" = betterproto.message_field(
        9, wraps=betterproto.TYPE_BOOL
    )
    """Диспетчеризация"""

    dispatching_public_number: "str | None" = betterproto.message_field(
        10, wraps=betterproto.TYPE_STRING
    )
    """
    Поиск по публичному номеру диспетчеризации.
     Если значение не передано то поиск по нему не производится.
     # Диапазон: 3..64
    """

    hardware_version: "str | None" = betterproto.message_field(
        11, wraps=betterproto.TYPE_STRING
    )
    """
    Версия аппаратного обеспенения.
     # Диапазон: 3..64
    """

    software_version: "str | None" = betterproto.message_field(
        12, wraps=betterproto.TYPE_STRING
    )
    """
    Версия программного обеспенения.
     # Диапазон: 3..64
    """

    is_autochange_password_enabled: "bool | None" = betterproto.message_field(
        13, wraps=betterproto.TYPE_BOOL
    )
    """Автозамена пароля"""

    abc_number: "list[str]" = betterproto.string_field(14)
    """ABC-номер"""

    camera_ids: "list[str]" = betterproto.string_field(15)
    """Идентификаторы камер"""

    sync_status_status_types: "list[SyncStatusStatusType]" = betterproto.enum_field(16)
    """Фильтр по статусу синхронизации (SyncStatus.status_type)"""

    sync_retry_count_less_then: "int | None" = betterproto.message_field(
        17, wraps=betterproto.TYPE_INT32
    )
    """
    Пороговое значение количества попыток синхронизации.
     Возвращает записи, у которых sync_retry_count меньше этого значения
    """

    begin_sync_successful_at: datetime = betterproto.message_field(18)
    """От даты успешной синхронизации включительно (>=)"""

    end_sync_successful_at: datetime = betterproto.message_field(19)
    """До даты успешной синхронизации (<)"""

    begin_sync_at: datetime = betterproto.message_field(20)
    """От даты синхронизации включительно (>=)"""

    end_sync_at: datetime = betterproto.message_field(21)
    """До даты синхронизации (<)"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DevicePaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "DevicePagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию.
     # По умолчанию: ID
    """

    direction_type: "DevicePagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..100.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceConfigurationStatusGroupedFilter(betterproto.Message):
    """Фильтр конфигураций сгруппированных по устройству"""

    device_ids: "list[int]" = betterproto.int32_field(1)
    """По идентификаторам устройства"""

    configuration_types: "list[DeviceConfigurationStatusConfigurationType]" = (
        betterproto.enum_field(2)
    )
    """По типам конфигурации"""

    status_types: "list[DeviceConfigurationStatusStatusType]" = betterproto.enum_field(
        3
    )
    """По статусам конфигурации настройки"""

    is_ready_for_retry: "bool | None" = betterproto.message_field(
        4, wraps=betterproto.TYPE_BOOL
    )
    """
    Флаг, указывающий на готовность настройки к конфигурированию.
     Значение next_retry_at меньше текущей даты
    """

    retry_count_less_then: "int | None" = betterproto.message_field(
        5, wraps=betterproto.TYPE_INT32
    )
    """
    Пороговое значение количества попыток.
     Возвращает записи, у которых retry_count меньше этого значения
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceConfigurationStatusGroupedPaging(betterproto.Message):
    """Постраничный вывод конфигураций сгруппированных по устройству"""

    order_by_type: "DeviceConfigurationStatusGroupedPagingOrderByType" = (
        betterproto.enum_field(1)
    )
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию.
     # По умолчанию: DEVICE_ID
    """

    direction_type: "DeviceConfigurationStatusGroupedPagingDirectionType" = (
        betterproto.enum_field(2)
    )
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..1000.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ValidationError(betterproto.Message):
    """
    Ошибки валидации.
     Эти проверки выполняются до обращения в базу данных
    """

    path: str = betterproto.string_field(1)
    """Путь к полю в формате наименования прото"""

    message: str = betterproto.string_field(2)
    """Валидационное сообщение"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Preset(betterproto.Message):
    """
    Пресет.
     Пресет с id=1 устанавливается при создании устройства по умолчанию
    """

    id: int = betterproto.int32_field(1)
    """
    Идентификатор.
     # Диапазон: 1..2147483647
    """

    title: str = betterproto.string_field(2)
    """
    Наименование.
     # Диапазон: 3..256
    """

    mrf_ids: "list[int]" = betterproto.int32_field(3)
    """
    Идентификатор МРФ.
     # Диапазон: 0..10
    """

    rf_ids: "list[int]" = betterproto.int32_field(4)
    """
    Идентификатор РФ.
     # Диапазон: 0..100
    """

    description: "str | None" = betterproto.message_field(
        5, wraps=betterproto.TYPE_STRING
    )
    """
    Описание.
     # Диапазон: 3..1024
    """

    created_at: datetime = betterproto.message_field(6)
    """
    Дата и время создания.
     # Тип: DateTime
    """

    changed_at: datetime = betterproto.message_field(7)
    """
    Дата последнего изменения.
     Заполняется и обновляется сервером.
     Заполняется при создании и изменении.
     Является версией объекта.
     # Тип: DateTime
    """

    status_type: "PresetStatusType" = betterproto.enum_field(8)
    """Статус"""

    sip: "PresetSip" = betterproto.message_field(9)
    """Параметр SIP"""

    ntp: "PresetNtp" = betterproto.message_field(10)
    """Параметр NTP"""

    syslog: "PresetSyslog" = betterproto.message_field(11)
    """Параметр Syslog"""

    rooms: "list[PresetRoom]" = betterproto.message_field(12)
    """
    Помещения.
     # Диапазон: 0..10000
    """

    video_config: "PresetVideoConfig" = betterproto.message_field(13)
    """Параметры конфигурации видео"""

    dtmf: "list[PresetDtmf]" = betterproto.message_field(14)
    """
    Параметр DTMF.
     # Диапазон: 0..64
    """

    face_recognition: "PresetFaceRecognition" = betterproto.message_field(15)
    """Распознование лиц"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetSip(betterproto.Message):
    """Параметр SIP"""

    host: str = betterproto.string_field(1)
    """
    Хост.
     # Диапазон: 5..256
    """

    port: int = betterproto.int32_field(2)
    """
    Порт.
     # Диапазон: 1..65536
    """

    reg_host: str = betterproto.string_field(3)
    """
    Хост reg.
     # Диапазон: 5..256
    """

    reg_port: int = betterproto.int32_field(4)
    """
    Порт reg.
     # Диапазон: 1..65536
    """

    proxy_host: str = betterproto.string_field(5)
    """
    Хост proxy.
     # Диапазон: 5..256
    """

    proxy_port: int = betterproto.int32_field(6)
    """
    Порт proxy.
     # Диапазон: 1..65536
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetNtp(betterproto.Message):
    """Параметр NTP"""

    host: str = betterproto.string_field(1)
    """
    Хост.
     # Диапазон: 5..256
    """

    port: int = betterproto.int32_field(2)
    """
    Порт.
     # Диапазон: 1..65536
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetSyslog(betterproto.Message):
    """Параметр Syslog"""

    host: str = betterproto.string_field(1)
    """
    Хост.
     # Диапазон: 5..256
    """

    port: int = betterproto.int32_field(2)
    """
    Порт.
     # Диапазон: 1..65536
    """

    protocol_type: "PresetSyslogProtocolType" = betterproto.enum_field(3)
    """Протокол"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetRoom(betterproto.Message):
    """Помещение"""

    phone: str = betterproto.string_field(1)
    """
    Номер телефона.
     # Диапазон: 5..14
    """

    num: int = betterproto.int32_field(2)
    """
    Номер помещения.
     # Диапазон: 1..10000
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetVideoConfig(betterproto.Message):
    """Параметры конфигурации видео"""

    quality_type: "PresetVideoConfigQualityType" = betterproto.enum_field(1)
    """Тип пресета"""

    rtsp_user: "PresetVideoConfigRtspUser" = betterproto.message_field(2)
    """Пользователь"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetVideoConfigRtspUser(betterproto.Message):
    """Пользователь"""

    username: str = betterproto.string_field(1)
    """
    Имя пользователя.
     # Диапазон: 3..256
    """

    password: str = betterproto.string_field(2)
    """
    Пароль.
     # Диапазон: 3..256
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetDtmf(betterproto.Message):
    """Параметр DTMF"""

    code: str = betterproto.string_field(1)
    """
    Код.
     # Диапазон: 1..1
    """

    relay_index: int = betterproto.int32_field(2)
    """
    Индекс реле.
     # Диапазон: 0..64
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetFaceRecognition(betterproto.Message):
    """Распознование лиц"""

    host: str = betterproto.string_field(1)
    """Адрес"""

    alt_host: str = betterproto.string_field(2)
    """Альтернативный адрес"""

    endpoint: str = betterproto.string_field(3)
    """Путь запроса к серверу"""

    auth_token: str = betterproto.string_field(4)
    """Токен"""

    configuration_type: "PresetFaceRecognitionConfigurationType" = (
        betterproto.enum_field(5)
    )
    """Тип конфигурации"""

    origin_id: str = betterproto.string_field(6)
    """Идентификатор источника в identix"""

    group_ids: "list[int]" = betterproto.int32_field(7)
    """Идентификаторы групп профилей в identix"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetSavingError(betterproto.Message):
    """
    Ошибка сохранения.
     Эти проверки выполняются при работе с базой данных и сторонними сервисами
    """

    conflict: "PresetSavingErrorConflict | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Конфликт версий"""

    not_allowed_for_default: "PresetSavingErrorNotAllowedForDefault | None" = (
        betterproto.message_field(2, optional=True, group="reason")
    )
    """Запрещено для дефолтного пресета"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий.
     Причины:
     - В базе хранится другая версия строки, значения changed_at отличаются
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetSavingErrorNotAllowedForDefault(betterproto.Message):
    """
    Недоступно для дефолтного пресета.
     Причины:
     - Смена статуса на Архивный
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class TrunkConfig(betterproto.Message):
    """
    Trunk-конфигурация.
     # Описание модели
    """

    id: str = betterproto.string_field(1)
    """
    Идентификатор.
     # Тип: Guid
    """

    city_orpon_id: int = betterproto.int64_field(2)
    """ОРПОН Города"""

    device_sip_trunk_sip_type: "DeviceSipTrunkSipType" = betterproto.enum_field(3)
    """Тип Trunk-аккаунта"""

    ip_address: str = betterproto.string_field(4)
    """
    IP-адрес.
     # Диапазон: 7..15
    """

    port: int = betterproto.int32_field(5)
    """
    Порт.
     # Диапазон: 0..65535
    """

    created_at: datetime = betterproto.message_field(6)
    """
    Дата создания.
     # Тип: DateTime
    """

    changed_at: datetime = betterproto.message_field(7)
    """
    Дата последнего изменения.
     Заполняется и обновляется сервером.
     Заполняется при создании и изменении.
     Является версией объекта.
     # Тип: DateTime
    """

    deleted_at: datetime = betterproto.message_field(8)
    """
    Дата удаления.
     # Тип: DateTime?
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class TrunkConfigSavingError(betterproto.Message):
    """
    Ошибка сохранения.
     Эти проверки выполняются при работе с базой данных и сторонними сервисами
    """

    conflict: "TrunkConfigSavingErrorConflict | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Конфликт версий"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class TrunkConfigSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий.
     Причины:
     - В базе хранится другая версия строки, значения changed_at оличаются
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class TrunkConfigFilter(betterproto.Message):
    """Фильтр для Trunk-конфигураций"""

    city_orpon_ids: "list[int]" = betterproto.int64_field(1)
    """Фильтр по ОРПОН идентификаторам города"""

    ip_addresses: "list[str]" = betterproto.string_field(2)
    """Фильтр по IP-адресам"""

    show_deleted: "bool | None" = betterproto.message_field(
        3, wraps=betterproto.TYPE_BOOL
    )
    """Показывать удаленные"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class TrunkConfigPaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "TrunkConfigPagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию.
     # По умолчанию: CHANGED_AT
    """

    direction_type: "TrunkConfigPagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..100.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostTrunkConfigRequest(betterproto.Message):
    """Запрос сохранения Trunk-конфигурации по идентификатору"""

    data: "TrunkConfig" = betterproto.message_field(1)
    """Trunk-конфигурации"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostTrunkConfigResponse(betterproto.Message):
    """Ответ на запрос сохранения Trunk-конфигурации по идентификатору"""

    data: "TrunkConfig | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Профиль шифрования"""

    error: "PostTrunkConfigResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostTrunkConfigResponseError(betterproto.Message):
    """Ошибка запроса сохранения Trunk-конфигурации"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    saving: "TrunkConfigSavingError | None" = betterproto.message_field(
        2, optional=True, group="reason"
    )
    """Ошибка сохранения"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetTrunkConfigRequest(betterproto.Message):
    """Запрос на получение Trunk-конфигурации"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор трубки.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetTrunkConfigResponse(betterproto.Message):
    """Ответ на запрос Trunk-конфигурации"""

    data: "TrunkConfig | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Trunk-конфигурация"""

    error: "GetTrunkConfigResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetTrunkConfigResponseError(betterproto.Message):
    """Ошибка запроса получения баннера"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetTrunkConfigListRequest(betterproto.Message):
    """Запрос на получение списка Trunk-конфигураций"""

    filter: "TrunkConfigFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "TrunkConfigPaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Стандартный постраничный вывод"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetTrunkConfigListResponse(betterproto.Message):
    """Ответ на запрос списка Trunk-конфигураций"""

    data: "TrunkConfig | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Trunk-конфигурация"""

    error: "GetTrunkConfigListResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetTrunkConfigListResponseError(betterproto.Message):
    """Ошибка запроса получения списка Trunk-конфигураций"""

    validation_error: "ValidationError" = betterproto.message_field(1)
    """Ошибка валидации"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetTrunkConfigCountRequest(betterproto.Message):
    """Запрос на получение количества Trunk-конфигураций"""

    filter: "TrunkConfigFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetTrunkConfigCountResponse(betterproto.Message):
    """Ответ на запрос количества Trunk-конфигураций"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего Trunk-конфигураций"""

    error: "GetTrunkConfigCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetTrunkConfigCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества Trunk-конфигураций"""

    validation_error: "ValidationError" = betterproto.message_field(1)
    """Ошибка валидации"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteTrunkConfigRequest(betterproto.Message):
    """Запрос удаления Trunk-конфигурации"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteTrunkConfigResponse(betterproto.Message):
    """Ответ на запрос удаления Trunk-конфигурации"""

    error: "DeleteTrunkConfigResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteTrunkConfigResponseError(betterproto.Message):
    """Ошибка запроса восстановления Trunk-конфигурации"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostTrunkConfigRestoreRequest(betterproto.Message):
    """Запрос разархивации Trunk-конфигурации по идентификатору"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор.
     # Тип: Guid
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostTrunkConfigRestoreResponse(betterproto.Message):
    """Отвест на запрос разархивации Trunk-конфигурации по идентификатору"""

    error: "PostTrunkConfigRestoreResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostTrunkConfigRestoreResponseError(betterproto.Message):
    """Ошибка запроса разархивации Trunk-конфигурации"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CmsPhone(betterproto.Message):
    """
    Аналоговая трубка.
     # Описание модели
    """

    id: int = betterproto.int32_field(1)
    """
    Идентификатор.
     # Диапазон: 0..2147483647
    """

    orpon_id: int = betterproto.int64_field(2)
    """
    ОРПОН Дома.
     # Диапазон: 0..2147483647
    """

    room: str = betterproto.string_field(3)
    """
    Номер квартиры.
     # Диапазон: 1..5
    """

    device_id: int = betterproto.int32_field(4)
    """
    Идентификатор устройства.
     # Диапазон: 0..2147483647
    """

    status_type: "CmsPhoneStatusType" = betterproto.enum_field(5)
    """Статус аналоговой трубки"""

    created_at: datetime = betterproto.message_field(6)
    """
    Дата создания.
     # Тип: DateTime
    """

    changed_at: datetime = betterproto.message_field(7)
    """
    Дата последнего изменения.
     Заполняется и обновляется сервером.
     Заполняется при создании и изменении.
     Является версией объекта.
     # Тип: DateTime
    """

    retry_count: int = betterproto.int32_field(8)
    """
    Счетчик попыток обновления.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CmsPhoneSavingError(betterproto.Message):
    """
    Ошибка сохранения.
     Эти проверки выполняются при работе с базой данных и сторонними сервисами
    """

    conflict: "CmsPhoneSavingErrorConflict | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Конфликт версий"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CmsPhoneSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий.
     Причины:
     - В базе хранится другая версия строки, значения changed_at оличаются
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CmsPhoneFilter(betterproto.Message):
    """Фильтр по аналоговой трубким"""

    device_ids: "list[int]" = betterproto.int32_field(1)
    """По идентификаторам устройства"""

    status_types: "list[CmsPhoneStatusType]" = betterproto.enum_field(2)
    """По статусам аналоговой трубки"""

    orpon_ids: "list[int]" = betterproto.int64_field(3)
    """По идентификаторам ОРПОН (дома)"""

    rooms: "list[str]" = betterproto.string_field(4)
    """По номерам квартиры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CmsPhonePaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "CmsPhonePagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию.
     # По умолчанию: CHANGED_AT
    """

    direction_type: "CmsPhonePagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..100.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCmsPhoneListRequest(betterproto.Message):
    """Запрос на получение списка аналоговых трубок"""

    filter: "CmsPhoneFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "CmsPhonePaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Стандартный постраничный вывод"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCmsPhoneListResponse(betterproto.Message):
    """Ответ на получение списка аналоговых трубок"""

    data: "CmsPhone | None" = betterproto.message_field(1, optional=True, group="type")
    """Пресет"""

    error: "GetCmsPhoneListResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCmsPhoneListResponseError(betterproto.Message):
    """Ошибка запроса получения списка аналоговых трубок"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCmsPhoneRequest(betterproto.Message):
    """Запрос получения аналоговой трубки"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCmsPhoneResponse(betterproto.Message):
    """Ответ на запрос получения аналоговой трубки"""

    data: "CmsPhone | None" = betterproto.message_field(1, optional=True, group="type")
    """Аналоговая трубка"""

    error: "GetCmsPhoneResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCmsPhoneResponseError(betterproto.Message):
    """Ошибка запроса получения баннера"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCmsPhoneCountRequest(betterproto.Message):
    """Запрос получения количества аналоговых трубок"""

    filter: "CmsPhoneFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCmsPhoneCountResponse(betterproto.Message):
    """Ответ на запрос получения количества аналоговых трубок"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего устройтсв"""

    error: "GetCmsPhoneCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetCmsPhoneCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества аналоговых трубок"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneRequest(betterproto.Message):
    """Запрос удаления аналоговой трубки"""

    id: int = betterproto.int32_field(1)
    """Идентификатор аналоговой трубки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneResponse(betterproto.Message):
    """Ответ на запрос удаления аналоговой трубки"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneDeviceIdRequest(betterproto.Message):
    """Запрос удаления аналоговых трубок по идентификатору устройства"""

    device_id: int = betterproto.int32_field(1)
    """Идентификатор устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneDeviceIdResponse(betterproto.Message):
    """
    Ответ на запрос удаления аналоговых трубок по идентификатору устройства
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneOrponIdRequest(betterproto.Message):
    """Запрос удаления аналоговых трубок по идентификатору ОРПОН"""

    orpon_id: int = betterproto.int64_field(1)
    """Идентификатор ОРПОН"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneOrponIdResponse(betterproto.Message):
    """Ответ на запрос удаления аналоговых трубок по идентификатору ОРПОН"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneOrponIdRoomNumberRequest(betterproto.Message):
    """
    Запрос удаления аналоговых трубок по идентификатору ОРПОН и номеру квартиры
    """

    orpon_id: int = betterproto.int64_field(1)
    """Идентификатор ОРПОН"""

    room_number: str = betterproto.string_field(2)
    """Номер квартиры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneOrponIdRoomNumberResponse(betterproto.Message):
    """
    Ответ на запрос удаления аналоговых трубок по идентификатору ОРПОН и номеру квартиры
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCmsPhoneRefreshRequest(betterproto.Message):
    """Запрос на принудительное обновление статуса аналоговой трубки"""

    ids: "list[int]" = betterproto.int32_field(1)
    """Идентификатор"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostCmsPhoneRefreshResponse(betterproto.Message):
    """
    Ответ на запрос на принудительное обновление статуса аналоговой трубки
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneOrponRoomNumberDeviceIdRequest(betterproto.Message):
    """
    Запрос удаления аналоговых трубок по идентификатору ОРПОН, номеру квартиры и идентификатору устройства
    """

    orpon: int = betterproto.int64_field(1)
    """Идентификатор ОРПОН"""

    room_number: str = betterproto.string_field(2)
    """Номер квартиры"""

    device_id: int = betterproto.int32_field(3)
    """Идентификатор устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCmsPhoneOrponRoomNumberDeviceIdResponse(betterproto.Message):
    """
    Ответ на запрос удаления аналоговых трубок по идентификатору ОРПОН, номеру квартиры и идентификатору устройства
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PrepareStartTask(betterproto.Message):
    """
    Команда на подготовку и старт проигрывания файла через домофон.
     Очередь key.device.alert.prepare_start
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    sound_file_uri: str = betterproto.string_field(2)
    """
    Ссылка на звуковой файл для проигрывания.
     Файл должен лежать на внутреннем хранилище.
     # Диапазон: 2..100
    """

    device_id: int = betterproto.int32_field(3)
    """Идентификатор устройства"""

    tact_play_duration: int = betterproto.int32_field(4)
    """
    Длительность воспроизведения такта в секундах.
     Такт включает в себя проигрывание файла на трубках или на динамике.
     # Диапазон: 0..65536
    """

    tact_repeat_count: int = betterproto.int32_field(5)
    """
    Количество последовательных повторов тактов перед сменой динамика на трубки или наоборот.
     # Диапазон: 0..65536
    """

    play_repeat_count: int = betterproto.int32_field(6)
    """
    Количество дополнительных повторов тактов, т.е. умолчание=0 - это проигрывание одного такта.
     # Диапазон: 0..65536
    """

    play_type: "PrepareStartTaskPlayType" = betterproto.enum_field(7)
    """Тип проигрывания"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PrepareStopTask(betterproto.Message):
    """
    Команда на подготовку и прекращение проигрывания файла через домофон.
     Очередь key.device.alert.prepare_stop
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PlayStartTask(betterproto.Message):
    """
    Команда на старт проигрывания файла через домофон.
     Очередь key.device.alert.play_start
    """

    request_id: str = betterproto.string_field(1)
    """
    Идентификатор запроса.
     # Тип: Guid
    """

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    sound_file_uri: str = betterproto.string_field(3)
    """
    Ссылка на звуковой файл для проигрывания.
     Файл должен лежать на внутреннем хранилище.
     # Диапазон: 7..100
    """

    ip_address: str = betterproto.string_field(4)
    """
    Сетевой адрес.
     # Паттерн: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
    """

    port: "int | None" = betterproto.message_field(5, wraps=betterproto.TYPE_INT32)
    """
    Сетевой порт.
     # Диапазон: 0..65535
    """

    model: str = betterproto.string_field(6)
    """
    Модель устройства.
     # Диапазон: 2..100
    """

    tact_play_duration: int = betterproto.int32_field(7)
    """
    Длительность воспроизведения такта в секундах.
     Такт включает в себя проигрывание файла на трубках или на динамике.
     # Диапазон: 0..65536
    """

    tact_repeat_count: int = betterproto.int32_field(8)
    """
    Количество последовательных повторов тактов перед сменой динамика на трубки или наоборот.
     # Диапазон: 0..65536
    """

    play_repeat_count: int = betterproto.int32_field(9)
    """
    Количество повторов заданного количества тактов, где умолчание=0 - это один повтор.
     # Диапазон: 0..65536
    """

    play_type: "PlayStartTaskPlayType" = betterproto.enum_field(10)
    """Тип проигрывания"""

    login: "str | None" = betterproto.message_field(11, wraps=betterproto.TYPE_STRING)
    """
    Логин.
     # Диапазон: 0..100
    """

    password: "str | None" = betterproto.message_field(
        12, wraps=betterproto.TYPE_STRING
    )
    """
    Пароль.
     # Диапазон: 0..100
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PlayStopTask(betterproto.Message):
    """
    Команда на прекращение проигрывания файла через домофон.
     Очередь key.device.alert.play_stop
    """

    request_id: str = betterproto.string_field(1)
    """
    Идентификатор запроса.
     # Тип: Guid
    """

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    ip_address: str = betterproto.string_field(3)
    """
    Сетевой адрес.
     # Паттерн: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
    """

    port: "int | None" = betterproto.message_field(4, wraps=betterproto.TYPE_INT32)
    """
    Сетевой порт.
     # Диапазон: 0..65535
    """

    model: str = betterproto.string_field(5)
    """
    Модель устройства.
     # Диапазон: 2..100
    """

    login: "str | None" = betterproto.message_field(6, wraps=betterproto.TYPE_STRING)
    """
    Логин.
     # Диапазон: 0..100
    """

    password: "str | None" = betterproto.message_field(7, wraps=betterproto.TYPE_STRING)
    """
    Пароль.
     # Диапазон: 0..100
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SipPhone(betterproto.Message):
    """
    SIP-трубка.
     # Описание модели
    """

    id: int = betterproto.int32_field(1)
    """
    Идентификатор трубки.
     # Диапазон: 0..2147483647
    """

    room_id: int = betterproto.int32_field(2)
    """
    Идентификатор квартиры.
     # Диапазон: 0..2147483647
    """

    sip_number: str = betterproto.string_field(3)
    """
    SIP номер.
     # Диапазон: 1..200
    """

    status_type: "SipPhoneStatusType" = betterproto.enum_field(4)
    """Статус SIP-трубки"""

    created_at: datetime = betterproto.message_field(5)
    """
    Дата создания.
     # Тип: DateTime
    """

    changed_at: datetime = betterproto.message_field(6)
    """
    Дата последнего изменения.
     Заполняется и обновляется сервером.
     Заполняется при создании и изменении.
     Является версией объекта.
     # Тип: DateTime
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SipPhoneSavingError(betterproto.Message):
    """
    Ошибка сохранения.
     Эти проверки выполняются при работе с базой данных и сторонними сервисами
    """

    conflict: "SipPhoneSavingErrorConflict | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Конфликт версий"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SipPhoneSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий.
     Причины:
     - В базе хранится другая версия строки, значения changed_at оличаются
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SipPhoneFilter(betterproto.Message):
    """Фильтр для SIP-трубок"""

    sip_numbers: "list[str]" = betterproto.string_field(1)
    """Фильтр по SIP номерам"""

    room_ids: "list[int]" = betterproto.int32_field(2)
    """Фильтр по идентификаторам квартир"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SipPhonePaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "SipPhonePagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки.
     Если значение не передано, то будет взято значение по умолчанию.
     # По умолчанию: CHANGED_AT
    """

    direction_type: "SipPhonePagingDirectionType" = betterproto.enum_field(2)
    """
    Тип направления сортировки.
     # По умолчанию: DESC
    """

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу.
     Если значение 0 (не передано), то будет взято значение по умолчанию.
     # Диапазон: 0..100.
     # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """
    Сдвиг.
     # Диапазон: 0..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSipPhoneRequest(betterproto.Message):
    """Запрос на получение SIP-трубки"""

    id: int = betterproto.int32_field(1)
    """Идентификатор трубки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSipPhoneResponse(betterproto.Message):
    """Ответ на запрос SIP-трубки"""

    data: "SipPhone | None" = betterproto.message_field(1, optional=True, group="type")
    """SIP-трубка"""

    error: "GetSipPhoneResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSipPhoneResponseError(betterproto.Message):
    """Ошибка запроса получения баннера"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSipPhoneListRequest(betterproto.Message):
    """Запрос на получение списка SIP-трубок"""

    filter: "SipPhoneFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "SipPhonePaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Стандартный постраничный вывод"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSipPhoneListResponse(betterproto.Message):
    """Ответ на запрос списка SIP-трубок"""

    data: "SipPhone | None" = betterproto.message_field(1, optional=True, group="type")
    """SIP-трубка"""

    error: "GetSipPhoneListResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSipPhoneListResponseError(betterproto.Message):
    """Ошибка запроса получения списка SIP-трубок"""

    validation_error: "ValidationError" = betterproto.message_field(1)
    """Ошибка валидации"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSipPhoneCountRequest(betterproto.Message):
    """Запрос на получение количества SIP-трубок"""

    filter: "SipPhoneFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSipPhoneCountResponse(betterproto.Message):
    """Ответ на запрос количества SIP-трубок"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего трубок"""

    error: "GetSipPhoneCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSipPhoneCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества SIP-трубок"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostSipPhoneGetListRequest(betterproto.Message):
    """Запрос на получение списка SIP-трубок"""

    filter: "SipPhoneFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "SipPhonePaging | None" = betterproto.message_field(
        2, optional=True, group="pagination"
    )
    """Стандартный постраничный вывод"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostSipPhoneGetListResponse(betterproto.Message):
    """Ответ на запрос списка SIP-трубок"""

    items: "list[SipPhone]" = betterproto.message_field(1)
    """Список SIP-трубок"""

    error: "PostSipPhoneGetListResponseError" = betterproto.message_field(2)
    """Ошибка"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostSipPhoneGetListResponseError(betterproto.Message):
    """Ошибка запроса получения списка SIP-трубок"""

    validation: "ValidationError | None" = betterproto.message_field(
        1, optional=True, group="reason"
    )
    """Ошибка валидации"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostSipPhoneGetCountRequest(betterproto.Message):
    """Запрос на получение количества SIP-трубок"""

    filter: "SipPhoneFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostSipPhoneGetCountResponse(betterproto.Message):
    """Ответ на запрос количества SIP-трубок"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего трубок"""

    error: "PostSipPhoneGetCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostSipPhoneGetCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества SIP-трубок"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceAccess(betterproto.Message):
    """
    Доступ к устройству.
     # Описание модели
    """

    device_id: int = betterproto.int32_field(1)
    """
    Идентификатор.
     # Диапазон: 0..2147483647
    """

    accessor_type: "DeviceAccessAccessorType" = betterproto.enum_field(2)
    """Тип субъекта доступа"""

    accessor_id: str = betterproto.string_field(3)
    """
    Идентификатор субъекта доступа.
     # Диапазон: 1..36
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetSystemStatusResponse(betterproto.Message):
    """Ответ на запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceTask(betterproto.Message):
    """
    Задача на конфигурирование устройства.
     Очередь key.device.configure_device
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Адрес устройства"""

    username: str = betterproto.string_field(4)
    """Имя пользователя устройства"""

    password: str = betterproto.string_field(5)
    """Пароль пользователья устройства"""

    device_id: int = betterproto.int32_field(6)
    """Идентификатор устройства"""

    preset: "Preset" = betterproto.message_field(7)
    """Пресет устройства"""

    sip_account: "ConfigureDeviceTaskSipAccount" = betterproto.message_field(8)
    """Sip аккаунт"""

    sip_rooms: "list[SipRoom]" = betterproto.message_field(9)
    """
    Список сип-номеров в помещениях.
     # Диапазон: 0..10000
    """

    gate: "ConfigureDeviceTaskGate" = betterproto.message_field(10)
    """Параметры калитки"""

    rfids: "list[Rfid]" = betterproto.message_field(11)
    """Ключи"""

    codes: "list[Code]" = betterproto.message_field(12)
    """Коды"""

    ntp_timezone: str = betterproto.string_field(13)
    """Таймзона NTP"""

    sl3: "ConfigureDeviceTaskSl3" = betterproto.message_field(14)
    """Параметр Sl3"""

    emergency_call_settings: "EmergencyCallSettings" = betterproto.message_field(15)
    """Настройки вызова экстренной службы"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceTaskSipAccount(betterproto.Message):
    """Sip аккаунт"""

    name: str = betterproto.string_field(1)
    """Имя"""

    number: str = betterproto.string_field(2)
    """Номер"""

    user: str = betterproto.string_field(3)
    """Имя пользователя"""

    password: str = betterproto.string_field(4)
    """Пароль"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceTaskGate(betterproto.Message):
    """Параметры калитки"""

    is_active: bool = betterproto.bool_field(1)
    """
    Состояние параметра калитки.
     true - используется, необходимо настроить параметы.
     false - не используется, необходимо выключить параметры калитки
    """

    relay_settings: "list[ConfigureDeviceTaskGateRelaySettings]" = (
        betterproto.message_field(2)
    )
    """Параметры реле"""

    room_ranges: "list[ConfigureDeviceTaskGateRoomRange]" = betterproto.message_field(3)
    """Диапазоны квартир"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceTaskGateRelaySettings(betterproto.Message):
    """Параметры реле"""

    is_active: bool = betterproto.bool_field(1)
    """
    Состояние реле.
     true - по команде «Открыть дверь» произойдет открытие реле.
     false - по команде «Открыть дверь» не произойдет открытие реле
    """

    relay_index: int = betterproto.int32_field(2)
    """
    Индекс реле.
     # Диапазон: 0..64
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceTaskGateRoomRange(betterproto.Message):
    """Диапазон квартир"""

    address: str = betterproto.string_field(1)
    """Адрес дома"""

    prefix: str = betterproto.string_field(2)
    """Номер дома (подъезда)"""

    first_room_number: str = betterproto.string_field(3)
    """Начало диапазона включительно"""

    last_room_number: str = betterproto.string_field(4)
    """Конец диапазона включительно"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceTaskEncryptionProfile(betterproto.Message):
    """Профиль шифрования"""

    sector_number: int = betterproto.int32_field(1)
    """Номер сектора"""

    block_number: int = betterproto.int32_field(2)
    """Номер блока"""

    aes_key: str = betterproto.string_field(3)
    """aes ключ"""

    start_index: int = betterproto.int32_field(4)
    """Индекс первого символа для секрета"""

    end_index: int = betterproto.int32_field(5)
    """Индекс последнего символа для секрета"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceTaskSl3(betterproto.Message):
    """Параметр Sl3"""

    is_enabled: bool = betterproto.bool_field(1)
    """Статус настройки SL3"""

    encryption_profile: "ConfigureDeviceTaskEncryptionProfile" = (
        betterproto.message_field(2)
    )
    """Профиль шифрования"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class EmergencyCallSettings(betterproto.Message):
    """Настройки вызова экстренной службы"""

    is_call_available: bool = betterproto.bool_field(1)
    """Возможность вызова экстренной службы"""

    emergency_call_parameter: "EmergencyCallSettingsEmergencyCallParameter" = (
        betterproto.message_field(2)
    )
    """Параметры вызова экстренной службы"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class EmergencyCallSettingsEmergencyCallParameter(betterproto.Message):
    """Параметры вызова экстренной службы"""

    emergency_number: str = betterproto.string_field(1)
    """
    АБС-номер экстренной службы.
     # Паттерн: /^\+[1-9][0-9]{10}$/
    """

    abc_number: str = betterproto.string_field(2)
    """
    Исходящий ABC-номер домофона.
     # Паттерн: /^\+[1-9][0-9]{10}$/
    """

    sip_trunk_host: str = betterproto.string_field(3)
    """
    Адрес SIP-транка.
     # Диапазон: 5..250
    """

    destination_name: str = betterproto.string_field(4)
    """
    Регион вызова экстренной службы.
     # Диапазон: 3..32
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceResultTask(betterproto.Message):
    """
    Результат задачи на конфигурирование устройства.
     Очередь key.device.configure_device_result
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    configured_at: datetime = betterproto.message_field(3)
    """Дата конфигурации устройства"""

    hardware_version: str = betterproto.string_field(4)
    """Аппаратная версия"""

    firmware_version: str = betterproto.string_field(5)
    """Версия прошивки"""

    model: str = betterproto.string_field(6)
    """Модель"""

    settings: "ConfigureDeviceResultTaskSettings" = betterproto.message_field(7)
    """Результат настроек"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceResultTaskSettings(betterproto.Message):
    """Результат конфигурации устройства"""

    preset: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(1)
    """Установка пресета"""

    sip_account: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(2)
    """Настройка SIP-аккаунта"""

    sip_rooms: "ConfigureDeviceResultTaskSettingsSipRooms" = betterproto.message_field(
        3
    )
    """Настройка сип-номеров в помещениях"""

    gate: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(4)
    """Настройка калитки"""

    rfids: "ConfigureDeviceResultTaskSettingsRfids" = betterproto.message_field(5)
    """Настройка ключей"""

    codes: "ConfigureDeviceResultTaskSettingsCodes" = betterproto.message_field(6)
    """Настройка кодов"""

    sl3: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(7)
    """Настройка sl3"""

    emergency_call_settings: "ConfigureDeviceResultTaskSettingsState" = (
        betterproto.message_field(8)
    )
    """Настройки вызова экстренной службы"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceResultTaskSettingsState(betterproto.Message):
    """Состояние настройки"""

    status_type: "ConfigureDeviceResultTaskSettingsStatusType" = betterproto.enum_field(
        1
    )
    """Статус конфигурации устройства"""

    error_message: str = betterproto.string_field(2)
    """Текст ошибки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceResultTaskSettingsRfids(betterproto.Message):
    """Настройка ключей"""

    status_type: "ConfigureDeviceResultTaskSettingsStatusType" = betterproto.enum_field(
        1
    )
    """Статус конфигурации устройства"""

    error_message: str = betterproto.string_field(2)
    """Текст ошибки"""

    loaded_rfids: "list[Rfid]" = betterproto.message_field(3)
    """Загруженные ключи"""

    unloaded_rfids: "list[RfidError]" = betterproto.message_field(4)
    """Незагруженные ключи"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceResultTaskSettingsCodes(betterproto.Message):
    """Настройка кодов"""

    status_type: "ConfigureDeviceResultTaskSettingsStatusType" = betterproto.enum_field(
        1
    )
    """Статус конфигурации устройства"""

    error_message: str = betterproto.string_field(2)
    """Текст ошибки"""

    loaded_codes: "list[Code]" = betterproto.message_field(3)
    """Загруженные коды"""

    unloaded_codes: "list[CodeError]" = betterproto.message_field(4)
    """Незагруженные коды"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ConfigureDeviceResultTaskSettingsSipRooms(betterproto.Message):
    """Настройка квартир"""

    status_type: "ConfigureDeviceResultTaskSettingsStatusType" = betterproto.enum_field(
        1
    )
    """Статус конфигурации устройства"""

    error_message: str = betterproto.string_field(2)
    """Текст ошибки"""

    loaded_sip_rooms: "list[SipRoom]" = betterproto.message_field(3)
    """Загруженные квартиры"""

    unloaded_sip_rooms: "list[SipRoomError]" = betterproto.message_field(4)
    """Незагруженные квартиры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CmsServiceAvailableTask(betterproto.Message):
    """
    Задача на использование аналоговых трубок.
     Очередь key.device.cms_available
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    orpon_id: int = betterproto.int64_field(2)
    """Идентификатор ОРПОН дома"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ControlDeviceTask(betterproto.Message):
    """
    Задача на конфигурирование устройства.
     Очередь key.device.control_device
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Адрес устройства"""

    username: str = betterproto.string_field(4)
    """Имя пользователя устройства"""

    password: str = betterproto.string_field(5)
    """Пароль пользователья устройства"""

    device_id: int = betterproto.int32_field(6)
    """Идентификатор устройства"""

    face_recognition: "ControlDeviceTaskFaceRecognition" = betterproto.message_field(7)
    """Распознование лиц"""

    preset: "Preset" = betterproto.message_field(8)
    """Пресет устройства"""

    ntp_timezone: "str | None" = betterproto.message_field(
        9, wraps=betterproto.TYPE_STRING
    )
    """Таймзона NTP"""

    sip_account: "ConfigureDeviceTaskSipAccount" = betterproto.message_field(10)
    """Sip аккаунт"""

    gate: "ConfigureDeviceTaskGate" = betterproto.message_field(11)
    """Параметры калитки"""

    concierge: "ControlDeviceTaskConcierge" = betterproto.message_field(12)
    """Консьерж"""

    autocollect: "ControlDeviceTaskAutocollect" = betterproto.message_field(13)
    """Автосбор"""

    sl3: "ConfigureDeviceTaskSl3" = betterproto.message_field(14)
    """Параметр sl3"""

    emergency_call_settings: "EmergencyCallSettings" = betterproto.message_field(15)
    """Настройки вызова экстренной службы"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ControlDeviceTaskFaceRecognition(betterproto.Message):
    """Распознование лиц"""

    is_enabled: bool = betterproto.bool_field(1)
    """Статус настройки распознавания лиц"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ControlDeviceTaskConcierge(betterproto.Message):
    """Консьерж"""

    sip_number: str = betterproto.string_field(1)
    """
    Номер сип-трубки.
     # Диапазон: 5..14
    """

    room_number: int = betterproto.int32_field(2)
    """
    Номер помещения.
     # Диапазон: 1..10000
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ControlDeviceTaskAutocollect(betterproto.Message):
    """Автосбор"""

    is_enabled: bool = betterproto.bool_field(1)
    """Статус настройки автосбор"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ControlDeviceResultTask(betterproto.Message):
    """
    Результат задачи на конфигурирование устройства.
     Очередь key.device.control_device_result
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    configured_at: datetime = betterproto.message_field(3)
    """Дата конфигурации устройства"""

    hardware_version: str = betterproto.string_field(4)
    """Аппаратная версия"""

    firmware_version: str = betterproto.string_field(5)
    """Версия прошивки"""

    model: str = betterproto.string_field(6)
    """Модель"""

    settings: "ControlDeviceResultTaskSettings" = betterproto.message_field(7)
    """Результат настроек"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ControlDeviceResultTaskSettings(betterproto.Message):
    """Результат конфигурации устройства"""

    face_recognition: "ConfigureDeviceResultTaskSettingsState" = (
        betterproto.message_field(1)
    )
    """Настройка распознавания лиц"""

    preset: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(2)
    """Установка пресета"""

    sip_account: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(3)
    """Настройка SIP-аккаунта"""

    gate: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(4)
    """Настройка калитки"""

    autocollect: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(5)
    """Настройка автосбора"""

    concierge: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(6)
    """Настройка консьержа"""

    sl3: "ConfigureDeviceResultTaskSettingsState" = betterproto.message_field(7)
    """Настройка sl3"""

    emergency_call_settings: "ConfigureDeviceResultTaskSettingsState" = (
        betterproto.message_field(8)
    )
    """Настройки вызова экстренной службы"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class BlockCmsPhonesTask(betterproto.Message):
    """
    Задача на блокировку аналоговых трубок на устройствах для квартир.
     Очередь key.device.cms_phones_block
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Хост"""

    username: str = betterproto.string_field(4)
    """Имя пользователя"""

    password: str = betterproto.string_field(5)
    """Пароль"""

    cms_phones: "list[BlockCmsPhonesTaskCmsPhone]" = betterproto.message_field(6)
    """Список аналоговых трубок"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class BlockCmsPhonesTaskCmsPhone(betterproto.Message):
    """Аналоговая трубка"""

    id: int = betterproto.int32_field(1)
    """Идентификатор аналоговой трубки"""

    room_number: str = betterproto.string_field(2)
    """Номер квартиры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class BlockCmsPhoneSuccessTask(betterproto.Message):
    """
    Задача ответ на успешную блокировку аналоговой трубки на устройстве для квартиры.
     Очередь key.device.cms_phone_block_success
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    cms_phone_id: int = betterproto.int32_field(2)
    """Идентификатор аналоговой трубки"""

    blocked_at: datetime = betterproto.message_field(3)
    """Дата и время блокировки аналоговой трубки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class BlockCmsPhoneFailTask(betterproto.Message):
    """
    Задача ответ на ошибку при блокировке аналоговой трубки на устройстве для квартиры.
     Очередь key.device.cms_phone_block_fail
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    cms_phone_id: int = betterproto.int32_field(2)
    """Идентификатор аналоговой трубки"""

    error_message: str = betterproto.string_field(3)
    """Текст ошибки"""

    occured_at: datetime = betterproto.message_field(4)
    """Дата и время события"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ActivateCmsPhonesTask(betterproto.Message):
    """
    Задача разблокировку аналоговых трубок на устройстве для квартир.
     Очередь key.device.cms_phones_activate
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Хост"""

    username: str = betterproto.string_field(4)
    """Имя пользователя"""

    password: str = betterproto.string_field(5)
    """Пароль"""

    cms_phones: "list[ActivateCmsPhonesTaskCmsPhone]" = betterproto.message_field(6)
    """Список аналоговых трубок"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ActivateCmsPhonesTaskCmsPhone(betterproto.Message):
    """Аналоговая трубка"""

    id: int = betterproto.int32_field(1)
    """Идентификатор аналоговой трубки"""

    room_number: str = betterproto.string_field(2)
    """Номер квартиры"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ActivateCmsPhoneSuccessTask(betterproto.Message):
    """
    Задача ответ на успешную разблокировку аналоговой трубки на устройстве для квартиры.
     Очередь key.device.cms_phone_activate_success
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    cms_phone_id: int = betterproto.int32_field(2)
    """Идентификатор аналоговой трубки"""

    activated_at: datetime = betterproto.message_field(3)
    """Дата и время разблокировки аналоговой трубки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class ActivateCmsPhoneFailTask(betterproto.Message):
    """
    Задача ответ на ошибку при разблокировке аналоговой трубки на устройстве для квартиры.
     Очередь key.device.cms_phone_activate_fail
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    cms_phone_id: int = betterproto.int32_field(2)
    """Идентификатор аналоговой трубки"""

    error_message: str = betterproto.string_field(3)
    """Текст ошибки"""

    occured_at: datetime = betterproto.message_field(4)
    """Дата и время события"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CmsAvailableTask(betterproto.Message):
    """
    Сообщение о появлении возможности работы с аналоговыми трубками на устройстве.
     Очередь key.device.device_cms_available
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SipRoom(betterproto.Message):
    """Сип-номер в помещении"""

    sip_number: str = betterproto.string_field(1)
    """
    Номер сип-трубки.
     # Диапазон: 5..14
    """

    room_number: str = betterproto.string_field(2)
    """
    Номер помещения.
     # Диапазон: 1..10000
    """

    room_id: int = betterproto.int32_field(3)
    """
    Идентификатор квартиры.
     # Диапазон: 1..2147483647
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class SipRoomError(betterproto.Message):
    """Ошибка сип-номера в помещении"""

    sip_number: str = betterproto.string_field(1)
    """
    Номер сип-трубки.
     # Диапазон: 5..14
    """

    room_number: str = betterproto.string_field(2)
    """
    Номер помещения.
     # Диапазон: 1..10000
    """

    room_id: int = betterproto.int32_field(3)
    """
    Идентификатор квартиры.
     # Диапазон: 1..2147483647
    """

    message: str = betterproto.string_field(4)
    """Сообщение об ошибке"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Rfid(betterproto.Message):
    """Ключ"""

    id: int = betterproto.int32_field(1)
    """Идентификатор ключа"""

    key: str = betterproto.string_field(2)
    """Значение ключа"""

    room_number: str = betterproto.string_field(3)
    """Номер помещения к которому прявязан ключ"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Code(betterproto.Message):
    """Код"""

    id: int = betterproto.int32_field(1)
    """Идентификатор кода"""

    code: str = betterproto.string_field(2)
    """Значение кода"""

    room_number: str = betterproto.string_field(3)
    """Номер помещения к которому прявязан код"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class RfidError(betterproto.Message):
    """Ошибка ключа"""

    id: int = betterproto.int32_field(1)
    """Идентификатор ключа"""

    key: str = betterproto.string_field(2)
    """Значение ключа"""

    room_number: str = betterproto.string_field(3)
    """Номер помещения к которому прявязан ключ"""

    message: str = betterproto.string_field(4)
    """Сообщение об ошибке"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CodeError(betterproto.Message):
    """Ошибка кода"""

    id: int = betterproto.int32_field(1)
    """Идентификатор кода"""

    code: str = betterproto.string_field(2)
    """Значение кода"""

    room_number: str = betterproto.string_field(3)
    """Номер помещения к которому прявязан код"""

    message: str = betterproto.string_field(4)
    """Сообщение об ошибке"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class AddSl3RfidsTask(betterproto.Message):
    """
    Задача на добавление Sl3 ключей на устройство.
     Очередь key.device.add_sl3_rfids
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Хост"""

    username: str = betterproto.string_field(4)
    """Имя пользователя"""

    password: str = betterproto.string_field(5)
    """Пароль"""

    device_id: int = betterproto.int32_field(6)
    """Идентификатор устройства"""

    sl3_rfids: "list[AddSl3RfidsTaskSl3Rfid]" = betterproto.message_field(7)
    """Ключи"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class AddSl3RfidsTaskSl3Rfid(betterproto.Message):
    """Ключ sl3"""

    id: int = betterproto.int32_field(1)
    """Идентификатор ключа"""

    room_number: str = betterproto.string_field(2)
    """Номер помещения к которому прявязан ключ"""

    key: str = betterproto.string_field(3)
    """Значение ключа"""

    key_secret: str = betterproto.string_field(4)
    """Секрет"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class AddRfidsTask(betterproto.Message):
    """
    Задача на добавление ключей на устройство.
     Очередь key.device.add_rfids
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Хост"""

    username: str = betterproto.string_field(4)
    """Имя пользователя"""

    password: str = betterproto.string_field(5)
    """Пароль"""

    device_id: int = betterproto.int32_field(6)
    """Идентификатор устройства"""

    rfids: "list[Rfid]" = betterproto.message_field(7)
    """Ключи"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class AddCodesTask(betterproto.Message):
    """
    Задача на добавление кодов на устройство.
     Очередь key.device.add_codes
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Хост"""

    username: str = betterproto.string_field(4)
    """Имя пользователя"""

    password: str = betterproto.string_field(5)
    """Пароль"""

    device_id: int = betterproto.int32_field(6)
    """Идентификатор устройства"""

    codes: "list[Code]" = betterproto.message_field(7)
    """Ключи"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class AddRfidsSuccessTask(betterproto.Message):
    """
    Задача ответ на успешное на добавление ключей на устройство.
     Очередь key.device.add_rfids_success
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    rfids: "list[Rfid]" = betterproto.message_field(3)
    """Ключи"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class AddRfidsFailTask(betterproto.Message):
    """
    Задача ответ на неуспешное на добавление ключей на устройство.
     Очередь key.device.add_rfids_fail
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    rfid_errors: "list[RfidError]" = betterproto.message_field(3)
    """Ошибки ключей"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class AddCodesSuccessTask(betterproto.Message):
    """
    Задача ответ на успешное на добавление кодов на устройство.
     Очередь key.device.add_codes_success
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    codes: "list[Code]" = betterproto.message_field(3)
    """коды"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class AddCodesFailTask(betterproto.Message):
    """
    Задача ответ на неуспешное на добавление кодов на устройство.
     Очередь key.device.add_codes_fail
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    code_errors: "list[CodeError]" = betterproto.message_field(3)
    """Ошибки кодов"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteSl3RfidsTask(betterproto.Message):
    """
    Задача на удаление Sl3 ключей с устройства.
     Очередь key.device.delete_sl3_rfids
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Хост"""

    username: str = betterproto.string_field(4)
    """Имя пользователя"""

    password: str = betterproto.string_field(5)
    """Пароль"""

    device_id: int = betterproto.int32_field(6)
    """Идентификатор устройства"""

    sl3_rfids: "list[DeleteSl3RfidsTaskSl3Rfid]" = betterproto.message_field(7)
    """Ключи"""

    is_answer_unnecessary: "bool | None" = betterproto.message_field(
        8, wraps=betterproto.TYPE_BOOL
    )
    """
    При передаче этого флага в true, ответное сообщение не будет получено
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteSl3RfidsTaskSl3Rfid(betterproto.Message):
    """Ключ sl3"""

    id: int = betterproto.int32_field(1)
    """Идентификатор ключа"""

    room_number: str = betterproto.string_field(2)
    """Номер помещения к которому прявязан ключ"""

    key: str = betterproto.string_field(3)
    """Значение ключа"""

    key_secret: str = betterproto.string_field(4)
    """Секрет"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteRfidsTask(betterproto.Message):
    """
    Задача на удаление ключей с устройства.
     Очередь key.device.delete_rfids
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Хост"""

    username: str = betterproto.string_field(4)
    """Имя пользователя"""

    password: str = betterproto.string_field(5)
    """Пароль"""

    device_id: int = betterproto.int32_field(6)
    """Идентификатор устройства"""

    rfids: "list[Rfid]" = betterproto.message_field(7)
    """Ключи"""

    is_answer_unnecessary: "bool | None" = betterproto.message_field(
        8, wraps=betterproto.TYPE_BOOL
    )
    """
    При передаче этого флага в true, ответное сообщение не будет получено
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCodesTask(betterproto.Message):
    """
    Задача на удаление кодов с устройства.
     Очередь key.device.delete_codes
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Хост"""

    username: str = betterproto.string_field(4)
    """Имя пользователя"""

    password: str = betterproto.string_field(5)
    """Пароль"""

    device_id: int = betterproto.int32_field(6)
    """Идентификатор устройства"""

    codes: "list[Code]" = betterproto.message_field(7)
    """Ключи"""

    is_answer_unnecessary: "bool | None" = betterproto.message_field(
        8, wraps=betterproto.TYPE_BOOL
    )
    """
    При передаче этого флага в true, ответное сообщение не будет получено
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteRfidsSuccessTask(betterproto.Message):
    """
    Задача ответ на успешное удаление ключей с устройства.
     Очередь key.device.delete_rfids_success
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    rfids: "list[Rfid]" = betterproto.message_field(3)
    """Ключи"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteRfidsFailTask(betterproto.Message):
    """
    Задача ответ на неуспешное удаление ключей с устройства.
     Очередь key.device.delete_rfids_fail
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    rfid_errors: "list[RfidError]" = betterproto.message_field(3)
    """Ошибки ключей"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCodesSuccessTask(betterproto.Message):
    """
    Задача ответ на успешное удаление кодов с устройства.
     Очередь key.device.delete_codes_success
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    codes: "list[Code]" = betterproto.message_field(3)
    """коды"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteCodesFailTask(betterproto.Message):
    """
    Задача ответ на неуспешное удаление кодов с устройства.
     Очередь key.device.delete_codes_fail
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    code_errors: "list[CodeError]" = betterproto.message_field(3)
    """Ошибки кодов"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class OpenAccessPointTask(betterproto.Message):
    """
    Задача на открытие точки доступа.
     Очередь key.device.open_access_point
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    relay_index: "int | None" = betterproto.message_field(
        3, wraps=betterproto.TYPE_INT32
    )
    """Номер реле"""

    delay: "int | None" = betterproto.message_field(4, wraps=betterproto.TYPE_INT32)
    """Задержка в секундах"""

    car_number: "str | None" = betterproto.message_field(
        5, wraps=betterproto.TYPE_STRING
    )
    """ГРЗ авто"""

    vehicle: "str | None" = betterproto.message_field(6, wraps=betterproto.TYPE_STRING)
    """Тип ТС"""

    courier_company_name: "str | None" = betterproto.message_field(
        7, wraps=betterproto.TYPE_STRING
    )
    """Наименование курьерской компании"""

    order_number: "str | None" = betterproto.message_field(
        8, wraps=betterproto.TYPE_STRING
    )
    """Номер заказа"""

    courier_id: "str | None" = betterproto.message_field(
        9, wraps=betterproto.TYPE_STRING
    )
    """Идентификатор курьера"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class OpenTask(betterproto.Message):
    """
    Задача на открытие устройства.
     Очередь key.device.open
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    model: str = betterproto.string_field(2)
    """Модель"""

    host: str = betterproto.string_field(3)
    """Хост"""

    username: str = betterproto.string_field(4)
    """Имя пользователя"""

    password: str = betterproto.string_field(5)
    """Пароль"""

    device_id: int = betterproto.int32_field(6)
    """Идентификатор устройства"""

    relay_index: "int | None" = betterproto.message_field(
        7, wraps=betterproto.TYPE_INT32
    )
    """Номер реле"""

    delay: "int | None" = betterproto.message_field(8, wraps=betterproto.TYPE_INT32)
    """
    Задержка в секундах.
     Если не передано, то полставляется значение по умолчанию (5)
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteSipAccountTask(betterproto.Message):
    """
    Задача на удаление sip-аккаунта.
     Очередь key.device.delete_sip_account
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    deleted_at: datetime = betterproto.message_field(3)
    """Дата и время удаления устройства"""

    sip_login: str = betterproto.string_field(4)
    """Sip-login устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class CreateDeviceAccessTask(betterproto.Message):
    """
    Задача на создание доступа к устройству.
     Очередь key.device.create_device_access
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_ids: "list[int]" = betterproto.int32_field(2)
    """
    Идентификаторы устройства.
     # Диапазон: 0..2147483647
    """

    device_access_accessor_type: "DeviceAccessAccessorType" = betterproto.enum_field(3)
    """Тип субъекта доступа"""

    accessor_id: str = betterproto.string_field(4)
    """
    Идентификатор субъекта доступа.
     # Диапазон: 1..36
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeleteDeviceAccessTask(betterproto.Message):
    """
    Задача на удаление доступа к устройству.
     Очередь key.device.delete_device_access
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    device_ids: "list[int]" = betterproto.int32_field(2)
    """
    Идентификаторы устройства.
     # Диапазон: 0..2147483647
    """

    device_access_accessor_type: "DeviceAccessAccessorType" = betterproto.enum_field(3)
    """Тип субъекта доступа"""

    accessor_id: str = betterproto.string_field(4)
    """
    Идентификатор субъекта доступа.
     # Диапазон: 1..36
    """


class DeviceServiceStub(betterproto.ServiceStub):
    async def get_device(
        self,
        get_device_request: "GetDeviceRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetDeviceResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/GetDevice",
            get_device_request,
            GetDeviceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_device_list(
        self,
        get_device_list_request: "GetDeviceListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetDeviceListResponse]":
        async for response in self._unary_stream(
            "/keyapis.device.v1.DeviceService/GetDeviceList",
            get_device_list_request,
            GetDeviceListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_device_count(
        self,
        get_device_count_request: "GetDeviceCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetDeviceCountResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/GetDeviceCount",
            get_device_count_request,
            GetDeviceCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_device(
        self,
        post_device_request: "PostDeviceRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostDeviceResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/PostDevice",
            post_device_request,
            PostDeviceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def put_device(
        self,
        put_device_request: "PutDeviceRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PutDeviceResponse":
        warnings.warn("DeviceService.put_device is deprecated", DeprecationWarning)

        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/PutDevice",
            put_device_request,
            PutDeviceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_device_install_preset(
        self,
        post_device_install_preset_request: "PostDeviceInstallPresetRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostDeviceInstallPresetResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/PostDeviceInstallPreset",
            post_device_install_preset_request,
            PostDeviceInstallPresetResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_device_replace(
        self,
        post_device_replace_request: "PostDeviceReplaceRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostDeviceReplaceResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/PostDeviceReplace",
            post_device_replace_request,
            PostDeviceReplaceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_device_reconfigure(
        self,
        post_device_reconfigure_request: "PostDeviceReconfigureRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostDeviceReconfigureResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/PostDeviceReconfigure",
            post_device_reconfigure_request,
            PostDeviceReconfigureResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_device_configuration_statuses(
        self,
        get_device_configuration_statuses_request: "GetDeviceConfigurationStatusesRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetDeviceConfigurationStatusesResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/GetDeviceConfigurationStatuses",
            get_device_configuration_statuses_request,
            GetDeviceConfigurationStatusesResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_device_configuration_status(
        self,
        post_device_configuration_status_request: "PostDeviceConfigurationStatusRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostDeviceConfigurationStatusResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/PostDeviceConfigurationStatus",
            post_device_configuration_status_request,
            PostDeviceConfigurationStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_device_configuration_status_grouped_list(
        self,
        get_device_configuration_status_grouped_list_request: "GetDeviceConfigurationStatusGroupedListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetDeviceConfigurationStatusGroupedListResponse]":
        async for response in self._unary_stream(
            "/keyapis.device.v1.DeviceService/GetDeviceConfigurationStatusGroupedList",
            get_device_configuration_status_grouped_list_request,
            GetDeviceConfigurationStatusGroupedListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_device_configuration_status_grouped_count(
        self,
        get_device_configuration_status_grouped_count_request: "GetDeviceConfigurationStatusGroupedCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetDeviceConfigurationStatusGroupedCountResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/GetDeviceConfigurationStatusGroupedCount",
            get_device_configuration_status_grouped_count_request,
            GetDeviceConfigurationStatusGroupedCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_device(
        self,
        delete_device_request: "DeleteDeviceRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteDeviceResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/DeleteDevice",
            delete_device_request,
            DeleteDeviceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_device_lite(
        self,
        get_device_lite_request: "GetDeviceLiteRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetDeviceLiteResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.DeviceService/GetDeviceLite",
            get_device_lite_request,
            GetDeviceLiteResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class TrunkConfigServiceStub(betterproto.ServiceStub):
    async def get_trunk_config(
        self,
        get_trunk_config_request: "GetTrunkConfigRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetTrunkConfigResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.TrunkConfigService/GetTrunkConfig",
            get_trunk_config_request,
            GetTrunkConfigResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_trunk_config_list(
        self,
        get_trunk_config_list_request: "GetTrunkConfigListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetTrunkConfigListResponse]":
        async for response in self._unary_stream(
            "/keyapis.device.v1.TrunkConfigService/GetTrunkConfigList",
            get_trunk_config_list_request,
            GetTrunkConfigListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_trunk_config_count(
        self,
        get_trunk_config_count_request: "GetTrunkConfigCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetTrunkConfigCountResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.TrunkConfigService/GetTrunkConfigCount",
            get_trunk_config_count_request,
            GetTrunkConfigCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_trunk_config(
        self,
        post_trunk_config_request: "PostTrunkConfigRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostTrunkConfigResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.TrunkConfigService/PostTrunkConfig",
            post_trunk_config_request,
            PostTrunkConfigResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_trunk_config(
        self,
        delete_trunk_config_request: "DeleteTrunkConfigRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteTrunkConfigResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.TrunkConfigService/DeleteTrunkConfig",
            delete_trunk_config_request,
            DeleteTrunkConfigResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_trunk_config_restore(
        self,
        post_trunk_config_restore_request: "PostTrunkConfigRestoreRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostTrunkConfigRestoreResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.TrunkConfigService/PostTrunkConfigRestore",
            post_trunk_config_restore_request,
            PostTrunkConfigRestoreResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class CmsPhoneServiceStub(betterproto.ServiceStub):
    async def get_cms_phone(
        self,
        get_cms_phone_request: "GetCmsPhoneRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCmsPhoneResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.CmsPhoneService/GetCmsPhone",
            get_cms_phone_request,
            GetCmsPhoneResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_cms_phone_list(
        self,
        get_cms_phone_list_request: "GetCmsPhoneListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetCmsPhoneListResponse]":
        async for response in self._unary_stream(
            "/keyapis.device.v1.CmsPhoneService/GetCmsPhoneList",
            get_cms_phone_list_request,
            GetCmsPhoneListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_cms_phone_count(
        self,
        get_cms_phone_count_request: "GetCmsPhoneCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetCmsPhoneCountResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.CmsPhoneService/GetCmsPhoneCount",
            get_cms_phone_count_request,
            GetCmsPhoneCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_cms_phone(
        self,
        delete_cms_phone_request: "DeleteCmsPhoneRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteCmsPhoneResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhone",
            delete_cms_phone_request,
            DeleteCmsPhoneResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_cms_phone_device_id(
        self,
        delete_cms_phone_device_id_request: "DeleteCmsPhoneDeviceIdRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteCmsPhoneDeviceIdResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhoneDeviceId",
            delete_cms_phone_device_id_request,
            DeleteCmsPhoneDeviceIdResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_cms_phone_orpon_id(
        self,
        delete_cms_phone_orpon_id_request: "DeleteCmsPhoneOrponIdRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteCmsPhoneOrponIdResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhoneOrponId",
            delete_cms_phone_orpon_id_request,
            DeleteCmsPhoneOrponIdResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_cms_phone_orpon_id_room_number(
        self,
        delete_cms_phone_orpon_id_room_number_request: "DeleteCmsPhoneOrponIdRoomNumberRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteCmsPhoneOrponIdRoomNumberResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhoneOrponIdRoomNumber",
            delete_cms_phone_orpon_id_room_number_request,
            DeleteCmsPhoneOrponIdRoomNumberResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_cms_phone_refresh(
        self,
        post_cms_phone_refresh_request: "PostCmsPhoneRefreshRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostCmsPhoneRefreshResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.CmsPhoneService/PostCmsPhoneRefresh",
            post_cms_phone_refresh_request,
            PostCmsPhoneRefreshResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_cms_phone_orpon_room_number_device_id(
        self,
        delete_cms_phone_orpon_room_number_device_id_request: "DeleteCmsPhoneOrponRoomNumberDeviceIdRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeleteCmsPhoneOrponRoomNumberDeviceIdResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhoneOrponRoomNumberDeviceId",
            delete_cms_phone_orpon_room_number_device_id_request,
            DeleteCmsPhoneOrponRoomNumberDeviceIdResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class SipPhoneServiceStub(betterproto.ServiceStub):
    async def get_sip_phone(
        self,
        get_sip_phone_request: "GetSipPhoneRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetSipPhoneResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.SipPhoneService/GetSipPhone",
            get_sip_phone_request,
            GetSipPhoneResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_sip_phone_list(
        self,
        get_sip_phone_list_request: "GetSipPhoneListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetSipPhoneListResponse]":
        async for response in self._unary_stream(
            "/keyapis.device.v1.SipPhoneService/GetSipPhoneList",
            get_sip_phone_list_request,
            GetSipPhoneListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_sip_phone_count(
        self,
        get_sip_phone_count_request: "GetSipPhoneCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetSipPhoneCountResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.SipPhoneService/GetSipPhoneCount",
            get_sip_phone_count_request,
            GetSipPhoneCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_sip_phone_get_list(
        self,
        post_sip_phone_get_list_request: "PostSipPhoneGetListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostSipPhoneGetListResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.SipPhoneService/PostSipPhoneGetList",
            post_sip_phone_get_list_request,
            PostSipPhoneGetListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_sip_phone_get_count(
        self,
        post_sip_phone_get_count_request: "PostSipPhoneGetCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostSipPhoneGetCountResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.SipPhoneService/PostSipPhoneGetCount",
            post_sip_phone_get_count_request,
            PostSipPhoneGetCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class SystemServiceStub(betterproto.ServiceStub):
    async def get_system_status(
        self,
        get_system_status_request: "GetSystemStatusRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetSystemStatusResponse":
        return await self._unary_unary(
            "/keyapis.device.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class DeviceServiceBase(ServiceBase):

    async def get_device(
        self, get_device_request: "GetDeviceRequest"
    ) -> "GetDeviceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_device_list(
        self, get_device_list_request: "GetDeviceListRequest"
    ) -> "AsyncIterator[GetDeviceListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetDeviceListResponse()

    async def get_device_count(
        self, get_device_count_request: "GetDeviceCountRequest"
    ) -> "GetDeviceCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_device(
        self, post_device_request: "PostDeviceRequest"
    ) -> "PostDeviceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def put_device(
        self, put_device_request: "PutDeviceRequest"
    ) -> "PutDeviceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_device_install_preset(
        self, post_device_install_preset_request: "PostDeviceInstallPresetRequest"
    ) -> "PostDeviceInstallPresetResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_device_replace(
        self, post_device_replace_request: "PostDeviceReplaceRequest"
    ) -> "PostDeviceReplaceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_device_reconfigure(
        self, post_device_reconfigure_request: "PostDeviceReconfigureRequest"
    ) -> "PostDeviceReconfigureResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_device_configuration_statuses(
        self,
        get_device_configuration_statuses_request: "GetDeviceConfigurationStatusesRequest",
    ) -> "GetDeviceConfigurationStatusesResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_device_configuration_status(
        self,
        post_device_configuration_status_request: "PostDeviceConfigurationStatusRequest",
    ) -> "PostDeviceConfigurationStatusResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_device_configuration_status_grouped_list(
        self,
        get_device_configuration_status_grouped_list_request: "GetDeviceConfigurationStatusGroupedListRequest",
    ) -> "AsyncIterator[GetDeviceConfigurationStatusGroupedListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetDeviceConfigurationStatusGroupedListResponse()

    async def get_device_configuration_status_grouped_count(
        self,
        get_device_configuration_status_grouped_count_request: "GetDeviceConfigurationStatusGroupedCountRequest",
    ) -> "GetDeviceConfigurationStatusGroupedCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_device(
        self, delete_device_request: "DeleteDeviceRequest"
    ) -> "DeleteDeviceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_device_lite(
        self, get_device_lite_request: "GetDeviceLiteRequest"
    ) -> "GetDeviceLiteResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_device(
        self, stream: "grpclib.server.Stream[GetDeviceRequest, GetDeviceResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_device(request)
        await stream.send_message(response)

    async def __rpc_get_device_list(
        self,
        stream: "grpclib.server.Stream[GetDeviceListRequest, GetDeviceListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_device_list,
            stream,
            request,
        )

    async def __rpc_get_device_count(
        self,
        stream: "grpclib.server.Stream[GetDeviceCountRequest, GetDeviceCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_device_count(request)
        await stream.send_message(response)

    async def __rpc_post_device(
        self, stream: "grpclib.server.Stream[PostDeviceRequest, PostDeviceResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_device(request)
        await stream.send_message(response)

    async def __rpc_put_device(
        self, stream: "grpclib.server.Stream[PutDeviceRequest, PutDeviceResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.put_device(request)
        await stream.send_message(response)

    async def __rpc_post_device_install_preset(
        self,
        stream: "grpclib.server.Stream[PostDeviceInstallPresetRequest, PostDeviceInstallPresetResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_device_install_preset(request)
        await stream.send_message(response)

    async def __rpc_post_device_replace(
        self,
        stream: "grpclib.server.Stream[PostDeviceReplaceRequest, PostDeviceReplaceResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_device_replace(request)
        await stream.send_message(response)

    async def __rpc_post_device_reconfigure(
        self,
        stream: "grpclib.server.Stream[PostDeviceReconfigureRequest, PostDeviceReconfigureResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_device_reconfigure(request)
        await stream.send_message(response)

    async def __rpc_get_device_configuration_statuses(
        self,
        stream: "grpclib.server.Stream[GetDeviceConfigurationStatusesRequest, GetDeviceConfigurationStatusesResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_device_configuration_statuses(request)
        await stream.send_message(response)

    async def __rpc_post_device_configuration_status(
        self,
        stream: "grpclib.server.Stream[PostDeviceConfigurationStatusRequest, PostDeviceConfigurationStatusResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_device_configuration_status(request)
        await stream.send_message(response)

    async def __rpc_get_device_configuration_status_grouped_list(
        self,
        stream: "grpclib.server.Stream[GetDeviceConfigurationStatusGroupedListRequest, GetDeviceConfigurationStatusGroupedListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_device_configuration_status_grouped_list,
            stream,
            request,
        )

    async def __rpc_get_device_configuration_status_grouped_count(
        self,
        stream: "grpclib.server.Stream[GetDeviceConfigurationStatusGroupedCountRequest, GetDeviceConfigurationStatusGroupedCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_device_configuration_status_grouped_count(request)
        await stream.send_message(response)

    async def __rpc_delete_device(
        self, stream: "grpclib.server.Stream[DeleteDeviceRequest, DeleteDeviceResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_device(request)
        await stream.send_message(response)

    async def __rpc_get_device_lite(
        self,
        stream: "grpclib.server.Stream[GetDeviceLiteRequest, GetDeviceLiteResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_device_lite(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.device.v1.DeviceService/GetDevice": grpclib.const.Handler(
                self.__rpc_get_device,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetDeviceRequest,
                GetDeviceResponse,
            ),
            "/keyapis.device.v1.DeviceService/GetDeviceList": grpclib.const.Handler(
                self.__rpc_get_device_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetDeviceListRequest,
                GetDeviceListResponse,
            ),
            "/keyapis.device.v1.DeviceService/GetDeviceCount": grpclib.const.Handler(
                self.__rpc_get_device_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetDeviceCountRequest,
                GetDeviceCountResponse,
            ),
            "/keyapis.device.v1.DeviceService/PostDevice": grpclib.const.Handler(
                self.__rpc_post_device,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostDeviceRequest,
                PostDeviceResponse,
            ),
            "/keyapis.device.v1.DeviceService/PutDevice": grpclib.const.Handler(
                self.__rpc_put_device,
                grpclib.const.Cardinality.UNARY_UNARY,
                PutDeviceRequest,
                PutDeviceResponse,
            ),
            "/keyapis.device.v1.DeviceService/PostDeviceInstallPreset": grpclib.const.Handler(
                self.__rpc_post_device_install_preset,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostDeviceInstallPresetRequest,
                PostDeviceInstallPresetResponse,
            ),
            "/keyapis.device.v1.DeviceService/PostDeviceReplace": grpclib.const.Handler(
                self.__rpc_post_device_replace,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostDeviceReplaceRequest,
                PostDeviceReplaceResponse,
            ),
            "/keyapis.device.v1.DeviceService/PostDeviceReconfigure": grpclib.const.Handler(
                self.__rpc_post_device_reconfigure,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostDeviceReconfigureRequest,
                PostDeviceReconfigureResponse,
            ),
            "/keyapis.device.v1.DeviceService/GetDeviceConfigurationStatuses": grpclib.const.Handler(
                self.__rpc_get_device_configuration_statuses,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetDeviceConfigurationStatusesRequest,
                GetDeviceConfigurationStatusesResponse,
            ),
            "/keyapis.device.v1.DeviceService/PostDeviceConfigurationStatus": grpclib.const.Handler(
                self.__rpc_post_device_configuration_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostDeviceConfigurationStatusRequest,
                PostDeviceConfigurationStatusResponse,
            ),
            "/keyapis.device.v1.DeviceService/GetDeviceConfigurationStatusGroupedList": grpclib.const.Handler(
                self.__rpc_get_device_configuration_status_grouped_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetDeviceConfigurationStatusGroupedListRequest,
                GetDeviceConfigurationStatusGroupedListResponse,
            ),
            "/keyapis.device.v1.DeviceService/GetDeviceConfigurationStatusGroupedCount": grpclib.const.Handler(
                self.__rpc_get_device_configuration_status_grouped_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetDeviceConfigurationStatusGroupedCountRequest,
                GetDeviceConfigurationStatusGroupedCountResponse,
            ),
            "/keyapis.device.v1.DeviceService/DeleteDevice": grpclib.const.Handler(
                self.__rpc_delete_device,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteDeviceRequest,
                DeleteDeviceResponse,
            ),
            "/keyapis.device.v1.DeviceService/GetDeviceLite": grpclib.const.Handler(
                self.__rpc_get_device_lite,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetDeviceLiteRequest,
                GetDeviceLiteResponse,
            ),
        }


class TrunkConfigServiceBase(ServiceBase):

    async def get_trunk_config(
        self, get_trunk_config_request: "GetTrunkConfigRequest"
    ) -> "GetTrunkConfigResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_trunk_config_list(
        self, get_trunk_config_list_request: "GetTrunkConfigListRequest"
    ) -> "AsyncIterator[GetTrunkConfigListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetTrunkConfigListResponse()

    async def get_trunk_config_count(
        self, get_trunk_config_count_request: "GetTrunkConfigCountRequest"
    ) -> "GetTrunkConfigCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_trunk_config(
        self, post_trunk_config_request: "PostTrunkConfigRequest"
    ) -> "PostTrunkConfigResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_trunk_config(
        self, delete_trunk_config_request: "DeleteTrunkConfigRequest"
    ) -> "DeleteTrunkConfigResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_trunk_config_restore(
        self, post_trunk_config_restore_request: "PostTrunkConfigRestoreRequest"
    ) -> "PostTrunkConfigRestoreResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_trunk_config(
        self,
        stream: "grpclib.server.Stream[GetTrunkConfigRequest, GetTrunkConfigResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_trunk_config(request)
        await stream.send_message(response)

    async def __rpc_get_trunk_config_list(
        self,
        stream: "grpclib.server.Stream[GetTrunkConfigListRequest, GetTrunkConfigListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_trunk_config_list,
            stream,
            request,
        )

    async def __rpc_get_trunk_config_count(
        self,
        stream: "grpclib.server.Stream[GetTrunkConfigCountRequest, GetTrunkConfigCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_trunk_config_count(request)
        await stream.send_message(response)

    async def __rpc_post_trunk_config(
        self,
        stream: "grpclib.server.Stream[PostTrunkConfigRequest, PostTrunkConfigResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_trunk_config(request)
        await stream.send_message(response)

    async def __rpc_delete_trunk_config(
        self,
        stream: "grpclib.server.Stream[DeleteTrunkConfigRequest, DeleteTrunkConfigResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_trunk_config(request)
        await stream.send_message(response)

    async def __rpc_post_trunk_config_restore(
        self,
        stream: "grpclib.server.Stream[PostTrunkConfigRestoreRequest, PostTrunkConfigRestoreResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_trunk_config_restore(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.device.v1.TrunkConfigService/GetTrunkConfig": grpclib.const.Handler(
                self.__rpc_get_trunk_config,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetTrunkConfigRequest,
                GetTrunkConfigResponse,
            ),
            "/keyapis.device.v1.TrunkConfigService/GetTrunkConfigList": grpclib.const.Handler(
                self.__rpc_get_trunk_config_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetTrunkConfigListRequest,
                GetTrunkConfigListResponse,
            ),
            "/keyapis.device.v1.TrunkConfigService/GetTrunkConfigCount": grpclib.const.Handler(
                self.__rpc_get_trunk_config_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetTrunkConfigCountRequest,
                GetTrunkConfigCountResponse,
            ),
            "/keyapis.device.v1.TrunkConfigService/PostTrunkConfig": grpclib.const.Handler(
                self.__rpc_post_trunk_config,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostTrunkConfigRequest,
                PostTrunkConfigResponse,
            ),
            "/keyapis.device.v1.TrunkConfigService/DeleteTrunkConfig": grpclib.const.Handler(
                self.__rpc_delete_trunk_config,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteTrunkConfigRequest,
                DeleteTrunkConfigResponse,
            ),
            "/keyapis.device.v1.TrunkConfigService/PostTrunkConfigRestore": grpclib.const.Handler(
                self.__rpc_post_trunk_config_restore,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostTrunkConfigRestoreRequest,
                PostTrunkConfigRestoreResponse,
            ),
        }


class CmsPhoneServiceBase(ServiceBase):

    async def get_cms_phone(
        self, get_cms_phone_request: "GetCmsPhoneRequest"
    ) -> "GetCmsPhoneResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_cms_phone_list(
        self, get_cms_phone_list_request: "GetCmsPhoneListRequest"
    ) -> "AsyncIterator[GetCmsPhoneListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetCmsPhoneListResponse()

    async def get_cms_phone_count(
        self, get_cms_phone_count_request: "GetCmsPhoneCountRequest"
    ) -> "GetCmsPhoneCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_cms_phone(
        self, delete_cms_phone_request: "DeleteCmsPhoneRequest"
    ) -> "DeleteCmsPhoneResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_cms_phone_device_id(
        self, delete_cms_phone_device_id_request: "DeleteCmsPhoneDeviceIdRequest"
    ) -> "DeleteCmsPhoneDeviceIdResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_cms_phone_orpon_id(
        self, delete_cms_phone_orpon_id_request: "DeleteCmsPhoneOrponIdRequest"
    ) -> "DeleteCmsPhoneOrponIdResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_cms_phone_orpon_id_room_number(
        self,
        delete_cms_phone_orpon_id_room_number_request: "DeleteCmsPhoneOrponIdRoomNumberRequest",
    ) -> "DeleteCmsPhoneOrponIdRoomNumberResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_cms_phone_refresh(
        self, post_cms_phone_refresh_request: "PostCmsPhoneRefreshRequest"
    ) -> "PostCmsPhoneRefreshResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_cms_phone_orpon_room_number_device_id(
        self,
        delete_cms_phone_orpon_room_number_device_id_request: "DeleteCmsPhoneOrponRoomNumberDeviceIdRequest",
    ) -> "DeleteCmsPhoneOrponRoomNumberDeviceIdResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_cms_phone(
        self, stream: "grpclib.server.Stream[GetCmsPhoneRequest, GetCmsPhoneResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_cms_phone(request)
        await stream.send_message(response)

    async def __rpc_get_cms_phone_list(
        self,
        stream: "grpclib.server.Stream[GetCmsPhoneListRequest, GetCmsPhoneListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_cms_phone_list,
            stream,
            request,
        )

    async def __rpc_get_cms_phone_count(
        self,
        stream: "grpclib.server.Stream[GetCmsPhoneCountRequest, GetCmsPhoneCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_cms_phone_count(request)
        await stream.send_message(response)

    async def __rpc_delete_cms_phone(
        self,
        stream: "grpclib.server.Stream[DeleteCmsPhoneRequest, DeleteCmsPhoneResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_cms_phone(request)
        await stream.send_message(response)

    async def __rpc_delete_cms_phone_device_id(
        self,
        stream: "grpclib.server.Stream[DeleteCmsPhoneDeviceIdRequest, DeleteCmsPhoneDeviceIdResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_cms_phone_device_id(request)
        await stream.send_message(response)

    async def __rpc_delete_cms_phone_orpon_id(
        self,
        stream: "grpclib.server.Stream[DeleteCmsPhoneOrponIdRequest, DeleteCmsPhoneOrponIdResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_cms_phone_orpon_id(request)
        await stream.send_message(response)

    async def __rpc_delete_cms_phone_orpon_id_room_number(
        self,
        stream: "grpclib.server.Stream[DeleteCmsPhoneOrponIdRoomNumberRequest, DeleteCmsPhoneOrponIdRoomNumberResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_cms_phone_orpon_id_room_number(request)
        await stream.send_message(response)

    async def __rpc_post_cms_phone_refresh(
        self,
        stream: "grpclib.server.Stream[PostCmsPhoneRefreshRequest, PostCmsPhoneRefreshResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_cms_phone_refresh(request)
        await stream.send_message(response)

    async def __rpc_delete_cms_phone_orpon_room_number_device_id(
        self,
        stream: "grpclib.server.Stream[DeleteCmsPhoneOrponRoomNumberDeviceIdRequest, DeleteCmsPhoneOrponRoomNumberDeviceIdResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_cms_phone_orpon_room_number_device_id(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.device.v1.CmsPhoneService/GetCmsPhone": grpclib.const.Handler(
                self.__rpc_get_cms_phone,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCmsPhoneRequest,
                GetCmsPhoneResponse,
            ),
            "/keyapis.device.v1.CmsPhoneService/GetCmsPhoneList": grpclib.const.Handler(
                self.__rpc_get_cms_phone_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetCmsPhoneListRequest,
                GetCmsPhoneListResponse,
            ),
            "/keyapis.device.v1.CmsPhoneService/GetCmsPhoneCount": grpclib.const.Handler(
                self.__rpc_get_cms_phone_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetCmsPhoneCountRequest,
                GetCmsPhoneCountResponse,
            ),
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhone": grpclib.const.Handler(
                self.__rpc_delete_cms_phone,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteCmsPhoneRequest,
                DeleteCmsPhoneResponse,
            ),
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhoneDeviceId": grpclib.const.Handler(
                self.__rpc_delete_cms_phone_device_id,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteCmsPhoneDeviceIdRequest,
                DeleteCmsPhoneDeviceIdResponse,
            ),
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhoneOrponId": grpclib.const.Handler(
                self.__rpc_delete_cms_phone_orpon_id,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteCmsPhoneOrponIdRequest,
                DeleteCmsPhoneOrponIdResponse,
            ),
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhoneOrponIdRoomNumber": grpclib.const.Handler(
                self.__rpc_delete_cms_phone_orpon_id_room_number,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteCmsPhoneOrponIdRoomNumberRequest,
                DeleteCmsPhoneOrponIdRoomNumberResponse,
            ),
            "/keyapis.device.v1.CmsPhoneService/PostCmsPhoneRefresh": grpclib.const.Handler(
                self.__rpc_post_cms_phone_refresh,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostCmsPhoneRefreshRequest,
                PostCmsPhoneRefreshResponse,
            ),
            "/keyapis.device.v1.CmsPhoneService/DeleteCmsPhoneOrponRoomNumberDeviceId": grpclib.const.Handler(
                self.__rpc_delete_cms_phone_orpon_room_number_device_id,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteCmsPhoneOrponRoomNumberDeviceIdRequest,
                DeleteCmsPhoneOrponRoomNumberDeviceIdResponse,
            ),
        }


class SipPhoneServiceBase(ServiceBase):

    async def get_sip_phone(
        self, get_sip_phone_request: "GetSipPhoneRequest"
    ) -> "GetSipPhoneResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_sip_phone_list(
        self, get_sip_phone_list_request: "GetSipPhoneListRequest"
    ) -> "AsyncIterator[GetSipPhoneListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetSipPhoneListResponse()

    async def get_sip_phone_count(
        self, get_sip_phone_count_request: "GetSipPhoneCountRequest"
    ) -> "GetSipPhoneCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_sip_phone_get_list(
        self, post_sip_phone_get_list_request: "PostSipPhoneGetListRequest"
    ) -> "PostSipPhoneGetListResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_sip_phone_get_count(
        self, post_sip_phone_get_count_request: "PostSipPhoneGetCountRequest"
    ) -> "PostSipPhoneGetCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_sip_phone(
        self, stream: "grpclib.server.Stream[GetSipPhoneRequest, GetSipPhoneResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_sip_phone(request)
        await stream.send_message(response)

    async def __rpc_get_sip_phone_list(
        self,
        stream: "grpclib.server.Stream[GetSipPhoneListRequest, GetSipPhoneListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_sip_phone_list,
            stream,
            request,
        )

    async def __rpc_get_sip_phone_count(
        self,
        stream: "grpclib.server.Stream[GetSipPhoneCountRequest, GetSipPhoneCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_sip_phone_count(request)
        await stream.send_message(response)

    async def __rpc_post_sip_phone_get_list(
        self,
        stream: "grpclib.server.Stream[PostSipPhoneGetListRequest, PostSipPhoneGetListResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_sip_phone_get_list(request)
        await stream.send_message(response)

    async def __rpc_post_sip_phone_get_count(
        self,
        stream: "grpclib.server.Stream[PostSipPhoneGetCountRequest, PostSipPhoneGetCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_sip_phone_get_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.device.v1.SipPhoneService/GetSipPhone": grpclib.const.Handler(
                self.__rpc_get_sip_phone,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSipPhoneRequest,
                GetSipPhoneResponse,
            ),
            "/keyapis.device.v1.SipPhoneService/GetSipPhoneList": grpclib.const.Handler(
                self.__rpc_get_sip_phone_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetSipPhoneListRequest,
                GetSipPhoneListResponse,
            ),
            "/keyapis.device.v1.SipPhoneService/GetSipPhoneCount": grpclib.const.Handler(
                self.__rpc_get_sip_phone_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSipPhoneCountRequest,
                GetSipPhoneCountResponse,
            ),
            "/keyapis.device.v1.SipPhoneService/PostSipPhoneGetList": grpclib.const.Handler(
                self.__rpc_post_sip_phone_get_list,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostSipPhoneGetListRequest,
                PostSipPhoneGetListResponse,
            ),
            "/keyapis.device.v1.SipPhoneService/PostSipPhoneGetCount": grpclib.const.Handler(
                self.__rpc_post_sip_phone_get_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostSipPhoneGetCountRequest,
                PostSipPhoneGetCountResponse,
            ),
        }


class SystemServiceBase(ServiceBase):

    async def get_system_status(
        self, get_system_status_request: "GetSystemStatusRequest"
    ) -> "GetSystemStatusResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_system_status(
        self,
        stream: "grpclib.server.Stream[GetSystemStatusRequest, GetSystemStatusResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_system_status(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.device.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


rebuild_dataclass(Device)  # type: ignore
rebuild_dataclass(DeviceSputnikCredentials)  # type: ignore
rebuild_dataclass(DeviceSettings)  # type: ignore
rebuild_dataclass(DeviceSettingsSl3Mode)  # type: ignore
rebuild_dataclass(DeviceDispatching)  # type: ignore
rebuild_dataclass(DeviceSipTrunk)  # type: ignore
rebuild_dataclass(DeviceCredentials)  # type: ignore
rebuild_dataclass(DeviceSavingError)  # type: ignore
rebuild_dataclass(DeviceSavingErrorCapabilityIsNotSupported)  # type: ignore
rebuild_dataclass(DeviceLite)  # type: ignore
rebuild_dataclass(DeviceConfigurationStatus)  # type: ignore
rebuild_dataclass(DeviceConfigurationStatusPayload)  # type: ignore
rebuild_dataclass(DeviceConfigurationStatusPayloadAutocollect)  # type: ignore
rebuild_dataclass(DeviceConfigurationStatusGrouped)  # type: ignore
rebuild_dataclass(CameraStatus)  # type: ignore
rebuild_dataclass(SyncStatus)  # type: ignore
rebuild_dataclass(GetDeviceResponse)  # type: ignore
rebuild_dataclass(GetDeviceLiteResponse)  # type: ignore
rebuild_dataclass(PostDeviceRequest)  # type: ignore
rebuild_dataclass(PostDeviceResponse)  # type: ignore
rebuild_dataclass(PostDeviceResponseError)  # type: ignore
rebuild_dataclass(GetDeviceListRequest)  # type: ignore
rebuild_dataclass(GetDeviceListResponse)  # type: ignore
rebuild_dataclass(GetDeviceListResponseError)  # type: ignore
rebuild_dataclass(GetDeviceCountRequest)  # type: ignore
rebuild_dataclass(GetDeviceCountResponse)  # type: ignore
rebuild_dataclass(GetDeviceCountResponseError)  # type: ignore
rebuild_dataclass(PutDeviceResponse)  # type: ignore
rebuild_dataclass(PostDeviceInstallPresetResponse)  # type: ignore
rebuild_dataclass(PostDeviceInstallPresetResponseError)  # type: ignore
rebuild_dataclass(PostDeviceReplaceResponse)  # type: ignore
rebuild_dataclass(PostDeviceReplaceResponseError)  # type: ignore
rebuild_dataclass(PostDeviceReconfigureResponse)  # type: ignore
rebuild_dataclass(PostDeviceReconfigureResponseError)  # type: ignore
rebuild_dataclass(GetDeviceConfigurationStatusesResponse)  # type: ignore
rebuild_dataclass(GetDeviceConfigurationStatusesResponseStatuses)  # type: ignore
rebuild_dataclass(GetDeviceConfigurationStatusesResponseError)  # type: ignore
rebuild_dataclass(PostDeviceConfigurationStatusRequest)  # type: ignore
rebuild_dataclass(PostDeviceConfigurationStatusResponse)  # type: ignore
rebuild_dataclass(PostDeviceConfigurationStatusResponseError)  # type: ignore
rebuild_dataclass(GetDeviceConfigurationStatusGroupedListRequest)  # type: ignore
rebuild_dataclass(GetDeviceConfigurationStatusGroupedListResponse)  # type: ignore
rebuild_dataclass(GetDeviceConfigurationStatusGroupedListResponseError)  # type: ignore
rebuild_dataclass(GetDeviceConfigurationStatusGroupedCountRequest)  # type: ignore
rebuild_dataclass(ReinstallError)  # type: ignore
rebuild_dataclass(DeviceFilter)  # type: ignore
rebuild_dataclass(DevicePaging)  # type: ignore
rebuild_dataclass(DeviceConfigurationStatusGroupedFilter)  # type: ignore
rebuild_dataclass(DeviceConfigurationStatusGroupedPaging)  # type: ignore
rebuild_dataclass(Preset)  # type: ignore
rebuild_dataclass(PresetSyslog)  # type: ignore
rebuild_dataclass(PresetVideoConfig)  # type: ignore
rebuild_dataclass(PresetFaceRecognition)  # type: ignore
rebuild_dataclass(PresetSavingError)  # type: ignore
rebuild_dataclass(TrunkConfig)  # type: ignore
rebuild_dataclass(TrunkConfigSavingError)  # type: ignore
rebuild_dataclass(TrunkConfigFilter)  # type: ignore
rebuild_dataclass(TrunkConfigPaging)  # type: ignore
rebuild_dataclass(PostTrunkConfigRequest)  # type: ignore
rebuild_dataclass(PostTrunkConfigResponse)  # type: ignore
rebuild_dataclass(PostTrunkConfigResponseError)  # type: ignore
rebuild_dataclass(GetTrunkConfigResponse)  # type: ignore
rebuild_dataclass(GetTrunkConfigResponseError)  # type: ignore
rebuild_dataclass(GetTrunkConfigListRequest)  # type: ignore
rebuild_dataclass(GetTrunkConfigListResponse)  # type: ignore
rebuild_dataclass(GetTrunkConfigListResponseError)  # type: ignore
rebuild_dataclass(GetTrunkConfigCountRequest)  # type: ignore
rebuild_dataclass(GetTrunkConfigCountResponse)  # type: ignore
rebuild_dataclass(GetTrunkConfigCountResponseError)  # type: ignore
rebuild_dataclass(DeleteTrunkConfigResponse)  # type: ignore
rebuild_dataclass(DeleteTrunkConfigResponseError)  # type: ignore
rebuild_dataclass(PostTrunkConfigRestoreResponse)  # type: ignore
rebuild_dataclass(PostTrunkConfigRestoreResponseError)  # type: ignore
rebuild_dataclass(CmsPhone)  # type: ignore
rebuild_dataclass(CmsPhoneSavingError)  # type: ignore
rebuild_dataclass(CmsPhoneFilter)  # type: ignore
rebuild_dataclass(CmsPhonePaging)  # type: ignore
rebuild_dataclass(GetCmsPhoneListRequest)  # type: ignore
rebuild_dataclass(GetCmsPhoneListResponse)  # type: ignore
rebuild_dataclass(GetCmsPhoneListResponseError)  # type: ignore
rebuild_dataclass(GetCmsPhoneResponse)  # type: ignore
rebuild_dataclass(GetCmsPhoneResponseError)  # type: ignore
rebuild_dataclass(GetCmsPhoneCountRequest)  # type: ignore
rebuild_dataclass(GetCmsPhoneCountResponse)  # type: ignore
rebuild_dataclass(GetCmsPhoneCountResponseError)  # type: ignore
rebuild_dataclass(PrepareStartTask)  # type: ignore
rebuild_dataclass(PlayStartTask)  # type: ignore
rebuild_dataclass(PlayStopTask)  # type: ignore
rebuild_dataclass(SipPhone)  # type: ignore
rebuild_dataclass(SipPhoneSavingError)  # type: ignore
rebuild_dataclass(SipPhonePaging)  # type: ignore
rebuild_dataclass(GetSipPhoneResponse)  # type: ignore
rebuild_dataclass(GetSipPhoneResponseError)  # type: ignore
rebuild_dataclass(GetSipPhoneListRequest)  # type: ignore
rebuild_dataclass(GetSipPhoneListResponse)  # type: ignore
rebuild_dataclass(GetSipPhoneListResponseError)  # type: ignore
rebuild_dataclass(GetSipPhoneCountRequest)  # type: ignore
rebuild_dataclass(GetSipPhoneCountResponse)  # type: ignore
rebuild_dataclass(PostSipPhoneGetListRequest)  # type: ignore
rebuild_dataclass(PostSipPhoneGetListResponse)  # type: ignore
rebuild_dataclass(PostSipPhoneGetListResponseError)  # type: ignore
rebuild_dataclass(PostSipPhoneGetCountRequest)  # type: ignore
rebuild_dataclass(PostSipPhoneGetCountResponse)  # type: ignore
rebuild_dataclass(DeviceAccess)  # type: ignore
rebuild_dataclass(ConfigureDeviceTask)  # type: ignore
rebuild_dataclass(ConfigureDeviceTaskGate)  # type: ignore
rebuild_dataclass(ConfigureDeviceTaskSl3)  # type: ignore
rebuild_dataclass(EmergencyCallSettings)  # type: ignore
rebuild_dataclass(ConfigureDeviceResultTask)  # type: ignore
rebuild_dataclass(ConfigureDeviceResultTaskSettings)  # type: ignore
rebuild_dataclass(ConfigureDeviceResultTaskSettingsState)  # type: ignore
rebuild_dataclass(ConfigureDeviceResultTaskSettingsRfids)  # type: ignore
rebuild_dataclass(ConfigureDeviceResultTaskSettingsCodes)  # type: ignore
rebuild_dataclass(ConfigureDeviceResultTaskSettingsSipRooms)  # type: ignore
rebuild_dataclass(ControlDeviceTask)  # type: ignore
rebuild_dataclass(ControlDeviceResultTask)  # type: ignore
rebuild_dataclass(ControlDeviceResultTaskSettings)  # type: ignore
rebuild_dataclass(BlockCmsPhonesTask)  # type: ignore
rebuild_dataclass(BlockCmsPhoneSuccessTask)  # type: ignore
rebuild_dataclass(BlockCmsPhoneFailTask)  # type: ignore
rebuild_dataclass(ActivateCmsPhonesTask)  # type: ignore
rebuild_dataclass(ActivateCmsPhoneSuccessTask)  # type: ignore
rebuild_dataclass(ActivateCmsPhoneFailTask)  # type: ignore
rebuild_dataclass(AddSl3RfidsTask)  # type: ignore
rebuild_dataclass(AddRfidsTask)  # type: ignore
rebuild_dataclass(AddCodesTask)  # type: ignore
rebuild_dataclass(AddRfidsSuccessTask)  # type: ignore
rebuild_dataclass(AddRfidsFailTask)  # type: ignore
rebuild_dataclass(AddCodesSuccessTask)  # type: ignore
rebuild_dataclass(AddCodesFailTask)  # type: ignore
rebuild_dataclass(DeleteSl3RfidsTask)  # type: ignore
rebuild_dataclass(DeleteRfidsTask)  # type: ignore
rebuild_dataclass(DeleteCodesTask)  # type: ignore
rebuild_dataclass(DeleteRfidsSuccessTask)  # type: ignore
rebuild_dataclass(DeleteRfidsFailTask)  # type: ignore
rebuild_dataclass(DeleteCodesSuccessTask)  # type: ignore
rebuild_dataclass(DeleteCodesFailTask)  # type: ignore
rebuild_dataclass(OpenAccessPointTask)  # type: ignore
rebuild_dataclass(OpenTask)  # type: ignore
rebuild_dataclass(DeleteSipAccountTask)  # type: ignore
rebuild_dataclass(CreateDeviceAccessTask)  # type: ignore
rebuild_dataclass(DeleteDeviceAccessTask)  # type: ignore
