Use NamedTuple for esphome service metadata (#56754)
parent
160571888c
commit
a91fbec198
|
@ -7,7 +7,7 @@ from dataclasses import dataclass, field
|
||||||
import functools
|
import functools
|
||||||
import logging
|
import logging
|
||||||
import math
|
import math
|
||||||
from typing import Any, Callable, Generic, TypeVar, cast, overload
|
from typing import Any, Callable, Generic, NamedTuple, TypeVar, cast, overload
|
||||||
|
|
||||||
from aioesphomeapi import (
|
from aioesphomeapi import (
|
||||||
APIClient,
|
APIClient,
|
||||||
|
@ -569,51 +569,60 @@ async def _async_setup_device_registry(
|
||||||
return device_entry.id
|
return device_entry.id
|
||||||
|
|
||||||
|
|
||||||
|
class ServiceMetadata(NamedTuple):
|
||||||
|
"""Metadata for services."""
|
||||||
|
|
||||||
|
validator: Any
|
||||||
|
example: str
|
||||||
|
selector: dict[str, Any]
|
||||||
|
description: str | None = None
|
||||||
|
|
||||||
|
|
||||||
ARG_TYPE_METADATA = {
|
ARG_TYPE_METADATA = {
|
||||||
UserServiceArgType.BOOL: {
|
UserServiceArgType.BOOL: ServiceMetadata(
|
||||||
"validator": cv.boolean,
|
validator=cv.boolean,
|
||||||
"example": "False",
|
example="False",
|
||||||
"selector": {"boolean": None},
|
selector={"boolean": None},
|
||||||
},
|
),
|
||||||
UserServiceArgType.INT: {
|
UserServiceArgType.INT: ServiceMetadata(
|
||||||
"validator": vol.Coerce(int),
|
validator=vol.Coerce(int),
|
||||||
"example": "42",
|
example="42",
|
||||||
"selector": {"number": {CONF_MODE: "box"}},
|
selector={"number": {CONF_MODE: "box"}},
|
||||||
},
|
),
|
||||||
UserServiceArgType.FLOAT: {
|
UserServiceArgType.FLOAT: ServiceMetadata(
|
||||||
"validator": vol.Coerce(float),
|
validator=vol.Coerce(float),
|
||||||
"example": "12.3",
|
example="12.3",
|
||||||
"selector": {"number": {CONF_MODE: "box", "step": 1e-3}},
|
selector={"number": {CONF_MODE: "box", "step": 1e-3}},
|
||||||
},
|
),
|
||||||
UserServiceArgType.STRING: {
|
UserServiceArgType.STRING: ServiceMetadata(
|
||||||
"validator": cv.string,
|
validator=cv.string,
|
||||||
"example": "Example text",
|
example="Example text",
|
||||||
"selector": {"text": None},
|
selector={"text": None},
|
||||||
},
|
),
|
||||||
UserServiceArgType.BOOL_ARRAY: {
|
UserServiceArgType.BOOL_ARRAY: ServiceMetadata(
|
||||||
"validator": [cv.boolean],
|
validator=[cv.boolean],
|
||||||
"description": "A list of boolean values.",
|
description="A list of boolean values.",
|
||||||
"example": "[True, False]",
|
example="[True, False]",
|
||||||
"selector": {"object": {}},
|
selector={"object": {}},
|
||||||
},
|
),
|
||||||
UserServiceArgType.INT_ARRAY: {
|
UserServiceArgType.INT_ARRAY: ServiceMetadata(
|
||||||
"validator": [vol.Coerce(int)],
|
validator=[vol.Coerce(int)],
|
||||||
"description": "A list of integer values.",
|
description="A list of integer values.",
|
||||||
"example": "[42, 34]",
|
example="[42, 34]",
|
||||||
"selector": {"object": {}},
|
selector={"object": {}},
|
||||||
},
|
),
|
||||||
UserServiceArgType.FLOAT_ARRAY: {
|
UserServiceArgType.FLOAT_ARRAY: ServiceMetadata(
|
||||||
"validator": [vol.Coerce(float)],
|
validator=[vol.Coerce(float)],
|
||||||
"description": "A list of floating point numbers.",
|
description="A list of floating point numbers.",
|
||||||
"example": "[ 12.3, 34.5 ]",
|
example="[ 12.3, 34.5 ]",
|
||||||
"selector": {"object": {}},
|
selector={"object": {}},
|
||||||
},
|
),
|
||||||
UserServiceArgType.STRING_ARRAY: {
|
UserServiceArgType.STRING_ARRAY: ServiceMetadata(
|
||||||
"validator": [cv.string],
|
validator=[cv.string],
|
||||||
"description": "A list of strings.",
|
description="A list of strings.",
|
||||||
"example": "['Example text', 'Another example']",
|
example="['Example text', 'Another example']",
|
||||||
"selector": {"object": {}},
|
selector={"object": {}},
|
||||||
},
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -636,13 +645,13 @@ async def _register_service(
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
metadata = ARG_TYPE_METADATA[arg.type]
|
metadata = ARG_TYPE_METADATA[arg.type]
|
||||||
schema[vol.Required(arg.name)] = metadata["validator"]
|
schema[vol.Required(arg.name)] = metadata.validator
|
||||||
fields[arg.name] = {
|
fields[arg.name] = {
|
||||||
"name": arg.name,
|
"name": arg.name,
|
||||||
"required": True,
|
"required": True,
|
||||||
"description": metadata.get("description"),
|
"description": metadata.description,
|
||||||
"example": metadata["example"],
|
"example": metadata.example,
|
||||||
"selector": metadata["selector"],
|
"selector": metadata.selector,
|
||||||
}
|
}
|
||||||
|
|
||||||
async def execute_service(call: ServiceCall) -> None:
|
async def execute_service(call: ServiceCall) -> None:
|
||||||
|
|
Loading…
Reference in New Issue