from homeassistant.core import callback as callback
from typing import Any, Generator
from zwave_js_server.model.device_class import DeviceClassItem as DeviceClassItem
from zwave_js_server.model.node import Node as ZwaveNode
from zwave_js_server.model.value import Value as ZwaveValue

class ZwaveDiscoveryInfo:
    node: ZwaveNode
    primary_value: ZwaveValue
    platform: str
    platform_hint: Union[str, None] = ...
    def __init__(self, node: Any, primary_value: Any, platform: Any, platform_hint: Any) -> None: ...

class ZWaveValueDiscoverySchema:
    command_class: Union[set[int], None] = ...
    endpoint: Union[set[int], None] = ...
    property: Union[set[Union[str, int]], None] = ...
    property_name: Union[set[str], None] = ...
    property_key: Union[set[Union[str, int]], None] = ...
    property_key_name: Union[set[str], None] = ...
    type: Union[set[str], None] = ...
    def __init__(self, command_class: Any, endpoint: Any, property: Any, property_name: Any, property_key: Any, property_key_name: Any, type: Any) -> None: ...

class ZWaveDiscoverySchema:
    platform: str
    primary_value: ZWaveValueDiscoverySchema
    hint: Union[str, None] = ...
    manufacturer_id: Union[set[int], None] = ...
    product_id: Union[set[int], None] = ...
    product_type: Union[set[int], None] = ...
    firmware_version: Union[set[str], None] = ...
    device_class_basic: Union[set[Union[str, int]], None] = ...
    device_class_generic: Union[set[Union[str, int]], None] = ...
    device_class_specific: Union[set[Union[str, int]], None] = ...
    required_values: Union[list[ZWaveValueDiscoverySchema], None] = ...
    absent_values: Union[list[ZWaveValueDiscoverySchema], None] = ...
    allow_multi: bool = ...
    def __init__(self, platform: Any, primary_value: Any, hint: Any, manufacturer_id: Any, product_id: Any, product_type: Any, firmware_version: Any, device_class_basic: Any, device_class_generic: Any, device_class_specific: Any, required_values: Any, absent_values: Any, allow_multi: Any) -> None: ...

def get_config_parameter_discovery_schema(property_: Union[set[Union[str, int]], None]=..., property_name: Union[set[str], None]=..., property_key: Union[set[Union[str, int]], None]=..., property_key_name: Union[set[str], None]=..., **kwargs: Any) -> ZWaveDiscoverySchema: ...

SWITCH_MULTILEVEL_CURRENT_VALUE_SCHEMA: Any
DISCOVERY_SCHEMAS: Any

def async_discover_values(node: ZwaveNode) -> Generator[ZwaveDiscoveryInfo, None, None]: ...
def check_value(value: ZwaveValue, schema: ZWaveValueDiscoverySchema) -> bool: ...
def check_device_class(device_class: DeviceClassItem, required_value: Union[set[Union[str, int]], None]) -> bool: ...
