From 94cb7bf6bdb189f7eba91ca8ec02ad41ff2a36e4 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Sun, 6 Jan 2019 09:47:47 +0100 Subject: [PATCH] Validate MQTT enabled for MQTT options --- esphomeyaml/components/fan/__init__.py | 6 ++++-- esphomeyaml/config_validation.py | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/esphomeyaml/components/fan/__init__.py b/esphomeyaml/components/fan/__init__.py index 344bf8b115..cc7ac78c09 100644 --- a/esphomeyaml/components/fan/__init__.py +++ b/esphomeyaml/components/fan/__init__.py @@ -33,8 +33,10 @@ FAN_SPEED_HIGH = FanSpeed.FAN_SPEED_HIGH FAN_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(FanState), cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTFanComponent), - vol.Optional(CONF_OSCILLATION_STATE_TOPIC): cv.publish_topic, - vol.Optional(CONF_OSCILLATION_COMMAND_TOPIC): cv.subscribe_topic, + vol.Optional(CONF_OSCILLATION_STATE_TOPIC): vol.All(cv.requires_component('mqtt'), + cv.publish_topic), + vol.Optional(CONF_OSCILLATION_COMMAND_TOPIC): vol.All(cv.requires_component('mqtt'), + cv.subscribe_topic), }) FAN_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(FAN_SCHEMA.schema) diff --git a/esphomeyaml/config_validation.py b/esphomeyaml/config_validation.py index 8fcd382437..1b92f5f5fb 100644 --- a/esphomeyaml/config_validation.py +++ b/esphomeyaml/config_validation.py @@ -570,6 +570,14 @@ def mqtt_qos(value): return one_of(0, 1, 2)(value) +def requires_component(comp): + def validator(value): + if comp not in CORE.config: + raise vol.Invalid("This option requires component {}".format(comp)) + return value + return validator + + uint8_t = vol.All(int_, vol.Range(min=0, max=255)) uint16_t = vol.All(int_, vol.Range(min=0, max=65535)) uint32_t = vol.All(int_, vol.Range(min=0, max=4294967295)) @@ -723,15 +731,16 @@ MQTT_COMPONENT_AVAILABILITY_SCHEMA = vol.Schema({ MQTT_COMPONENT_SCHEMA = vol.Schema({ vol.Optional(CONF_NAME): string, - vol.Optional(CONF_RETAIN): boolean, - vol.Optional(CONF_DISCOVERY): boolean, - vol.Optional(CONF_STATE_TOPIC): publish_topic, - vol.Optional(CONF_AVAILABILITY): vol.Any(None, MQTT_COMPONENT_AVAILABILITY_SCHEMA), + vol.Optional(CONF_RETAIN): vol.All(requires_component('mqtt'), boolean), + vol.Optional(CONF_DISCOVERY): vol.All(requires_component('mqtt'), boolean), + vol.Optional(CONF_STATE_TOPIC): vol.All(requires_component('mqtt'), publish_topic), + vol.Optional(CONF_AVAILABILITY): vol.All(requires_component('mqtt'), + vol.Any(None, MQTT_COMPONENT_AVAILABILITY_SCHEMA)), vol.Optional(CONF_INTERNAL): boolean, }) MQTT_COMMAND_COMPONENT_SCHEMA = MQTT_COMPONENT_SCHEMA.extend({ - vol.Optional(CONF_COMMAND_TOPIC): subscribe_topic, + vol.Optional(CONF_COMMAND_TOPIC): vol.All(requires_component('mqtt'), subscribe_topic), }) COMPONENT_SCHEMA = vol.Schema({