# 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
import warnings
from dataclasses import dataclass
from datetime import datetime
from typing import (
    TYPE_CHECKING,
    AsyncIterator,
    Dict,
    List,
    Optional,
)

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase

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
    """Вызов экстренной службы"""


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

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

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

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

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


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

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

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

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

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

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

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

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


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 Эконом"""


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

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

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

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


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

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

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

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


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

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

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

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

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

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


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
    """Вызов экстренной службы"""


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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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


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

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

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


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

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

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

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


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

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

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

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


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

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

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

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


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

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

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

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


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

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

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


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

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

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


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

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

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

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


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

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


@dataclass(eq=False, repr=False)
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: Optional[str] = betterproto.message_field(
        15, wraps=betterproto.TYPE_STRING
    )
    """Сетевой адрес. # Диапазон: 0..250"""

    port: Optional[int] = 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: Optional[str] = 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: Optional[str] = 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)
class DeviceSputnikCredentials(betterproto.Message):
    """Учетные данные. Используется для устройств с типом модели SPUTNIK_IO"""

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

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


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

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

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


@dataclass(eq=False, repr=False)
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)
class DeviceSettingsCoordinateMatrixSwitch(betterproto.Message):
    """
    Настройки ККМ. Коммутатор координатно-матричный (устройство для подключения
    аналоговых трубок к домофону)
    """

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


@dataclass(eq=False, repr=False)
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)
class DeviceSettingsAutocollect(betterproto.Message):
    """Настройки автосбора"""

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


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

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


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

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

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


@dataclass(eq=False, repr=False)
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)
class DeviceDispatching(betterproto.Message):
    """Диспетчеризации"""

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

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


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

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

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

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

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


@dataclass(eq=False, repr=False)
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)
class DeviceAutochangePasswordSettings(betterproto.Message):
    """Настройки автозамены пароля"""

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

    field_is_not_supported: "DeviceSavingErrorFieldIsNotSupported" = (
        betterproto.message_field(13, 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,
            )


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

    pass


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

    pass


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

    pass


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

    pass


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

    pass


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

    pass


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

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


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

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


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

    pass


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

    pass


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

    pass


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

    pass


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

    pass


@dataclass(eq=False, repr=False)
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)
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: Optional[str] = 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)
class DeviceConfigurationStatusPayload(betterproto.Message):
    """Дополнительная полезная нагрузка"""

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


@dataclass(eq=False, repr=False)
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)
class DeviceConfigurationStatusGrouped(betterproto.Message):
    """Сгруппированный по устройству список конфигураций"""

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

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


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

    id: Optional[str] = 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)
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)
class GetDeviceRequest(betterproto.Message):
    """Запрос получения устройства"""

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


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

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


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

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


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

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


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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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


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

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


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

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

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


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

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


@dataclass(eq=False, repr=False)
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)
class PutDeviceResponse(betterproto.Message):
    """ответ на завпрос изменения устройства"""

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


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

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


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

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


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

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


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

    pass


@dataclass(eq=False, repr=False)
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)
class PostDeviceReplaceResponse(betterproto.Message):
    """Ответ на запрос на замену устройства"""

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


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

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

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

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

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

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

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

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


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

    pass


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

    pass


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

    pass


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

    pass


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

    pass


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

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


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

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


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

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

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


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

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


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

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

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


@dataclass(eq=False, repr=False)
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)
class GetDeviceConfigurationStatusesResponseError(betterproto.Message):
    """Ошибка"""

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


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

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


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

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

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


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

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


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

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

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


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

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

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


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

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


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

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


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

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


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

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


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

    pass


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

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


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

    pass


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

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

    text: Optional[str] = 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: Optional[bool] = betterproto.message_field(
        8, wraps=betterproto.TYPE_BOOL
    )
    """Переадресация на консъержа"""

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

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

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

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

    is_autochange_password_enabled: Optional[bool] = 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: Optional[int] = 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)
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)
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: Optional[bool] = betterproto.message_field(
        4, wraps=betterproto.TYPE_BOOL
    )
    """
    Флаг, указывающий на готовность настройки к конфигурированию. Значение
    next_retry_at меньше текущей даты
    """

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


@dataclass(eq=False, repr=False)
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)
class ValidationError(betterproto.Message):
    """
    Ошибки валидации. Эти проверки выполняются до обращения в базу данных
    """

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

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


@dataclass(eq=False, repr=False)
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: Optional[str] = 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)
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)
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)
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)
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)
class PresetVideoConfig(betterproto.Message):
    """Параметры конфигурации видео"""

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

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


@dataclass(eq=False, repr=False)
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)
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)
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)
class PresetSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

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

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


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

    pass


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

    pass


@dataclass(eq=False, repr=False)
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)
class TrunkConfigSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

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


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

    pass


@dataclass(eq=False, repr=False)
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: Optional[bool] = betterproto.message_field(
        3, wraps=betterproto.TYPE_BOOL
    )
    """Показывать удаленные"""


@dataclass(eq=False, repr=False)
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)
class PostTrunkConfigRequest(betterproto.Message):
    """Запрос сохранения Trunk-конфигурации по идентификатору"""

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


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

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

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


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

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

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


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

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


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

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

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


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

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


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

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

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


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

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

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


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

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


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

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


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

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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


@dataclass(eq=False, repr=False)
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)
class CmsPhoneSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

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


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

    pass


@dataclass(eq=False, repr=False)
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)
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)
class GetCmsPhoneListRequest(betterproto.Message):
    """Запрос на получение списка аналоговых трубок"""

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

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


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

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

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


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

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


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

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


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

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

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


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

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


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

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


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

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

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


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

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


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

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


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

    pass


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

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


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

    pass


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

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


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

    pass


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

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

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


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

    pass


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

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


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

    pass


@dataclass(eq=False, repr=False)
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)
class DeleteCmsPhoneOrponRoomNumberDeviceIdResponse(betterproto.Message):
    """
    Ответ на запрос удаления аналоговых трубок по идентификатору ОРПОН, номеру
    квартиры и идентификатору устройства
    """

    pass


@dataclass(eq=False, repr=False)
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)
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)
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: Optional[int] = 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: Optional[str] = betterproto.message_field(11, wraps=betterproto.TYPE_STRING)
    """Логин. # Диапазон: 0..100"""

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


@dataclass(eq=False, repr=False)
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: Optional[int] = betterproto.message_field(4, wraps=betterproto.TYPE_INT32)
    """Сетевой порт. # Диапазон: 0..65535"""

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

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

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


@dataclass(eq=False, repr=False)
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)
class SipPhoneSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

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


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

    pass


@dataclass(eq=False, repr=False)
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)
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)
class GetSipPhoneRequest(betterproto.Message):
    """Запрос на получение SIP-трубки"""

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


@dataclass(eq=False, repr=False)
class GetSipPhoneResponse(betterproto.Message):
    """Ответ на запрос SIP-трубки"""

    data: "SipPhone" = betterproto.message_field(1, group="type")
    """SIP-трубка"""

    error: "GetSipPhoneResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


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

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


@dataclass(eq=False, repr=False)
class GetSipPhoneListRequest(betterproto.Message):
    """Запрос на получение списка SIP-трубок"""

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

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


@dataclass(eq=False, repr=False)
class GetSipPhoneListResponse(betterproto.Message):
    """Ответ на запрос списка SIP-трубок"""

    data: "SipPhone" = betterproto.message_field(1, group="type")
    """SIP-трубка"""

    error: "GetSipPhoneListResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetSipPhoneListResponseError(betterproto.Message):
    """Ошибка запроса получения списка SIP-трубок"""

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


@dataclass(eq=False, repr=False)
class GetSipPhoneCountRequest(betterproto.Message):
    """Запрос на получение количества SIP-трубок"""

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


@dataclass(eq=False, repr=False)
class GetSipPhoneCountResponse(betterproto.Message):
    """Ответ на запрос количества SIP-трубок"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего трубок"""

    error: "GetSipPhoneCountResponseError" = betterproto.message_field(2, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class GetSipPhoneCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества SIP-трубок"""

    pass


@dataclass(eq=False, repr=False)
class PostSipPhoneGetListRequest(betterproto.Message):
    """Запрос на получение списка SIP-трубок"""

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

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


@dataclass(eq=False, repr=False)
class PostSipPhoneGetListResponse(betterproto.Message):
    """Ответ на запрос списка SIP-трубок"""

    items: List["SipPhone"] = betterproto.message_field(1)
    """Список SIP-трубок"""

    error: "PostSipPhoneGetListResponseError" = betterproto.message_field(2)
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PostSipPhoneGetListResponseError(betterproto.Message):
    """Ошибка запроса получения списка SIP-трубок"""

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


@dataclass(eq=False, repr=False)
class PostSipPhoneGetCountRequest(betterproto.Message):
    """Запрос на получение количества SIP-трубок"""

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


@dataclass(eq=False, repr=False)
class PostSipPhoneGetCountResponse(betterproto.Message):
    """Ответ на запрос количества SIP-трубок"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего трубок"""

    error: "PostSipPhoneGetCountResponseError" = betterproto.message_field(
        2, group="type"
    )
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PostSipPhoneGetCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества SIP-трубок"""

    pass


@dataclass(eq=False, repr=False)
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)
class GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False)
class GetSystemStatusResponse(betterproto.Message):
    """Ответ на запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
class ConfigureDeviceResultTaskSettingsState(betterproto.Message):
    """Состояние настройки"""

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

    error_message: str = betterproto.string_field(2)
    """Текст ошибки"""


@dataclass(eq=False, repr=False)
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)
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)
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)
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)
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: Optional[str] = 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)
class ControlDeviceTaskFaceRecognition(betterproto.Message):
    """Распознование лиц"""

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


@dataclass(eq=False, repr=False)
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)
class ControlDeviceTaskAutocollect(betterproto.Message):
    """Автосбор"""

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


@dataclass(eq=False, repr=False)
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)
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)
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)
class BlockCmsPhonesTaskCmsPhone(betterproto.Message):
    """Аналоговая трубка"""

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

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


@dataclass(eq=False, repr=False)
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)
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)
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)
class ActivateCmsPhonesTaskCmsPhone(betterproto.Message):
    """Аналоговая трубка"""

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

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


@dataclass(eq=False, repr=False)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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: Optional[bool] = betterproto.message_field(
        8, wraps=betterproto.TYPE_BOOL
    )
    """
    При передаче этого флага в true, ответное сообщение не будет получено
    """


@dataclass(eq=False, repr=False)
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)
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: Optional[bool] = betterproto.message_field(
        8, wraps=betterproto.TYPE_BOOL
    )
    """
    При передаче этого флага в true, ответное сообщение не будет получено
    """


@dataclass(eq=False, repr=False)
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: Optional[bool] = betterproto.message_field(
        8, wraps=betterproto.TYPE_BOOL
    )
    """
    При передаче этого флага в true, ответное сообщение не будет получено
    """


@dataclass(eq=False, repr=False)
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)
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)
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)
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)
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: Optional[int] = betterproto.message_field(
        3, wraps=betterproto.TYPE_INT32
    )
    """Номер реле"""

    delay: Optional[int] = betterproto.message_field(4, wraps=betterproto.TYPE_INT32)
    """Задержка в секундах"""

    car_number: Optional[str] = betterproto.message_field(
        5, wraps=betterproto.TYPE_STRING
    )
    """ГРЗ авто"""

    vehicle: Optional[str] = betterproto.message_field(6, wraps=betterproto.TYPE_STRING)
    """Тип ТС"""

    courier_company_name: Optional[str] = betterproto.message_field(
        7, wraps=betterproto.TYPE_STRING
    )
    """Наименование курьерской компании"""

    order_number: Optional[str] = betterproto.message_field(
        8, wraps=betterproto.TYPE_STRING
    )
    """Номер заказа"""

    courier_id: Optional[str] = betterproto.message_field(
        9, wraps=betterproto.TYPE_STRING
    )
    """Идентификатор курьера"""


@dataclass(eq=False, repr=False)
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: Optional[int] = betterproto.message_field(
        7, wraps=betterproto.TYPE_INT32
    )
    """Номер реле"""

    delay: Optional[int] = betterproto.message_field(8, wraps=betterproto.TYPE_INT32)
    """
    Задержка в секундах. Если не передано, то полставляется значение по
    умолчанию (5)
    """


@dataclass(eq=False, repr=False)
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)
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)
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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PutDeviceResponse":
        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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = 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)

    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)

    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)

    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)

    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)

    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,
            ),
        }
