mirror of
https://github.com/esphome/esphome.git
synced 2024-11-24 07:58:09 +01:00
Add final validation config
This commit is contained in:
parent
fcb20b17f7
commit
7610036cbc
1 changed files with 23 additions and 24 deletions
|
@ -2,7 +2,7 @@ from esphome import automation
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
from esphome.components import esp32_ble
|
from esphome.components import esp32_ble
|
||||||
from esphome.components.esp32 import add_idf_sdkconfig_option
|
from esphome.components.esp32 import add_idf_sdkconfig_option
|
||||||
from esphome.components.esp32_ble import bt_uuid, bt_uuid16_format, bt_uuid32_format, bt_uuid128_format
|
from esphome.components.esp32_ble import bt_uuid
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
CONF_ID,
|
CONF_ID,
|
||||||
|
@ -33,7 +33,6 @@ CONF_VALUE_ACTION_ID_ = "value_action_id_"
|
||||||
|
|
||||||
# Core key to store the global configuration
|
# Core key to store the global configuration
|
||||||
_KEY_NOTIFY_REQUIRED = "esp32_ble_server_notify_required"
|
_KEY_NOTIFY_REQUIRED = "esp32_ble_server_notify_required"
|
||||||
_KEY_NOTIFY_PROVIDED = "esp32_ble_server_notify_provided"
|
|
||||||
|
|
||||||
esp32_ble_server_ns = cg.esphome_ns.namespace("esp32_ble_server")
|
esp32_ble_server_ns = cg.esphome_ns.namespace("esp32_ble_server")
|
||||||
ESPBTUUID_ns = cg.esphome_ns.namespace("esp32_ble").namespace("ESPBTUUID")
|
ESPBTUUID_ns = cg.esphome_ns.namespace("esp32_ble").namespace("ESPBTUUID")
|
||||||
|
@ -80,34 +79,32 @@ def validate_on_write(char_config):
|
||||||
return char_config
|
return char_config
|
||||||
|
|
||||||
|
|
||||||
def validate_notify_characteristic(char_config):
|
|
||||||
if _KEY_NOTIFY_PROVIDED not in CORE.data:
|
|
||||||
CORE.data[_KEY_NOTIFY_PROVIDED] = {}
|
|
||||||
CORE.data[_KEY_NOTIFY_PROVIDED][char_config[CONF_ID]] = char_config[CONF_NOTIFY]
|
|
||||||
# Check if the NOTIFY property is set if the characteristic has a notify action
|
|
||||||
char_ids = CORE.data.get(_KEY_NOTIFY_REQUIRED, set())
|
|
||||||
if not char_config[CONF_NOTIFY] and char_config[CONF_ID] in char_ids:
|
|
||||||
raise cv.Invalid(
|
|
||||||
"Characteristic has a notify action, but the NOTIFY property is not set"
|
|
||||||
)
|
|
||||||
return char_config
|
|
||||||
|
|
||||||
|
|
||||||
def validate_notify_action(action_char_id):
|
def validate_notify_action(action_char_id):
|
||||||
|
# Store the characteristic ID in the global data for the final validation
|
||||||
if _KEY_NOTIFY_REQUIRED not in CORE.data:
|
if _KEY_NOTIFY_REQUIRED not in CORE.data:
|
||||||
CORE.data[_KEY_NOTIFY_REQUIRED] = set()
|
CORE.data[_KEY_NOTIFY_REQUIRED] = set()
|
||||||
CORE.data[_KEY_NOTIFY_REQUIRED].add(action_char_id)
|
CORE.data[_KEY_NOTIFY_REQUIRED].add(action_char_id)
|
||||||
# Check if the NOTIFY property is set for the characteristic
|
|
||||||
char_notify_value = CORE.data.get(_KEY_NOTIFY_PROVIDED, {}).get(
|
|
||||||
action_char_id, None
|
|
||||||
)
|
|
||||||
if char_notify_value is not None and not char_notify_value:
|
|
||||||
raise cv.Invalid(
|
|
||||||
"Missing NOTIFY property for characteristic with notify action"
|
|
||||||
)
|
|
||||||
return action_char_id
|
return action_char_id
|
||||||
|
|
||||||
|
|
||||||
|
def final_validate_config(config):
|
||||||
|
# Check if all characteristics that require notifications have the notify property set
|
||||||
|
if _KEY_NOTIFY_REQUIRED in CORE.data:
|
||||||
|
for char_id in CORE.data[_KEY_NOTIFY_REQUIRED]:
|
||||||
|
# Look for the characteristic in the configuration
|
||||||
|
char_config = [
|
||||||
|
char_conf
|
||||||
|
for service_conf in config[CONF_SERVICES]
|
||||||
|
for char_conf in service_conf[CONF_CHARACTERISTICS]
|
||||||
|
if char_conf[CONF_ID] == char_id
|
||||||
|
][0]
|
||||||
|
if not char_config[CONF_NOTIFY]:
|
||||||
|
raise cv.Invalid(
|
||||||
|
f"Characteristic {char_id} has notify actions and the {CONF_NOTIFY} property is not set"
|
||||||
|
)
|
||||||
|
return config
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTOR_VALUE_SCHEMA = cv.Any(
|
DESCRIPTOR_VALUE_SCHEMA = cv.Any(
|
||||||
cv.boolean,
|
cv.boolean,
|
||||||
cv.float_,
|
cv.float_,
|
||||||
|
@ -152,7 +149,7 @@ SERVICE_CHARACTERISTIC_SCHEMA = cv.Schema(
|
||||||
{cv.GenerateID(): cv.declare_id(BLECharacteristic)}, single=True
|
{cv.GenerateID(): cv.declare_id(BLECharacteristic)}, single=True
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
extra_schemas=[validate_on_write, validate_notify_characteristic],
|
extra_schemas=[validate_on_write],
|
||||||
).extend({cv.Optional(k, default=False): cv.boolean for k in PROPERTY_MAP})
|
).extend({cv.Optional(k, default=False): cv.boolean for k in PROPERTY_MAP})
|
||||||
|
|
||||||
SERVICE_SCHEMA = cv.Schema(
|
SERVICE_SCHEMA = cv.Schema(
|
||||||
|
@ -177,6 +174,8 @@ CONFIG_SCHEMA = cv.Schema(
|
||||||
}
|
}
|
||||||
).extend(cv.COMPONENT_SCHEMA)
|
).extend(cv.COMPONENT_SCHEMA)
|
||||||
|
|
||||||
|
FINAL_VALIDATE_SCHEMA = final_validate_config
|
||||||
|
|
||||||
|
|
||||||
def parse_properties(char_conf):
|
def parse_properties(char_conf):
|
||||||
return sum(
|
return sum(
|
||||||
|
|
Loading…
Reference in a new issue