77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
import esphome.codegen as cg
|
|
from esphome.components import binary_sensor
|
|
import esphome.config_validation as cv
|
|
from esphome.const import (
|
|
CONF_DATA,
|
|
CONF_ID,
|
|
CONF_NAME,
|
|
CONF_STATUS,
|
|
CONF_TYPE,
|
|
DEVICE_CLASS_CONNECTIVITY,
|
|
ENTITY_CATEGORY_DIAGNOSTIC,
|
|
)
|
|
import esphome.final_validate as fv
|
|
|
|
from . import (
|
|
CONF_ENCRYPTION,
|
|
CONF_PING_PONG_ENABLE,
|
|
CONF_PROVIDER,
|
|
CONF_PROVIDERS,
|
|
CONF_REMOTE_ID,
|
|
CONF_TRANSPORT_ID,
|
|
PacketTransport,
|
|
packet_transport_sensor_schema,
|
|
provider_name_validate,
|
|
)
|
|
|
|
STATUS_SENSOR_SCHEMA = binary_sensor.binary_sensor_schema(
|
|
device_class=DEVICE_CLASS_CONNECTIVITY,
|
|
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
|
).extend(
|
|
{
|
|
cv.GenerateID(CONF_TRANSPORT_ID): cv.use_id(PacketTransport),
|
|
cv.Required(CONF_PROVIDER): provider_name_validate,
|
|
}
|
|
)
|
|
|
|
CONFIG_SCHEMA = cv.typed_schema(
|
|
{
|
|
CONF_DATA: packet_transport_sensor_schema(binary_sensor.binary_sensor_schema()),
|
|
CONF_STATUS: STATUS_SENSOR_SCHEMA,
|
|
},
|
|
key=CONF_TYPE,
|
|
default_type=CONF_DATA,
|
|
)
|
|
|
|
|
|
def _final_validate(config):
|
|
if config[CONF_TYPE] != CONF_STATUS:
|
|
# Only run this validation if a status sensor is being configured
|
|
return config
|
|
full_config = fv.full_config.get()
|
|
transport_path = full_config.get_path_for_id(config[CONF_TRANSPORT_ID])[:-1]
|
|
transport_config = full_config.get_config_for_path(transport_path)
|
|
if transport_config[CONF_PING_PONG_ENABLE] and any(
|
|
CONF_ENCRYPTION in p
|
|
for p in transport_config[CONF_PROVIDERS]
|
|
if p[CONF_NAME] == config[CONF_PROVIDER]
|
|
):
|
|
return config
|
|
raise cv.Invalid(
|
|
"Status sensor requires ping-pong to be enabled and the nominated provider to use encryption."
|
|
)
|
|
|
|
|
|
FINAL_VALIDATE_SCHEMA = _final_validate
|
|
|
|
|
|
async def to_code(config):
|
|
var = await binary_sensor.new_binary_sensor(config)
|
|
comp = await cg.get_variable(config[CONF_TRANSPORT_ID])
|
|
if config[CONF_TYPE] == CONF_STATUS:
|
|
cg.add(comp.set_provider_status_sensor(config[CONF_PROVIDER], var))
|
|
cg.add_define("USE_STATUS_SENSOR")
|
|
else: # CONF_DATA is default
|
|
remote_id = str(config.get(CONF_REMOTE_ID) or config.get(CONF_ID))
|
|
cg.add(comp.add_remote_binary_sensor(config[CONF_PROVIDER], remote_id, var))
|