0

I have been trying to use the python library voluptuous for a few hours but I cannot make what I want.

Here is what is working right now :

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
    vol.Required(CONF_ENTITY_ID): cv.entity_id,
    vol.Required(CONF_STATE): cv.slug,
    vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,

    vol.Optional(CONF_START, default=None): cv.template,
    vol.Optional(CONF_END, default=None): cv.template,
    vol.Optional(CONF_DURATION, default=None): cv.template,
})

But I would like to add another constraint : I want exactly 2 of [CONF_START, CONF_END, CONF_DURATION] to be provided. Not more, not less than 2.

I have been told to use Exclusive and Inclusive, but I'm really confused about how voluptuous works.

How can I make it work like I want ?

Boris K
  • 1,469
  • 9
  • 29

1 Answers1

0

Finally, someone gave me the solution

I needed to put my validation into a separate function, and just concatenate my first schema with the function, using vol.All :

def exactly_two_period_keys(conf):
    provided = 0
    for param in [CONF_START, CONF_END, CONF_DURATION]:
        if param in conf and conf[param] is not None:
            provided += 1
    if provided != 2:
        raise vol.Invalid('Error message here')
    return conf


PLATFORM_SCHEMA = vol.All(PLATFORM_SCHEMA.extend({
    vol.Required(CONF_ENTITY_ID): cv.entity_id,
    vol.Required(CONF_STATE): cv.slug,
    vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,

    vol.Optional(CONF_START, default=None): cv.template,
    vol.Optional(CONF_END, default=None): cv.template,
    vol.Optional(CONF_DURATION, default=None): cv.template,
}), exactly_two_period_keys)
Boris K
  • 1,469
  • 9
  • 29