mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Add internal modifier. Fixes ottowinter/esphomelib#77
This commit is contained in:
		| @@ -10,7 +10,8 @@ from datetime import datetime | |||||||
| from esphomeyaml import const, core, mqtt, wizard, writer, yaml_util | from esphomeyaml import const, core, mqtt, wizard, writer, yaml_util | ||||||
| from esphomeyaml.config import core_to_code, get_component, iter_components, read_config | from esphomeyaml.config import core_to_code, get_component, iter_components, read_config | ||||||
| from esphomeyaml.const import CONF_BAUD_RATE, CONF_DOMAIN, CONF_ESPHOMEYAML, CONF_HOSTNAME, \ | from esphomeyaml.const import CONF_BAUD_RATE, CONF_DOMAIN, CONF_ESPHOMEYAML, CONF_HOSTNAME, \ | ||||||
|     CONF_LOGGER, CONF_MANUAL_IP, CONF_NAME, CONF_STATIC_IP, CONF_WIFI, ESP_PLATFORM_ESP8266 |     CONF_LOGGER, CONF_MANUAL_IP, CONF_NAME, CONF_STATIC_IP, CONF_WIFI, ESP_PLATFORM_ESP8266, \ | ||||||
|  |     CONF_NETWORKS | ||||||
| from esphomeyaml.core import ESPHomeYAMLError | from esphomeyaml.core import ESPHomeYAMLError | ||||||
| from esphomeyaml.helpers import AssignmentExpression, Expression, RawStatement, _EXPRESSIONS, add, \ | from esphomeyaml.helpers import AssignmentExpression, Expression, RawStatement, _EXPRESSIONS, add, \ | ||||||
|     add_job, color, flush_tasks, indent, quote, statement |     add_job, color, flush_tasks, indent, quote, statement | ||||||
| @@ -160,8 +161,9 @@ def compile_program(args, config): | |||||||
|  |  | ||||||
|  |  | ||||||
| def get_upload_host(config): | def get_upload_host(config): | ||||||
|     if CONF_MANUAL_IP in config[CONF_WIFI]: |     has_networks = bool(config[CONF_WIFI].get(CONF_NETWORKS)) | ||||||
|         host = str(config[CONF_WIFI][CONF_MANUAL_IP][CONF_STATIC_IP]) |     if has_networks and CONF_MANUAL_IP in config[CONF_WIFI][CONF_NETWORKS][0]: | ||||||
|  |         host = str(config[CONF_WIFI][CONF_NETWORKS][0][CONF_MANUAL_IP][CONF_STATIC_IP]) | ||||||
|     elif CONF_HOSTNAME in config[CONF_WIFI]: |     elif CONF_HOSTNAME in config[CONF_WIFI]: | ||||||
|         host = config[CONF_WIFI][CONF_HOSTNAME] + config[CONF_WIFI][CONF_DOMAIN] |         host = config[CONF_WIFI][CONF_HOSTNAME] + config[CONF_WIFI][CONF_DOMAIN] | ||||||
|     else: |     else: | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ import esphomeyaml.config_validation as cv | |||||||
| from esphomeyaml import automation | from esphomeyaml import automation | ||||||
| from esphomeyaml.const import CONF_DEVICE_CLASS, CONF_ID, CONF_INVERTED, CONF_MAX_LENGTH, \ | from esphomeyaml.const import CONF_DEVICE_CLASS, CONF_ID, CONF_INVERTED, CONF_MAX_LENGTH, \ | ||||||
|     CONF_MIN_LENGTH, CONF_MQTT_ID, CONF_ON_CLICK, CONF_ON_DOUBLE_CLICK, CONF_ON_PRESS, \ |     CONF_MIN_LENGTH, CONF_MQTT_ID, CONF_ON_CLICK, CONF_ON_DOUBLE_CLICK, CONF_ON_PRESS, \ | ||||||
|     CONF_ON_RELEASE, CONF_TRIGGER_ID |     CONF_ON_RELEASE, CONF_TRIGGER_ID, CONF_INTERNAL | ||||||
| from esphomeyaml.helpers import App, NoArg, Pvariable, add, esphomelib_ns, setup_mqtt_component, \ | from esphomeyaml.helpers import App, NoArg, Pvariable, add, esphomelib_ns, setup_mqtt_component, \ | ||||||
|     add_job |     add_job | ||||||
|  |  | ||||||
| @@ -51,8 +51,12 @@ BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ | |||||||
|         })]), |         })]), | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | BINARY_SENSOR_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BINARY_SENSOR_SCHEMA.schema) | ||||||
|  |  | ||||||
|  |  | ||||||
| def setup_binary_sensor_core_(binary_sensor_var, mqtt_var, config): | def setup_binary_sensor_core_(binary_sensor_var, mqtt_var, config): | ||||||
|  |     if CONF_INTERNAL in config: | ||||||
|  |         add(binary_sensor_var.set_internal(CONF_INTERNAL)) | ||||||
|     if CONF_DEVICE_CLASS in config: |     if CONF_DEVICE_CLASS in config: | ||||||
|         add(binary_sensor_var.set_device_class(config[CONF_DEVICE_CLASS])) |         add(binary_sensor_var.set_device_class(config[CONF_DEVICE_CLASS])) | ||||||
|     if CONF_INVERTED in config: |     if CONF_INVERTED in config: | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ import esphomeyaml.config_validation as cv | |||||||
| from esphomeyaml.components import binary_sensor | from esphomeyaml.components import binary_sensor | ||||||
| from esphomeyaml.components.esp32_ble import ESP32BLETracker | from esphomeyaml.components.esp32_ble import ESP32BLETracker | ||||||
| from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME, ESP_PLATFORM_ESP32 | from esphomeyaml.const import CONF_MAC_ADDRESS, CONF_NAME, ESP_PLATFORM_ESP32 | ||||||
| from esphomeyaml.core import HexInt, MACAddress | from esphomeyaml.core import HexInt | ||||||
| from esphomeyaml.helpers import ArrayInitializer, get_variable | from esphomeyaml.helpers import ArrayInitializer, get_variable | ||||||
|  |  | ||||||
| ESP_PLATFORMS = [ESP_PLATFORM_ESP32] | ESP_PLATFORMS = [ESP_PLATFORM_ESP32] | ||||||
| @@ -12,28 +12,10 @@ DEPENDENCIES = ['esp32_ble'] | |||||||
|  |  | ||||||
| CONF_ESP32_BLE_ID = 'esp32_ble_id' | CONF_ESP32_BLE_ID = 'esp32_ble_id' | ||||||
|  |  | ||||||
|  | PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
| def validate_mac(value): |     vol.Required(CONF_MAC_ADDRESS): cv.mac_address, | ||||||
|     value = cv.string_strict(value) |  | ||||||
|     parts = value.split(':') |  | ||||||
|     if len(parts) != 6: |  | ||||||
|         raise vol.Invalid("MAC Address must consist of 6 : (colon) separated parts") |  | ||||||
|     parts_int = [] |  | ||||||
|     if any(len(part) != 2 for part in parts): |  | ||||||
|         raise vol.Invalid("MAC Address must be format XX:XX:XX:XX:XX:XX") |  | ||||||
|     for part in parts: |  | ||||||
|         try: |  | ||||||
|             parts_int.append(int(part, 16)) |  | ||||||
|         except ValueError: |  | ||||||
|             raise vol.Invalid("MAC Address parts must be hexadecimal values from 00 to FF") |  | ||||||
|  |  | ||||||
|     return MACAddress(*parts_int) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = binary_sensor.PLATFORM_SCHEMA.extend({ |  | ||||||
|     vol.Required(CONF_MAC_ADDRESS): validate_mac, |  | ||||||
|     cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker) |     cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_variable_id(ESP32BLETracker) | ||||||
| }).extend(binary_sensor.BINARY_SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -34,11 +34,11 @@ def validate_touch_pad(value): | |||||||
|     return value |     return value | ||||||
|  |  | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = binary_sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     vol.Required(CONF_PIN): validate_touch_pad, |     vol.Required(CONF_PIN): validate_touch_pad, | ||||||
|     vol.Required(CONF_THRESHOLD): cv.uint16_t, |     vol.Required(CONF_THRESHOLD): cv.uint16_t, | ||||||
|     cv.GenerateID(CONF_ESP32_TOUCH_ID): cv.use_variable_id(ESP32TouchComponent), |     cv.GenerateID(CONF_ESP32_TOUCH_ID): cv.use_variable_id(ESP32TouchComponent), | ||||||
| }).extend(binary_sensor.BINARY_SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -8,10 +8,10 @@ from esphomeyaml.helpers import App, gpio_input_pin_expression, variable, Applic | |||||||
|  |  | ||||||
| MakeGPIOBinarySensor = Application.MakeGPIOBinarySensor | MakeGPIOBinarySensor = Application.MakeGPIOBinarySensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = binary_sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeGPIOBinarySensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeGPIOBinarySensor), | ||||||
|     vol.Required(CONF_PIN): pins.gpio_input_pin_schema |     vol.Required(CONF_PIN): pins.gpio_input_pin_schema | ||||||
| }).extend(binary_sensor.BINARY_SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -7,9 +7,9 @@ DEPENDENCIES = ['mqtt'] | |||||||
|  |  | ||||||
| MakeStatusBinarySensor = Application.MakeStatusBinarySensor | MakeStatusBinarySensor = Application.MakeStatusBinarySensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = binary_sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeStatusBinarySensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeStatusBinarySensor), | ||||||
| }).extend(binary_sensor.BINARY_SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ from esphomeyaml.helpers import App, Application, process_lambda, variable, opti | |||||||
|  |  | ||||||
| MakeTemplateBinarySensor = Application.MakeTemplateBinarySensor | MakeTemplateBinarySensor = Application.MakeTemplateBinarySensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = binary_sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateBinarySensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateBinarySensor), | ||||||
|     vol.Required(CONF_LAMBDA): cv.lambda_, |     vol.Required(CONF_LAMBDA): cv.lambda_, | ||||||
| }).extend(binary_sensor.BINARY_SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import esphomeyaml.config_validation as cv | import esphomeyaml.config_validation as cv | ||||||
| from esphomeyaml.const import CONF_ID, CONF_MQTT_ID | from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_INTERNAL | ||||||
| from esphomeyaml.helpers import Pvariable, esphomelib_ns, setup_mqtt_component | from esphomeyaml.helpers import Pvariable, esphomelib_ns, setup_mqtt_component, add | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ | ||||||
|  |  | ||||||
| @@ -21,8 +21,12 @@ COVER_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({ | |||||||
|     cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTCoverComponent), |     cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTCoverComponent), | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | COVER_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(COVER_SCHEMA.schema) | ||||||
|  |  | ||||||
|  |  | ||||||
| def setup_cover_core_(cover_var, mqtt_var, config): | def setup_cover_core_(cover_var, mqtt_var, config): | ||||||
|  |     if CONF_INTERNAL in config: | ||||||
|  |         add(cover_var.set_internal(config[CONF_INTERNAL])) | ||||||
|     setup_mqtt_component(mqtt_var, config) |     setup_mqtt_component(mqtt_var, config) | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,14 +9,14 @@ from esphomeyaml.helpers import App, Application, NoArg, add, process_lambda, va | |||||||
|  |  | ||||||
| MakeTemplateCover = Application.MakeTemplateCover | MakeTemplateCover = Application.MakeTemplateCover | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = vol.All(cover.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(cover.COVER_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateCover), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateCover), | ||||||
|     vol.Optional(CONF_LAMBDA): cv.lambda_, |     vol.Optional(CONF_LAMBDA): cv.lambda_, | ||||||
|     vol.Optional(CONF_OPTIMISTIC): cv.boolean, |     vol.Optional(CONF_OPTIMISTIC): cv.boolean, | ||||||
|     vol.Optional(CONF_OPEN_ACTION): automation.ACTIONS_SCHEMA, |     vol.Optional(CONF_OPEN_ACTION): automation.ACTIONS_SCHEMA, | ||||||
|     vol.Optional(CONF_CLOSE_ACTION): automation.ACTIONS_SCHEMA, |     vol.Optional(CONF_CLOSE_ACTION): automation.ACTIONS_SCHEMA, | ||||||
|     vol.Optional(CONF_STOP_ACTION): automation.ACTIONS_SCHEMA, |     vol.Optional(CONF_STOP_ACTION): automation.ACTIONS_SCHEMA, | ||||||
| }).extend(cover.COVER_SCHEMA.schema), cv.has_at_least_one_key(CONF_LAMBDA, CONF_OPTIMISTIC)) | }), cv.has_at_least_one_key(CONF_LAMBDA, CONF_OPTIMISTIC)) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ import voluptuous as vol | |||||||
|  |  | ||||||
| import esphomeyaml.config_validation as cv | import esphomeyaml.config_validation as cv | ||||||
| from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_OSCILLATION_COMMAND_TOPIC, \ | from esphomeyaml.const import CONF_ID, CONF_MQTT_ID, CONF_OSCILLATION_COMMAND_TOPIC, \ | ||||||
|     CONF_OSCILLATION_STATE_TOPIC, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC |     CONF_OSCILLATION_STATE_TOPIC, CONF_SPEED_COMMAND_TOPIC, CONF_SPEED_STATE_TOPIC, CONF_INTERNAL | ||||||
| from esphomeyaml.helpers import Application, Pvariable, add, esphomelib_ns, setup_mqtt_component | from esphomeyaml.helpers import Application, Pvariable, add, esphomelib_ns, setup_mqtt_component | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ | ||||||
| @@ -29,6 +29,8 @@ FAN_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({ | |||||||
|     vol.Optional(CONF_OSCILLATION_COMMAND_TOPIC): cv.subscribe_topic, |     vol.Optional(CONF_OSCILLATION_COMMAND_TOPIC): cv.subscribe_topic, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | FAN_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(FAN_SCHEMA.schema) | ||||||
|  |  | ||||||
|  |  | ||||||
| FAN_SPEEDS = { | FAN_SPEEDS = { | ||||||
|     'OFF': FAN_SPEED_OFF, |     'OFF': FAN_SPEED_OFF, | ||||||
| @@ -43,6 +45,9 @@ def validate_fan_speed(value): | |||||||
|  |  | ||||||
|  |  | ||||||
| def setup_fan_core_(fan_var, mqtt_var, config): | def setup_fan_core_(fan_var, mqtt_var, config): | ||||||
|  |     if CONF_INTERNAL in config: | ||||||
|  |         add(fan_var.set_internal(config[CONF_INTERNAL])) | ||||||
|  |  | ||||||
|     if CONF_OSCILLATION_STATE_TOPIC in config: |     if CONF_OSCILLATION_STATE_TOPIC in config: | ||||||
|         add(mqtt_var.set_custom_oscillation_state_topic(config[CONF_OSCILLATION_STATE_TOPIC])) |         add(mqtt_var.set_custom_oscillation_state_topic(config[CONF_OSCILLATION_STATE_TOPIC])) | ||||||
|     if CONF_OSCILLATION_COMMAND_TOPIC in config: |     if CONF_OSCILLATION_COMMAND_TOPIC in config: | ||||||
|   | |||||||
| @@ -5,11 +5,11 @@ from esphomeyaml.components import fan | |||||||
| from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OSCILLATION_OUTPUT, CONF_OUTPUT | from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OSCILLATION_OUTPUT, CONF_OUTPUT | ||||||
| from esphomeyaml.helpers import App, add, get_variable, variable | from esphomeyaml.helpers import App, add, get_variable, variable | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = fan.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), | ||||||
|     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), |     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), | ||||||
|     vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(None), |     vol.Optional(CONF_OSCILLATION_OUTPUT): cv.use_variable_id(None), | ||||||
| }).extend(fan.FAN_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ from esphomeyaml.const import CONF_HIGH, CONF_LOW, CONF_MAKE_ID, CONF_MEDIUM, CO | |||||||
|     CONF_SPEED_STATE_TOPIC |     CONF_SPEED_STATE_TOPIC | ||||||
| from esphomeyaml.helpers import App, add, get_variable, variable | from esphomeyaml.helpers import App, add, get_variable, variable | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = fan.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(fan.FAN_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(fan.MakeFan), | ||||||
|     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), |     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), | ||||||
|     vol.Optional(CONF_SPEED_STATE_TOPIC): cv.publish_topic, |     vol.Optional(CONF_SPEED_STATE_TOPIC): cv.publish_topic, | ||||||
| @@ -18,7 +18,7 @@ PLATFORM_SCHEMA = fan.PLATFORM_SCHEMA.extend({ | |||||||
|         vol.Required(CONF_MEDIUM): cv.percentage, |         vol.Required(CONF_MEDIUM): cv.percentage, | ||||||
|         vol.Required(CONF_HIGH): cv.percentage, |         vol.Required(CONF_HIGH): cv.percentage, | ||||||
|     }), |     }), | ||||||
| }).extend(fan.FAN_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -13,8 +13,11 @@ CONFIG_SCHEMA = vol.Schema({ | |||||||
|     vol.Required(CONF_SDA, default='SDA'): pins.input_output_pin, |     vol.Required(CONF_SDA, default='SDA'): pins.input_output_pin, | ||||||
|     vol.Required(CONF_SCL, default='SCL'): pins.input_output_pin, |     vol.Required(CONF_SCL, default='SCL'): pins.input_output_pin, | ||||||
|     vol.Optional(CONF_FREQUENCY): vol.All(cv.frequency, vol.Range(min=0, min_included=False)), |     vol.Optional(CONF_FREQUENCY): vol.All(cv.frequency, vol.Range(min=0, min_included=False)), | ||||||
|     vol.Optional(CONF_RECEIVE_TIMEOUT): cv.positive_time_period_milliseconds, |  | ||||||
|     vol.Optional(CONF_SCAN): cv.boolean, |     vol.Optional(CONF_SCAN): cv.boolean, | ||||||
|  |  | ||||||
|  |     vol.Optional(CONF_RECEIVE_TIMEOUT): cv.invalid("The receive_timeout option has been removed " | ||||||
|  |                                                    "because timeouts are already handled by the " | ||||||
|  |                                                    "low-level i2c interface.") | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -23,8 +26,6 @@ def to_code(config): | |||||||
|     i2c = Pvariable(config[CONF_ID], rhs) |     i2c = Pvariable(config[CONF_ID], rhs) | ||||||
|     if CONF_FREQUENCY in config: |     if CONF_FREQUENCY in config: | ||||||
|         add(i2c.set_frequency(config[CONF_FREQUENCY])) |         add(i2c.set_frequency(config[CONF_FREQUENCY])) | ||||||
|     if CONF_RECEIVE_TIMEOUT in config: |  | ||||||
|         add(i2c.set_receive_timeout(config[CONF_RECEIVE_TIMEOUT])) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| BUILD_FLAGS = '-DUSE_I2C' | BUILD_FLAGS = '-DUSE_I2C' | ||||||
|   | |||||||
| @@ -1,28 +1,6 @@ | |||||||
| import voluptuous as vol | import voluptuous as vol | ||||||
|  |  | ||||||
| import esphomeyaml.config_validation as cv |  | ||||||
| from esphomeyaml import pins |  | ||||||
| from esphomeyaml.components import switch |  | ||||||
| from esphomeyaml.const import CONF_CARRIER_DUTY_PERCENT, CONF_ID, CONF_PIN |  | ||||||
| from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression |  | ||||||
|  |  | ||||||
| IRTransmitterComponent = switch.switch_ns.namespace('IRTransmitterComponent') | def CONFIG_SCHEMA(config): | ||||||
|  |     raise vol.Invalid("The ir_transmitter component has been renamed to " | ||||||
| CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({ |                       "remote_transmitter because of 433MHz signal support.") | ||||||
|     cv.GenerateID(): cv.declare_variable_id(IRTransmitterComponent), |  | ||||||
|     vol.Required(CONF_PIN): pins.gpio_output_pin_schema, |  | ||||||
|     vol.Optional(CONF_CARRIER_DUTY_PERCENT): vol.All(vol.Coerce(int), |  | ||||||
|                                                      vol.Range(min=1, max=100)), |  | ||||||
| })]) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): |  | ||||||
|     for conf in config: |  | ||||||
|         pin = None |  | ||||||
|         for pin in gpio_output_pin_expression(conf[CONF_PIN]): |  | ||||||
|             yield |  | ||||||
|         rhs = App.make_ir_transmitter(pin, conf.get(CONF_CARRIER_DUTY_PERCENT)) |  | ||||||
|         Pvariable(conf[CONF_ID], rhs) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| BUILD_FLAGS = '-DUSE_IR_TRANSMITTER' |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import esphomeyaml.config_validation as cv | import esphomeyaml.config_validation as cv | ||||||
| from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, CONF_ID, \ | from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT, CONF_ID, \ | ||||||
|     CONF_MQTT_ID |     CONF_MQTT_ID, CONF_INTERNAL | ||||||
| from esphomeyaml.helpers import Application, Pvariable, add, esphomelib_ns, setup_mqtt_component | from esphomeyaml.helpers import Application, Pvariable, add, esphomelib_ns, setup_mqtt_component | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ | ||||||
| @@ -20,8 +20,12 @@ LIGHT_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({ | |||||||
|     cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTJSONLightComponent), |     cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTJSONLightComponent), | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | LIGHT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(LIGHT_SCHEMA.schema) | ||||||
|  |  | ||||||
|  |  | ||||||
| def setup_light_core_(light_var, mqtt_var, config): | def setup_light_core_(light_var, mqtt_var, config): | ||||||
|  |     if CONF_INTERNAL in config: | ||||||
|  |         add(light_var.set_internal(config[CONF_INTERNAL])) | ||||||
|     if CONF_DEFAULT_TRANSITION_LENGTH in config: |     if CONF_DEFAULT_TRANSITION_LENGTH in config: | ||||||
|         add(light_var.set_default_transition_length(config[CONF_DEFAULT_TRANSITION_LENGTH])) |         add(light_var.set_default_transition_length(config[CONF_DEFAULT_TRANSITION_LENGTH])) | ||||||
|     if CONF_GAMMA_CORRECT in config: |     if CONF_GAMMA_CORRECT in config: | ||||||
|   | |||||||
| @@ -5,10 +5,10 @@ from esphomeyaml.components import light | |||||||
| from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT | from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_OUTPUT | ||||||
| from esphomeyaml.helpers import App, get_variable, variable | from esphomeyaml.helpers import App, get_variable, variable | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = light.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), | ||||||
|     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), |     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), | ||||||
| }).extend(light.LIGHT_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -55,7 +55,7 @@ def validate(value): | |||||||
|  |  | ||||||
| MakeFastLEDLight = Application.MakeFastLEDLight | MakeFastLEDLight = Application.MakeFastLEDLight | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = vol.All(light.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight), | ||||||
|  |  | ||||||
|     vol.Required(CONF_CHIPSET): vol.All(vol.Upper, cv.one_of(*TYPES)), |     vol.Required(CONF_CHIPSET): vol.All(vol.Upper, cv.one_of(*TYPES)), | ||||||
| @@ -68,7 +68,7 @@ PLATFORM_SCHEMA = vol.All(light.PLATFORM_SCHEMA.extend({ | |||||||
|     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, |     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, | ||||||
|     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||||
|     vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent), |     vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent), | ||||||
| }).extend(light.LIGHT_SCHEMA.schema), validate) | }), validate) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ RGB_ORDERS = [ | |||||||
|  |  | ||||||
| MakeFastLEDLight = Application.MakeFastLEDLight | MakeFastLEDLight = Application.MakeFastLEDLight | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = light.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeFastLEDLight), | ||||||
|  |  | ||||||
|     vol.Required(CONF_CHIPSET): vol.All(vol.Upper, cv.one_of(*CHIPSETS)), |     vol.Required(CONF_CHIPSET): vol.All(vol.Upper, cv.one_of(*CHIPSETS)), | ||||||
| @@ -46,7 +46,7 @@ PLATFORM_SCHEMA = light.PLATFORM_SCHEMA.extend({ | |||||||
|     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, |     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, | ||||||
|     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||||
|     vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent), |     vol.Optional(CONF_POWER_SUPPLY): cv.use_variable_id(PowerSupplyComponent), | ||||||
| }).extend(light.LIGHT_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -6,12 +6,12 @@ from esphomeyaml.const import CONF_DEFAULT_TRANSITION_LENGTH, CONF_GAMMA_CORRECT | |||||||
|     CONF_NAME, CONF_OUTPUT |     CONF_NAME, CONF_OUTPUT | ||||||
| from esphomeyaml.helpers import App, get_variable, variable | from esphomeyaml.helpers import App, get_variable, variable | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = light.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), | ||||||
|     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), |     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), | ||||||
|     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, |     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, | ||||||
|     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||||
| }).extend(light.LIGHT_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -6,14 +6,14 @@ from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_GA | |||||||
|     CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED |     CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED | ||||||
| from esphomeyaml.helpers import App, get_variable, variable | from esphomeyaml.helpers import App, get_variable, variable | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = light.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), | ||||||
|     vol.Required(CONF_RED): cv.use_variable_id(None), |     vol.Required(CONF_RED): cv.use_variable_id(None), | ||||||
|     vol.Required(CONF_GREEN): cv.use_variable_id(None), |     vol.Required(CONF_GREEN): cv.use_variable_id(None), | ||||||
|     vol.Required(CONF_BLUE): cv.use_variable_id(None), |     vol.Required(CONF_BLUE): cv.use_variable_id(None), | ||||||
|     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, |     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, | ||||||
|     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||||
| }).extend(light.LIGHT_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ from esphomeyaml.const import CONF_BLUE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_GA | |||||||
|     CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_WHITE |     CONF_GREEN, CONF_MAKE_ID, CONF_NAME, CONF_RED, CONF_WHITE | ||||||
| from esphomeyaml.helpers import App, get_variable, variable | from esphomeyaml.helpers import App, get_variable, variable | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = light.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(light.MakeLight), | ||||||
|     vol.Required(CONF_RED): cv.use_variable_id(None), |     vol.Required(CONF_RED): cv.use_variable_id(None), | ||||||
|     vol.Required(CONF_GREEN): cv.use_variable_id(None), |     vol.Required(CONF_GREEN): cv.use_variable_id(None), | ||||||
| @@ -14,7 +14,7 @@ PLATFORM_SCHEMA = light.PLATFORM_SCHEMA.extend({ | |||||||
|     vol.Required(CONF_WHITE): cv.use_variable_id(None), |     vol.Required(CONF_WHITE): cv.use_variable_id(None), | ||||||
|     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, |     vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, | ||||||
|     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_DEFAULT_TRANSITION_LENGTH): cv.positive_time_period_milliseconds, | ||||||
| }).extend(light.LIGHT_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -36,7 +36,7 @@ LogComponent = esphomelib_ns.LogComponent | |||||||
| CONFIG_SCHEMA = vol.All(vol.Schema({ | CONFIG_SCHEMA = vol.All(vol.Schema({ | ||||||
|     cv.GenerateID(): cv.declare_variable_id(LogComponent), |     cv.GenerateID(): cv.declare_variable_id(LogComponent), | ||||||
|     vol.Optional(CONF_BAUD_RATE): cv.positive_int, |     vol.Optional(CONF_BAUD_RATE): cv.positive_int, | ||||||
|     vol.Optional(CONF_TX_BUFFER_SIZE): cv.positive_int, |     vol.Optional(CONF_TX_BUFFER_SIZE): cv.validate_bytes, | ||||||
|     vol.Optional(CONF_LEVEL): is_log_level, |     vol.Optional(CONF_LEVEL): is_log_level, | ||||||
|     vol.Optional(CONF_LOGS): vol.Schema({ |     vol.Optional(CONF_LOGS): vol.Schema({ | ||||||
|         cv.string: is_log_level, |         cv.string: is_log_level, | ||||||
|   | |||||||
| @@ -14,10 +14,14 @@ BINARY_OUTPUT_SCHEMA = vol.Schema({ | |||||||
|     vol.Optional(CONF_INVERTED): cv.boolean, |     vol.Optional(CONF_INVERTED): cv.boolean, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | BINARY_OUTPUT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(BINARY_OUTPUT_SCHEMA.schema) | ||||||
|  |  | ||||||
| FLOAT_OUTPUT_SCHEMA = BINARY_OUTPUT_SCHEMA.extend({ | FLOAT_OUTPUT_SCHEMA = BINARY_OUTPUT_SCHEMA.extend({ | ||||||
|     vol.Optional(CONF_MAX_POWER): cv.percentage, |     vol.Optional(CONF_MAX_POWER): cv.percentage, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | FLOAT_OUTPUT_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(FLOAT_OUTPUT_SCHEMA.schema) | ||||||
|  |  | ||||||
| output_ns = esphomelib_ns.namespace('output') | output_ns = esphomelib_ns.namespace('output') | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,10 +18,10 @@ def valid_pwm_pin(value): | |||||||
|  |  | ||||||
| ESP8266PWMOutput = output.output_ns.ESP8266PWMOutput | ESP8266PWMOutput = output.output_ns.ESP8266PWMOutput | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = output.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ | ||||||
|     vol.Required(CONF_ID): cv.declare_variable_id(ESP8266PWMOutput), |     vol.Required(CONF_ID): cv.declare_variable_id(ESP8266PWMOutput), | ||||||
|     vol.Required(CONF_PIN): vol.All(pins.internal_gpio_output_pin_schema, valid_pwm_pin), |     vol.Required(CONF_PIN): vol.All(pins.internal_gpio_output_pin_schema, valid_pwm_pin), | ||||||
| }).extend(output.FLOAT_OUTPUT_SCHEMA.schema) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -8,10 +8,10 @@ from esphomeyaml.helpers import App, Pvariable, gpio_output_pin_expression | |||||||
|  |  | ||||||
| GPIOBinaryOutputComponent = output.output_ns.GPIOBinaryOutputComponent | GPIOBinaryOutputComponent = output.output_ns.GPIOBinaryOutputComponent | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = output.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = output.BINARY_OUTPUT_PLATFORM_SCHEMA.extend({ | ||||||
|     vol.Required(CONF_ID): cv.declare_variable_id(GPIOBinaryOutputComponent), |     vol.Required(CONF_ID): cv.declare_variable_id(GPIOBinaryOutputComponent), | ||||||
|     vol.Required(CONF_PIN): pins.gpio_output_pin_schema, |     vol.Required(CONF_PIN): pins.gpio_output_pin_schema, | ||||||
| }).extend(output.BINARY_OUTPUT_SCHEMA.schema) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -21,13 +21,13 @@ def validate_frequency_bit_depth(obj): | |||||||
|  |  | ||||||
| LEDCOutputComponent = output.output_ns.LEDCOutputComponent | LEDCOutputComponent = output.output_ns.LEDCOutputComponent | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = vol.All(output.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = vol.All(output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ | ||||||
|     vol.Required(CONF_ID): cv.declare_variable_id(LEDCOutputComponent), |     vol.Required(CONF_ID): cv.declare_variable_id(LEDCOutputComponent), | ||||||
|     vol.Required(CONF_PIN): pins.output_pin, |     vol.Required(CONF_PIN): pins.output_pin, | ||||||
|     vol.Optional(CONF_FREQUENCY): cv.frequency, |     vol.Optional(CONF_FREQUENCY): cv.frequency, | ||||||
|     vol.Optional(CONF_BIT_DEPTH): vol.All(vol.Coerce(int), vol.Range(min=1, max=15)), |     vol.Optional(CONF_BIT_DEPTH): vol.All(vol.Coerce(int), vol.Range(min=1, max=15)), | ||||||
|     vol.Optional(CONF_CHANNEL): vol.All(vol.Coerce(int), vol.Range(min=0, max=15)) |     vol.Optional(CONF_CHANNEL): vol.All(vol.Coerce(int), vol.Range(min=0, max=15)) | ||||||
| }).extend(output.FLOAT_OUTPUT_SCHEMA.schema), validate_frequency_bit_depth) | }), validate_frequency_bit_depth) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -10,12 +10,12 @@ DEPENDENCIES = ['pca9685'] | |||||||
|  |  | ||||||
| Channel = PCA9685OutputComponent.Channel | Channel = PCA9685OutputComponent.Channel | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = output.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = output.FLOAT_OUTPUT_PLATFORM_SCHEMA.extend({ | ||||||
|     vol.Required(CONF_ID): cv.declare_variable_id(Channel), |     vol.Required(CONF_ID): cv.declare_variable_id(Channel), | ||||||
|     vol.Required(CONF_CHANNEL): vol.All(vol.Coerce(int), |     vol.Required(CONF_CHANNEL): vol.All(vol.Coerce(int), | ||||||
|                                         vol.Range(min=0, max=15)), |                                         vol.Range(min=0, max=15)), | ||||||
|     cv.GenerateID(CONF_PCA9685_ID): cv.use_variable_id(PCA9685OutputComponent), |     cv.GenerateID(CONF_PCA9685_ID): cv.use_variable_id(PCA9685OutputComponent), | ||||||
| }).extend(output.FLOAT_OUTPUT_SCHEMA.schema) | }) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
							
								
								
									
										51
									
								
								esphomeyaml/components/remote_receiver.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								esphomeyaml/components/remote_receiver.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | |||||||
|  | import voluptuous as vol | ||||||
|  |  | ||||||
|  | import esphomeyaml.config_validation as cv | ||||||
|  | from esphomeyaml import pins | ||||||
|  | from esphomeyaml.const import CONF_DUMP, CONF_ID, CONF_PIN, CONF_TOLERANCE, CONF_BUFFER_SIZE, \ | ||||||
|  |     CONF_FILTER, CONF_IDLE | ||||||
|  | from esphomeyaml.helpers import App, Pvariable, esphomelib_ns, gpio_input_pin_expression, add | ||||||
|  |  | ||||||
|  | remote_ns = esphomelib_ns.namespace('remote') | ||||||
|  |  | ||||||
|  | RemoteReceiverComponent = remote_ns.RemoteReceiverComponent | ||||||
|  |  | ||||||
|  | DUMPERS = { | ||||||
|  |     'lg': remote_ns.LGDumper, | ||||||
|  |     'nec': remote_ns.NECDumper, | ||||||
|  |     'panasonic': remote_ns.PanasonicDumper, | ||||||
|  |     'raw': remote_ns.RawDumper, | ||||||
|  |     'sony': remote_ns.SonyDumper, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({ | ||||||
|  |     cv.GenerateID(): cv.declare_variable_id(RemoteReceiverComponent), | ||||||
|  |     vol.Required(CONF_PIN): pins.gpio_input_pin_schema, | ||||||
|  |     vol.Optional(CONF_DUMP, default=[]): vol.All(vol.Lower, cv.one_of(*DUMPERS)), | ||||||
|  |     vol.Optional(CONF_TOLERANCE): vol.All(cv.percentage_int, vol.Range(min=0)), | ||||||
|  |     vol.Optional(CONF_BUFFER_SIZE): cv.validate_bytes, | ||||||
|  |     vol.Optional(CONF_FILTER): cv.positive_time_period_microseconds, | ||||||
|  |     vol.Optional(CONF_IDLE): cv.positive_time_period_microseconds, | ||||||
|  | })]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def to_code(config): | ||||||
|  |     for conf in config: | ||||||
|  |         pin = None | ||||||
|  |         for pin in gpio_input_pin_expression(conf[CONF_PIN]): | ||||||
|  |             yield | ||||||
|  |         rhs = App.make_remote_receiver_component(pin) | ||||||
|  |         receiver = Pvariable(conf[CONF_ID], rhs) | ||||||
|  |         for dumper in conf[CONF_DUMP]: | ||||||
|  |             add(receiver.add_dumper(DUMPERS[dumper].new())) | ||||||
|  |         if CONF_TOLERANCE in conf: | ||||||
|  |             add(receiver.set_tolerance(conf[CONF_TOLERANCE])) | ||||||
|  |         if CONF_BUFFER_SIZE in conf: | ||||||
|  |             add(receiver.set_buffer_size(conf[CONF_BUFFER_SIZE])) | ||||||
|  |         if CONF_FILTER in conf: | ||||||
|  |             add(receiver.set_filter_us(conf[CONF_FILTER])) | ||||||
|  |         if CONF_IDLE in conf: | ||||||
|  |             add(receiver.set_idle_us(conf[CONF_IDLE])) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | BUILD_FLAGS = '-DUSE_REMOTE_RECEIVER' | ||||||
							
								
								
									
										31
									
								
								esphomeyaml/components/remote_transmitter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								esphomeyaml/components/remote_transmitter.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | |||||||
|  | import voluptuous as vol | ||||||
|  |  | ||||||
|  | import esphomeyaml.config_validation as cv | ||||||
|  | from esphomeyaml import pins | ||||||
|  | from esphomeyaml.const import CONF_CARRIER_DUTY_PERCENT, CONF_ID, CONF_PIN | ||||||
|  | from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, gpio_output_pin_expression | ||||||
|  |  | ||||||
|  | remote_ns = esphomelib_ns.namespace('remote') | ||||||
|  |  | ||||||
|  | RemoteTransmitterComponent = remote_ns.RemoteTransmitterComponent | ||||||
|  |  | ||||||
|  | CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({ | ||||||
|  |     cv.GenerateID(): cv.declare_variable_id(RemoteTransmitterComponent), | ||||||
|  |     vol.Required(CONF_PIN): pins.gpio_output_pin_schema, | ||||||
|  |     vol.Optional(CONF_CARRIER_DUTY_PERCENT): vol.All(vol.Coerce(int), | ||||||
|  |                                                      vol.Range(min=1, max=100)), | ||||||
|  | })]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def to_code(config): | ||||||
|  |     for conf in config: | ||||||
|  |         pin = None | ||||||
|  |         for pin in gpio_output_pin_expression(conf[CONF_PIN]): | ||||||
|  |             yield | ||||||
|  |         rhs = App.make_remote_transmitter_component(pin) | ||||||
|  |         transmitter = Pvariable(conf[CONF_ID], rhs) | ||||||
|  |         if CONF_CARRIER_DUTY_PERCENT in conf: | ||||||
|  |             add(transmitter.set_carrier_duty_percent(conf[CONF_CARRIER_DUTY_PERCENT])) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | BUILD_FLAGS = '-DUSE_REMOTE_TRANSMITTER' | ||||||
| @@ -5,9 +5,10 @@ from esphomeyaml import automation | |||||||
| from esphomeyaml.const import CONF_ABOVE, CONF_ACCURACY_DECIMALS, CONF_ALPHA, CONF_BELOW, \ | from esphomeyaml.const import CONF_ABOVE, CONF_ACCURACY_DECIMALS, CONF_ALPHA, CONF_BELOW, \ | ||||||
|     CONF_DEBOUNCE, CONF_DELTA, CONF_EXPIRE_AFTER, CONF_EXPONENTIAL_MOVING_AVERAGE, CONF_FILTERS, \ |     CONF_DEBOUNCE, CONF_DELTA, CONF_EXPIRE_AFTER, CONF_EXPONENTIAL_MOVING_AVERAGE, CONF_FILTERS, \ | ||||||
|     CONF_FILTER_NAN, CONF_FILTER_OUT, CONF_HEARTBEAT, CONF_ICON, CONF_ID, CONF_LAMBDA, \ |     CONF_FILTER_NAN, CONF_FILTER_OUT, CONF_HEARTBEAT, CONF_ICON, CONF_ID, CONF_LAMBDA, \ | ||||||
|     CONF_MQTT_ID, CONF_MULTIPLY, CONF_NAME, CONF_OFFSET, CONF_ON_RAW_VALUE, CONF_ON_VALUE,\ |     CONF_MQTT_ID, CONF_MULTIPLY, CONF_NAME, CONF_OFFSET, CONF_ON_RAW_VALUE, CONF_ON_VALUE, \ | ||||||
|     CONF_ON_VALUE_RANGE, CONF_OR, CONF_SEND_EVERY, CONF_SLIDING_WINDOW_MOVING_AVERAGE, \ |     CONF_ON_VALUE_RANGE, CONF_OR, CONF_SEND_EVERY, CONF_SLIDING_WINDOW_MOVING_AVERAGE, \ | ||||||
|     CONF_THROTTLE, CONF_TRIGGER_ID, CONF_UNIQUE, CONF_UNIT_OF_MEASUREMENT, CONF_WINDOW_SIZE |     CONF_THROTTLE, CONF_TRIGGER_ID, CONF_UNIQUE, CONF_UNIT_OF_MEASUREMENT, CONF_WINDOW_SIZE, \ | ||||||
|  |     CONF_INTERNAL | ||||||
| from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, add, esphomelib_ns, float_, \ | from esphomeyaml.helpers import App, ArrayInitializer, Pvariable, add, esphomelib_ns, float_, \ | ||||||
|     process_lambda, setup_mqtt_component, templatable, add_job |     process_lambda, setup_mqtt_component, templatable, add_job | ||||||
|  |  | ||||||
| @@ -91,6 +92,8 @@ SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ | |||||||
|         }), cv.has_at_least_one_key(CONF_ABOVE, CONF_BELOW))]), |         }), cv.has_at_least_one_key(CONF_ABOVE, CONF_BELOW))]), | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | SENSOR_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(SENSOR_SCHEMA.schema) | ||||||
|  |  | ||||||
|  |  | ||||||
| def setup_filter(config): | def setup_filter(config): | ||||||
|     if CONF_OFFSET in config: |     if CONF_OFFSET in config: | ||||||
| @@ -140,6 +143,8 @@ def setup_filters(config): | |||||||
|  |  | ||||||
|  |  | ||||||
| def setup_sensor_core_(sensor_var, mqtt_var, config): | def setup_sensor_core_(sensor_var, mqtt_var, config): | ||||||
|  |     if CONF_INTERNAL in config: | ||||||
|  |         add(sensor_var.set_internal(config[CONF_INTERNAL])) | ||||||
|     if CONF_UNIT_OF_MEASUREMENT in config: |     if CONF_UNIT_OF_MEASUREMENT in config: | ||||||
|         add(sensor_var.set_unit_of_measurement(config[CONF_UNIT_OF_MEASUREMENT])) |         add(sensor_var.set_unit_of_measurement(config[CONF_UNIT_OF_MEASUREMENT])) | ||||||
|     if CONF_ICON in config: |     if CONF_ICON in config: | ||||||
|   | |||||||
| @@ -24,12 +24,12 @@ def validate_adc_pin(value): | |||||||
|  |  | ||||||
| MakeADCSensor = Application.MakeADCSensor | MakeADCSensor = Application.MakeADCSensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeADCSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeADCSensor), | ||||||
|     vol.Required(CONF_PIN): validate_adc_pin, |     vol.Required(CONF_PIN): validate_adc_pin, | ||||||
|     vol.Optional(CONF_ATTENUATION): vol.All(cv.only_on_esp32, cv.one_of(*ATTENUATION_MODES)), |     vol.Optional(CONF_ATTENUATION): vol.All(cv.only_on_esp32, cv.one_of(*ATTENUATION_MODES)), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -45,12 +45,12 @@ def validate_mux(value): | |||||||
|     return cv.one_of(*MUX)(value) |     return cv.one_of(*MUX)(value) | ||||||
|  |  | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     vol.Required(CONF_MULTIPLEXER): validate_mux, |     vol.Required(CONF_MULTIPLEXER): validate_mux, | ||||||
|     vol.Required(CONF_GAIN): validate_gain, |     vol.Required(CONF_GAIN): validate_gain, | ||||||
|     cv.GenerateID(CONF_ADS1115_ID): cv.use_variable_id(ADS1115Component), |     cv.GenerateID(CONF_ADS1115_ID): cv.use_variable_id(ADS1115Component), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -16,12 +16,12 @@ BH1750_RESOLUTIONS = { | |||||||
|  |  | ||||||
| MakeBH1750Sensor = Application.MakeBH1750Sensor | MakeBH1750Sensor = Application.MakeBH1750Sensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBH1750Sensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBH1750Sensor), | ||||||
|     vol.Optional(CONF_ADDRESS, default=0x23): cv.i2c_address, |     vol.Optional(CONF_ADDRESS, default=0x23): cv.i2c_address, | ||||||
|     vol.Optional(CONF_RESOLUTION): vol.All(cv.positive_float, cv.one_of(*BH1750_RESOLUTIONS)), |     vol.Optional(CONF_RESOLUTION): vol.All(cv.positive_float, cv.one_of(*BH1750_RESOLUTIONS)), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -34,9 +34,9 @@ MakeBME280Sensor = Application.MakeBME280Sensor | |||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME280Sensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME280Sensor), | ||||||
|     vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address, |     vol.Optional(CONF_ADDRESS, default=0x77): cv.i2c_address, | ||||||
|     vol.Required(CONF_TEMPERATURE): BME280_OVERSAMPLING_SENSOR_SCHEMA, |     vol.Required(CONF_TEMPERATURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_PRESSURE): BME280_OVERSAMPLING_SENSOR_SCHEMA, |     vol.Required(CONF_PRESSURE): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_HUMIDITY): BME280_OVERSAMPLING_SENSOR_SCHEMA, |     vol.Required(CONF_HUMIDITY): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), |     vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }) | }) | ||||||
|   | |||||||
| @@ -38,10 +38,10 @@ MakeBME680Sensor = Application.MakeBME680Sensor | |||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME680Sensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBME680Sensor), | ||||||
|     vol.Optional(CONF_ADDRESS, default=0x76): cv.i2c_address, |     vol.Optional(CONF_ADDRESS, default=0x76): cv.i2c_address, | ||||||
|     vol.Required(CONF_TEMPERATURE): BME680_OVERSAMPLING_SENSOR_SCHEMA, |     vol.Required(CONF_TEMPERATURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_PRESSURE): BME680_OVERSAMPLING_SENSOR_SCHEMA, |     vol.Required(CONF_PRESSURE): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_HUMIDITY): BME680_OVERSAMPLING_SENSOR_SCHEMA, |     vol.Required(CONF_HUMIDITY): cv.nameable(BME680_OVERSAMPLING_SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_GAS_RESISTANCE): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_GAS_RESISTANCE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), |     vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), | ||||||
|     # TODO: Heater |     # TODO: Heater | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
|   | |||||||
| @@ -12,8 +12,8 @@ MakeBMP085Sensor = Application.MakeBMP085Sensor | |||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP085Sensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeBMP085Sensor), | ||||||
|     vol.Required(CONF_TEMPERATURE): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_PRESSURE): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_PRESSURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_ADDRESS): cv.i2c_address, |     vol.Optional(CONF_ADDRESS): cv.i2c_address, | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }) | }) | ||||||
|   | |||||||
| @@ -7,12 +7,12 @@ from esphomeyaml.const import CONF_ADDRESS, CONF_DALLAS_ID, CONF_INDEX, CONF_NAM | |||||||
|     CONF_RESOLUTION |     CONF_RESOLUTION | ||||||
| from esphomeyaml.helpers import HexIntLiteral, get_variable | from esphomeyaml.helpers import HexIntLiteral, get_variable | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     vol.Exclusive(CONF_ADDRESS, 'dallas'): cv.hex_int, |     vol.Exclusive(CONF_ADDRESS, 'dallas'): cv.hex_int, | ||||||
|     vol.Exclusive(CONF_INDEX, 'dallas'): cv.positive_int, |     vol.Exclusive(CONF_INDEX, 'dallas'): cv.positive_int, | ||||||
|     cv.GenerateID(CONF_DALLAS_ID): cv.use_variable_id(DallasComponent), |     cv.GenerateID(CONF_DALLAS_ID): cv.use_variable_id(DallasComponent), | ||||||
|     vol.Optional(CONF_RESOLUTION): vol.All(vol.Coerce(int), vol.Range(min=9, max=12)), |     vol.Optional(CONF_RESOLUTION): vol.All(vol.Coerce(int), vol.Range(min=9, max=12)), | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema), cv.has_at_least_one_key(CONF_ADDRESS, CONF_INDEX)) | }), cv.has_at_least_one_key(CONF_ADDRESS, CONF_INDEX)) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -20,8 +20,8 @@ MakeDHTSensor = Application.MakeDHTSensor | |||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHTSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHTSensor), | ||||||
|     vol.Required(CONF_PIN): gpio_output_pin_schema, |     vol.Required(CONF_PIN): gpio_output_pin_schema, | ||||||
|     vol.Required(CONF_TEMPERATURE): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_HUMIDITY): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_MODEL): vol.All(vol.Upper, cv.one_of(*DHT_MODELS)), |     vol.Optional(CONF_MODEL): vol.All(vol.Upper, cv.one_of(*DHT_MODELS)), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }) | }) | ||||||
|   | |||||||
| @@ -12,8 +12,8 @@ MakeDHT12Sensor = Application.MakeDHT12Sensor | |||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHT12Sensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDHT12Sensor), | ||||||
|     vol.Required(CONF_TEMPERATURE): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_HUMIDITY): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								esphomeyaml/components/sensor/duty_cycle.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								esphomeyaml/components/sensor/duty_cycle.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | import voluptuous as vol | ||||||
|  |  | ||||||
|  | import esphomeyaml.config_validation as cv | ||||||
|  | from esphomeyaml import pins | ||||||
|  | from esphomeyaml.components import sensor | ||||||
|  | from esphomeyaml.const import CONF_MAKE_ID, CONF_NAME, CONF_PIN, CONF_UPDATE_INTERVAL | ||||||
|  | from esphomeyaml.helpers import App, Application, gpio_input_pin_expression, variable | ||||||
|  |  | ||||||
|  | MakeDutyCycleSensor = Application.MakeDutyCycleSensor | ||||||
|  |  | ||||||
|  | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|  |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeDutyCycleSensor), | ||||||
|  |     vol.Required(CONF_PIN): pins.internal_gpio_input_pin_schema, | ||||||
|  |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
|  | })) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def to_code(config): | ||||||
|  |     pin = None | ||||||
|  |     for pin in gpio_input_pin_expression(config[CONF_PIN]): | ||||||
|  |         yield | ||||||
|  |     rhs = App.make_duty_cycle_sensor(config[CONF_NAME], pin, | ||||||
|  |                                      config.get(CONF_UPDATE_INTERVAL)) | ||||||
|  |     make = variable(config[CONF_MAKE_ID], rhs) | ||||||
|  |     sensor.setup_sensor(make.Pduty, make.Pmqtt, config) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | BUILD_FLAGS = '-DUSE_DUTY_CYCLE_SENSOR' | ||||||
| @@ -9,10 +9,10 @@ ESP_PLATFORMS = [ESP_PLATFORM_ESP32] | |||||||
|  |  | ||||||
| MakeESP32HallSensor = Application.MakeESP32HallSensor | MakeESP32HallSensor = Application.MakeESP32HallSensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeESP32HallSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeESP32HallSensor), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -12,8 +12,8 @@ MakeHDC1080Sensor = Application.MakeHDC1080Sensor | |||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHDC1080Sensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHDC1080Sensor), | ||||||
|     vol.Required(CONF_TEMPERATURE): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_HUMIDITY): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -12,8 +12,8 @@ MakeHTU21DSensor = Application.MakeHTU21DSensor | |||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHTU21DSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHTU21DSensor), | ||||||
|     vol.Required(CONF_TEMPERATURE): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_HUMIDITY): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,13 +10,13 @@ from esphomeyaml.helpers import App, Application, gpio_input_pin_expression, \ | |||||||
|  |  | ||||||
| MakeMAX6675Sensor = Application.MakeMAX6675Sensor | MakeMAX6675Sensor = Application.MakeMAX6675Sensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMAX6675Sensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeMAX6675Sensor), | ||||||
|     vol.Required(CONF_PIN_CS): pins.gpio_output_pin_schema, |     vol.Required(CONF_PIN_CS): pins.gpio_output_pin_schema, | ||||||
|     vol.Required(CONF_PIN_CLOCK): pins.gpio_output_pin_schema, |     vol.Required(CONF_PIN_CLOCK): pins.gpio_output_pin_schema, | ||||||
|     vol.Required(CONF_PIN_MISO): pins.gpio_input_pin_schema, |     vol.Required(CONF_PIN_MISO): pins.gpio_input_pin_schema, | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -23,13 +23,13 @@ MPU6050TemperatureSensor = sensor.sensor_ns.MPU6050TemperatureSensor | |||||||
| PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(): cv.declare_variable_id(MPU6050Component), |     cv.GenerateID(): cv.declare_variable_id(MPU6050Component), | ||||||
|     vol.Optional(CONF_ADDRESS, default=0x68): cv.i2c_address, |     vol.Optional(CONF_ADDRESS, default=0x68): cv.i2c_address, | ||||||
|     vol.Optional(CONF_ACCEL_X): sensor.SENSOR_SCHEMA, |     vol.Optional(CONF_ACCEL_X): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_ACCEL_Y): sensor.SENSOR_SCHEMA, |     vol.Optional(CONF_ACCEL_Y): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_ACCEL_Z): sensor.SENSOR_SCHEMA, |     vol.Optional(CONF_ACCEL_Z): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_GYRO_X): sensor.SENSOR_SCHEMA, |     vol.Optional(CONF_GYRO_X): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_GYRO_Y): sensor.SENSOR_SCHEMA, |     vol.Optional(CONF_GYRO_Y): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_GYRO_Z): sensor.SENSOR_SCHEMA, |     vol.Optional(CONF_GYRO_Z): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_TEMPERATURE): sensor.SENSOR_SCHEMA, |     vol.Optional(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }), cv.has_at_least_one_key(CONF_ACCEL_X, CONF_ACCEL_Y, CONF_ACCEL_Z, | }), cv.has_at_least_one_key(CONF_ACCEL_X, CONF_ACCEL_Y, CONF_ACCEL_Z, | ||||||
|                             CONF_GYRO_X, CONF_GYRO_Y, CONF_GYRO_Z)) |                             CONF_GYRO_X, CONF_GYRO_Y, CONF_GYRO_Z)) | ||||||
|   | |||||||
| @@ -1,62 +1,66 @@ | |||||||
| import voluptuous as vol | import voluptuous as vol | ||||||
|  |  | ||||||
| import esphomeyaml.config_validation as cv | import esphomeyaml.config_validation as cv | ||||||
| from esphomeyaml import pins | from esphomeyaml import core, pins | ||||||
| from esphomeyaml.components import sensor | from esphomeyaml.components import sensor | ||||||
| from esphomeyaml.const import CONF_COUNT_MODE, CONF_FALLING_EDGE, CONF_INTERNAL_FILTER, \ | from esphomeyaml.const import CONF_COUNT_MODE, CONF_FALLING_EDGE, CONF_INTERNAL_FILTER, \ | ||||||
|     CONF_MAKE_ID, CONF_NAME, CONF_PIN, CONF_PULL_MODE, CONF_RISING_EDGE, CONF_UPDATE_INTERVAL, \ |     CONF_MAKE_ID, CONF_NAME, CONF_PIN, CONF_PULL_MODE, CONF_RISING_EDGE, CONF_UPDATE_INTERVAL, \ | ||||||
|     ESP_PLATFORM_ESP32 |     ESP_PLATFORM_ESP32 | ||||||
| from esphomeyaml.helpers import App, add, global_ns, variable, Application | from esphomeyaml.helpers import App, Application, add, variable, gpio_input_pin_expression | ||||||
|  |  | ||||||
| ESP_PLATFORMS = [ESP_PLATFORM_ESP32] |  | ||||||
|  |  | ||||||
| GPIO_PULL_MODES = { |  | ||||||
|     'PULLUP': global_ns.GPIO_PULLUP_ONLY, |  | ||||||
|     'PULLDOWN': global_ns.GPIO_PULLDOWN_ONLY, |  | ||||||
|     'PULLUP_PULLDOWN': global_ns.GPIO_PULLUP_PULLDOWN, |  | ||||||
|     'FLOATING': global_ns.GPIO_FLOATING, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| GPIO_PULL_MODE_SCHEMA = vol.All(vol.Upper, cv.one_of(*GPIO_PULL_MODES)) |  | ||||||
|  |  | ||||||
| COUNT_MODES = { | COUNT_MODES = { | ||||||
|     'DISABLE': global_ns.PCNT_COUNT_DIS, |     'DISABLE': sensor.sensor_ns.PULSE_COUNTER_DISABLE, | ||||||
|     'INCREMENT': global_ns.PCNT_COUNT_INC, |     'INCREMENT': sensor.sensor_ns.PULSE_COUNTER_INCREMENT, | ||||||
|     'DECREMENT': global_ns.PCNT_COUNT_DEC, |     'DECREMENT': sensor.sensor_ns.PULSE_COUNTER_DECREMENT, | ||||||
| } | } | ||||||
|  |  | ||||||
| COUNT_MODE_SCHEMA = vol.All(vol.Upper, cv.one_of(*COUNT_MODES)) | COUNT_MODE_SCHEMA = vol.All(vol.Upper, cv.one_of(*COUNT_MODES)) | ||||||
|  |  | ||||||
| MakePulseCounterSensor = Application.MakePulseCounterSensor | MakePulseCounterSensor = Application.MakePulseCounterSensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ |  | ||||||
|  | def validate_internal_filter(value): | ||||||
|  |     if core.ESP_PLATFORM == ESP_PLATFORM_ESP32: | ||||||
|  |         if isinstance(value, int): | ||||||
|  |             raise vol.Invalid("Please specify the internal filter in microseconds now " | ||||||
|  |                               "(since 1.7.0). For example '17ms'") | ||||||
|  |         value = cv.positive_time_period_microseconds(value) | ||||||
|  |         if value.total_microseconds > 13: | ||||||
|  |             raise vol.Invalid("Maximum internal filter value for ESP32 is 13us") | ||||||
|  |         return value | ||||||
|  |     else: | ||||||
|  |         return cv.positive_time_period_microseconds(value) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakePulseCounterSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakePulseCounterSensor), | ||||||
|     vol.Required(CONF_PIN): pins.input_pin, |     vol.Required(CONF_PIN): pins.internal_gpio_input_pin_schema, | ||||||
|     vol.Optional(CONF_PULL_MODE): GPIO_PULL_MODE_SCHEMA, |  | ||||||
|     vol.Optional(CONF_COUNT_MODE): vol.Schema({ |     vol.Optional(CONF_COUNT_MODE): vol.Schema({ | ||||||
|         vol.Required(CONF_RISING_EDGE): COUNT_MODE_SCHEMA, |         vol.Required(CONF_RISING_EDGE): COUNT_MODE_SCHEMA, | ||||||
|         vol.Required(CONF_FALLING_EDGE): COUNT_MODE_SCHEMA, |         vol.Required(CONF_FALLING_EDGE): COUNT_MODE_SCHEMA, | ||||||
|     }), |     }), | ||||||
|     vol.Optional(CONF_INTERNAL_FILTER): vol.All(vol.Coerce(int), vol.Range(min=0, max=1023)), |     vol.Optional(CONF_INTERNAL_FILTER): validate_internal_filter, | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) |  | ||||||
|  |     vol.Optional(CONF_PULL_MODE): cv.invalid("The pull_mode option has been removed in 1.7.0, " | ||||||
|  |                                              "please use the pin mode schema now.") | ||||||
|  | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|     rhs = App.make_pulse_counter_sensor(config[CONF_NAME], config[CONF_PIN], |     pin = None | ||||||
|  |     for pin in gpio_input_pin_expression(config[CONF_PIN]): | ||||||
|  |         yield | ||||||
|  |     rhs = App.make_pulse_counter_sensor(config[CONF_NAME], pin, | ||||||
|                                         config.get(CONF_UPDATE_INTERVAL)) |                                         config.get(CONF_UPDATE_INTERVAL)) | ||||||
|     make = variable(config[CONF_MAKE_ID], rhs) |     make = variable(config[CONF_MAKE_ID], rhs) | ||||||
|     pcnt = make.Ppcnt |     pcnt = make.Ppcnt | ||||||
|     if CONF_PULL_MODE in config: |  | ||||||
|         pull_mode = GPIO_PULL_MODES[config[CONF_PULL_MODE]] |  | ||||||
|         add(pcnt.set_pull_mode(pull_mode)) |  | ||||||
|     if CONF_COUNT_MODE in config: |     if CONF_COUNT_MODE in config: | ||||||
|         count_mode = config[CONF_COUNT_MODE] |         rising_edge = COUNT_MODES[config[CONF_COUNT_MODE][CONF_RISING_EDGE]] | ||||||
|         rising_edge = COUNT_MODES[count_mode[CONF_RISING_EDGE]] |         falling_edge = COUNT_MODES[config[CONF_COUNT_MODE][CONF_FALLING_EDGE]] | ||||||
|         falling_edge = COUNT_MODES[count_mode[CONF_FALLING_EDGE]] |  | ||||||
|         add(pcnt.set_edge_mode(rising_edge, falling_edge)) |         add(pcnt.set_edge_mode(rising_edge, falling_edge)) | ||||||
|     if CONF_INTERNAL_FILTER in config: |     if CONF_INTERNAL_FILTER in config: | ||||||
|         add(pcnt.set_filter(config[CONF_INTERNAL_FILTER])) |         add(pcnt.set_filter_us(config[CONF_INTERNAL_FILTER])) | ||||||
|     sensor.setup_sensor(make.Ppcnt, make.Pmqtt, config) |     sensor.setup_sensor(make.Ppcnt, make.Pmqtt, config) | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,13 +18,13 @@ CONF_PIN_RESET = 'pin_reset' | |||||||
|  |  | ||||||
| MakeRotaryEncoderSensor = Application.MakeRotaryEncoderSensor | MakeRotaryEncoderSensor = Application.MakeRotaryEncoderSensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeRotaryEncoderSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeRotaryEncoderSensor), | ||||||
|     vol.Required(CONF_PIN_A): pins.internal_gpio_input_pin_schema, |     vol.Required(CONF_PIN_A): pins.internal_gpio_input_pin_schema, | ||||||
|     vol.Required(CONF_PIN_B): pins.internal_gpio_input_pin_schema, |     vol.Required(CONF_PIN_B): pins.internal_gpio_input_pin_schema, | ||||||
|     vol.Optional(CONF_PIN_RESET): pins.internal_gpio_input_pin_schema, |     vol.Optional(CONF_PIN_RESET): pins.internal_gpio_input_pin_schema, | ||||||
|     vol.Optional(CONF_RESOLUTION): vol.All(cv.string, cv.one_of(*RESOLUTIONS)), |     vol.Optional(CONF_RESOLUTION): vol.All(cv.string, cv.one_of(*RESOLUTIONS)), | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -12,8 +12,8 @@ MakeSHT3XDSensor = Application.MakeSHT3XDSensor | |||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeSHT3XDSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeSHT3XDSensor), | ||||||
|     vol.Required(CONF_TEMPERATURE): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Required(CONF_HUMIDITY): sensor.SENSOR_SCHEMA, |     vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA), | ||||||
|     vol.Optional(CONF_ADDRESS, default=0x44): cv.i2c_address, |     vol.Optional(CONF_ADDRESS, default=0x44): cv.i2c_address, | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,11 +7,11 @@ from esphomeyaml.helpers import App, process_lambda, variable, Application, floa | |||||||
|  |  | ||||||
| MakeTemplateSensor = Application.MakeTemplateSensor | MakeTemplateSensor = Application.MakeTemplateSensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateSensor), | ||||||
|     vol.Required(CONF_LAMBDA): cv.lambda_, |     vol.Required(CONF_LAMBDA): cv.lambda_, | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -30,14 +30,14 @@ def validate_integration_time(value): | |||||||
|  |  | ||||||
| MakeTSL2561Sensor = Application.MakeTSL2561Sensor | MakeTSL2561Sensor = Application.MakeTSL2561Sensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTSL2561Sensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTSL2561Sensor), | ||||||
|     vol.Optional(CONF_ADDRESS, default=0x39): cv.i2c_address, |     vol.Optional(CONF_ADDRESS, default=0x39): cv.i2c_address, | ||||||
|     vol.Optional(CONF_INTEGRATION_TIME): validate_integration_time, |     vol.Optional(CONF_INTEGRATION_TIME): validate_integration_time, | ||||||
|     vol.Optional(CONF_GAIN): vol.All(vol.Upper, cv.one_of(*GAINS)), |     vol.Optional(CONF_GAIN): vol.All(vol.Upper, cv.one_of(*GAINS)), | ||||||
|     vol.Optional(CONF_IS_CS_PACKAGE): cv.boolean, |     vol.Optional(CONF_IS_CS_PACKAGE): cv.boolean, | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -10,14 +10,14 @@ from esphomeyaml.helpers import App, Application, add, gpio_input_pin_expression | |||||||
|  |  | ||||||
| MakeUltrasonicSensor = Application.MakeUltrasonicSensor | MakeUltrasonicSensor = Application.MakeUltrasonicSensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeUltrasonicSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeUltrasonicSensor), | ||||||
|     vol.Required(CONF_TRIGGER_PIN): pins.gpio_output_pin_schema, |     vol.Required(CONF_TRIGGER_PIN): pins.gpio_output_pin_schema, | ||||||
|     vol.Required(CONF_ECHO_PIN): pins.internal_gpio_input_pin_schema, |     vol.Required(CONF_ECHO_PIN): pins.internal_gpio_input_pin_schema, | ||||||
|     vol.Exclusive(CONF_TIMEOUT_METER, 'timeout'): cv.positive_float, |     vol.Exclusive(CONF_TIMEOUT_METER, 'timeout'): cv.positive_float, | ||||||
|     vol.Exclusive(CONF_TIMEOUT_TIME, 'timeout'): cv.positive_time_period_microseconds, |     vol.Exclusive(CONF_TIMEOUT_TIME, 'timeout'): cv.positive_time_period_microseconds, | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ from esphomeyaml.helpers import App, Application, variable | |||||||
|  |  | ||||||
| MakeWiFiSignalSensor = Application.MakeWiFiSignalSensor | MakeWiFiSignalSensor = Application.MakeWiFiSignalSensor | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeWiFiSignalSensor), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeWiFiSignalSensor), | ||||||
|     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, |     vol.Optional(CONF_UPDATE_INTERVAL): cv.positive_time_period_milliseconds, | ||||||
| }).extend(sensor.SENSOR_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| import voluptuous as vol | import voluptuous as vol | ||||||
|  |  | ||||||
| import esphomeyaml.config_validation as cv | import esphomeyaml.config_validation as cv | ||||||
| from esphomeyaml.const import CONF_ICON, CONF_ID, CONF_INVERTED, CONF_MQTT_ID | from esphomeyaml.const import CONF_ICON, CONF_ID, CONF_INVERTED, CONF_MQTT_ID, CONF_INTERNAL | ||||||
| from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, setup_mqtt_component | from esphomeyaml.helpers import App, Pvariable, add, esphomelib_ns, setup_mqtt_component | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ | ||||||
| @@ -22,8 +22,12 @@ SWITCH_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend({ | |||||||
|     vol.Optional(CONF_INVERTED): cv.boolean, |     vol.Optional(CONF_INVERTED): cv.boolean, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | SWITCH_PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(SWITCH_SCHEMA.schema) | ||||||
|  |  | ||||||
|  |  | ||||||
| def setup_switch_core_(switch_var, mqtt_var, config): | def setup_switch_core_(switch_var, mqtt_var, config): | ||||||
|  |     if CONF_INTERNAL in config: | ||||||
|  |         add(switch_var.set_internal(config[CONF_INTERNAL])) | ||||||
|     if CONF_ICON in config: |     if CONF_ICON in config: | ||||||
|         add(switch_var.set_icon(config[CONF_ICON])) |         add(switch_var.set_icon(config[CONF_ICON])) | ||||||
|     if CONF_INVERTED in config: |     if CONF_INVERTED in config: | ||||||
|   | |||||||
| @@ -8,10 +8,10 @@ from esphomeyaml.helpers import App, Application, gpio_output_pin_expression, va | |||||||
|  |  | ||||||
| MakeGPIOSwitch = Application.MakeGPIOSwitch | MakeGPIOSwitch = Application.MakeGPIOSwitch | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = switch.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeGPIOSwitch), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeGPIOSwitch), | ||||||
|     vol.Required(CONF_PIN): pins.gpio_output_pin_schema, |     vol.Required(CONF_PIN): pins.gpio_output_pin_schema, | ||||||
| }).extend(switch.SWITCH_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -1,104 +0,0 @@ | |||||||
| import voluptuous as vol |  | ||||||
|  |  | ||||||
| import esphomeyaml.config_validation as cv |  | ||||||
| from esphomeyaml.components import switch |  | ||||||
| from esphomeyaml.components.ir_transmitter import IRTransmitterComponent |  | ||||||
| from esphomeyaml.const import CONF_ADDRESS, CONF_CARRIER_FREQUENCY, CONF_COMMAND, CONF_DATA, \ |  | ||||||
|     CONF_INVERTED, CONF_IR_TRANSMITTER_ID, CONF_LG, CONF_NAME, CONF_NBITS, CONF_NEC, \ |  | ||||||
|     CONF_PANASONIC, CONF_RAW, CONF_REPEAT, CONF_SONY, CONF_TIMES, CONF_WAIT_TIME |  | ||||||
| from esphomeyaml.core import ESPHomeYAMLError |  | ||||||
| from esphomeyaml.helpers import App, ArrayInitializer, HexIntLiteral, get_variable |  | ||||||
|  |  | ||||||
| DEPENDENCIES = ['ir_transmitter'] |  | ||||||
|  |  | ||||||
| IR_KEYS = [CONF_NEC, CONF_LG, CONF_SONY, CONF_PANASONIC, CONF_RAW] |  | ||||||
|  |  | ||||||
| WAIT_TIME_MESSAGE = "The wait_time_us option has been renamed to wait_time in order to decrease " \ |  | ||||||
|                     "ambiguity. " |  | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = vol.All(switch.PLATFORM_SCHEMA.extend({ |  | ||||||
|     vol.Exclusive(CONF_NEC, 'code'): vol.Schema({ |  | ||||||
|         vol.Required(CONF_ADDRESS): cv.hex_uint16_t, |  | ||||||
|         vol.Required(CONF_COMMAND): cv.hex_uint16_t, |  | ||||||
|     }), |  | ||||||
|     vol.Exclusive(CONF_LG, 'code'): vol.Schema({ |  | ||||||
|         vol.Required(CONF_DATA): cv.hex_uint32_t, |  | ||||||
|         vol.Optional(CONF_NBITS, default=28): vol.All(vol.Coerce(int), vol.Range(min=0, max=32)), |  | ||||||
|     }), |  | ||||||
|     vol.Exclusive(CONF_SONY, 'code'): vol.Schema({ |  | ||||||
|         vol.Required(CONF_DATA): cv.hex_uint32_t, |  | ||||||
|         vol.Optional(CONF_NBITS, default=12): vol.All(vol.Coerce(int), vol.Range(min=0, max=32)), |  | ||||||
|     }), |  | ||||||
|     vol.Exclusive(CONF_PANASONIC, 'code'): vol.Schema({ |  | ||||||
|         vol.Required(CONF_ADDRESS): cv.hex_uint16_t, |  | ||||||
|         vol.Required(CONF_COMMAND): cv.hex_uint32_t, |  | ||||||
|     }), |  | ||||||
|     vol.Exclusive(CONF_RAW, 'code'): vol.Schema({ |  | ||||||
|         vol.Required(CONF_CARRIER_FREQUENCY): vol.All(cv.frequency, vol.Coerce(int)), |  | ||||||
|         vol.Required(CONF_DATA): [vol.Coerce(int)], |  | ||||||
|     }), |  | ||||||
|     vol.Optional(CONF_REPEAT): vol.Any(cv.positive_not_null_int, vol.Schema({ |  | ||||||
|         vol.Required(CONF_TIMES): cv.positive_not_null_int, |  | ||||||
|         vol.Required(CONF_WAIT_TIME): cv.positive_time_period_microseconds, |  | ||||||
|  |  | ||||||
|         vol.Optional('wait_time_us'): cv.invalid(WAIT_TIME_MESSAGE), |  | ||||||
|     })), |  | ||||||
|     cv.GenerateID(CONF_IR_TRANSMITTER_ID): cv.use_variable_id(IRTransmitterComponent), |  | ||||||
|     vol.Optional(CONF_INVERTED): cv.invalid("IR Transmitters do not support inverted mode!"), |  | ||||||
| }).extend(switch.SWITCH_SCHEMA.schema), cv.has_at_least_one_key(*IR_KEYS)) |  | ||||||
|  |  | ||||||
| # pylint: disable=invalid-name |  | ||||||
| ir_ns = switch.switch_ns.namespace('ir') |  | ||||||
| SendData = ir_ns.namespace('SendData') |  | ||||||
| DataTransmitter = IRTransmitterComponent.DataTransmitter |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def safe_hex(value): |  | ||||||
|     if value is None: |  | ||||||
|         return None |  | ||||||
|     return HexIntLiteral(value) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def exp_send_data(config): |  | ||||||
|     if CONF_NEC in config: |  | ||||||
|         conf = config[CONF_NEC] |  | ||||||
|         base = SendData.from_nec(safe_hex(conf[CONF_ADDRESS]), |  | ||||||
|                                  safe_hex(conf[CONF_COMMAND])) |  | ||||||
|     elif CONF_LG in config: |  | ||||||
|         conf = config[CONF_LG] |  | ||||||
|         base = SendData.from_lg(safe_hex(conf[CONF_DATA]), conf.get(CONF_NBITS)) |  | ||||||
|     elif CONF_SONY in config: |  | ||||||
|         conf = config[CONF_SONY] |  | ||||||
|         base = SendData.from_sony(safe_hex(conf[CONF_DATA]), conf.get(CONF_NBITS)) |  | ||||||
|     elif CONF_PANASONIC in config: |  | ||||||
|         conf = config[CONF_PANASONIC] |  | ||||||
|         base = SendData.from_panasonic(safe_hex(conf[CONF_ADDRESS]), |  | ||||||
|                                        safe_hex(conf[CONF_COMMAND])) |  | ||||||
|     elif CONF_RAW in config: |  | ||||||
|         conf = config[CONF_RAW] |  | ||||||
|         data = ArrayInitializer(*conf[CONF_DATA]) |  | ||||||
|         base = SendData.from_raw(data, conf[CONF_CARRIER_FREQUENCY]) |  | ||||||
|     else: |  | ||||||
|         raise ESPHomeYAMLError(u"Unsupported IR mode {}".format(config)) |  | ||||||
|  |  | ||||||
|     if CONF_REPEAT in config: |  | ||||||
|         if isinstance(config[CONF_REPEAT], int): |  | ||||||
|             times = config[CONF_REPEAT] |  | ||||||
|             wait_us = None |  | ||||||
|         else: |  | ||||||
|             times = config[CONF_REPEAT][CONF_TIMES] |  | ||||||
|             wait_us = config[CONF_REPEAT][CONF_WAIT_TIME] |  | ||||||
|         base = base.repeat(times, wait_us) |  | ||||||
|     return base |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): |  | ||||||
|     ir = None |  | ||||||
|     for ir in get_variable(config[CONF_IR_TRANSMITTER_ID]): |  | ||||||
|         yield |  | ||||||
|     send_data = exp_send_data(config) |  | ||||||
|     rhs = App.register_component(ir.create_transmitter(config[CONF_NAME], send_data)) |  | ||||||
|     switch.register_switch(rhs, config) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| BUILD_FLAGS = '-DUSE_IR_TRANSMITTER' |  | ||||||
| @@ -7,10 +7,10 @@ from esphomeyaml.helpers import App, Application, get_variable, variable | |||||||
|  |  | ||||||
| MakeSimpleSwitch = Application.MakeSimpleSwitch | MakeSimpleSwitch = Application.MakeSimpleSwitch | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = switch.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeSimpleSwitch), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeSimpleSwitch), | ||||||
|     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), |     vol.Required(CONF_OUTPUT): cv.use_variable_id(None), | ||||||
| }).extend(switch.SWITCH_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
							
								
								
									
										98
									
								
								esphomeyaml/components/switch/remote_transmitter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								esphomeyaml/components/switch/remote_transmitter.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | |||||||
|  | import voluptuous as vol | ||||||
|  |  | ||||||
|  | import esphomeyaml.config_validation as cv | ||||||
|  | from esphomeyaml.components import switch | ||||||
|  | from esphomeyaml.components.remote_transmitter import RemoteTransmitterComponent, remote_ns | ||||||
|  | from esphomeyaml.const import CONF_ADDRESS, CONF_CARRIER_FREQUENCY, CONF_COMMAND, CONF_DATA, \ | ||||||
|  |     CONF_INVERTED, CONF_LG, CONF_NAME, CONF_NBITS, CONF_NEC, \ | ||||||
|  |     CONF_PANASONIC, CONF_RAW, CONF_REPEAT, CONF_SONY, CONF_TIMES, CONF_WAIT_TIME | ||||||
|  | from esphomeyaml.core import ESPHomeYAMLError | ||||||
|  | from esphomeyaml.helpers import App, ArrayInitializer, HexIntLiteral, get_variable, Pvariable, add | ||||||
|  |  | ||||||
|  | DEPENDENCIES = ['remote_transmitter'] | ||||||
|  |  | ||||||
|  | IR_KEYS = [CONF_NEC, CONF_LG, CONF_SONY, CONF_PANASONIC, CONF_RAW] | ||||||
|  |  | ||||||
|  | CONF_REMOTE_TRANSMITTER_ID = 'remote_transmitter_id' | ||||||
|  | CONF_TRANSMITTER_ID = 'transmitter_id' | ||||||
|  |  | ||||||
|  | RemoteTransmitter = remote_ns.RemoteTransmitter | ||||||
|  | LGTransmitter = remote_ns.LGTransmitter | ||||||
|  | NECTransmitter = remote_ns.NECTransmitter | ||||||
|  | PanasonicTransmitter = remote_ns.PanasonicTransmitter | ||||||
|  | RawTransmitter = remote_ns.RawTransmitter | ||||||
|  | SonyTransmitter = remote_ns.SonyTransmitter | ||||||
|  |  | ||||||
|  | PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ | ||||||
|  |     vol.Optional(CONF_LG): vol.Schema({ | ||||||
|  |         vol.Required(CONF_DATA): cv.hex_uint32_t, | ||||||
|  |         vol.Optional(CONF_NBITS, default=28): vol.All(vol.Coerce(int), cv.one_of(28, 32)), | ||||||
|  |     }), | ||||||
|  |     vol.Optional(CONF_NEC): vol.Schema({ | ||||||
|  |         vol.Required(CONF_ADDRESS): cv.hex_uint16_t, | ||||||
|  |         vol.Required(CONF_COMMAND): cv.hex_uint16_t, | ||||||
|  |     }), | ||||||
|  |     vol.Optional(CONF_SONY): vol.Schema({ | ||||||
|  |         vol.Required(CONF_DATA): cv.hex_uint32_t, | ||||||
|  |         vol.Optional(CONF_NBITS, default=12): vol.All(vol.Coerce(int), cv.one_of(12, 15, 20)), | ||||||
|  |     }), | ||||||
|  |     vol.Optional(CONF_PANASONIC): vol.Schema({ | ||||||
|  |         vol.Required(CONF_ADDRESS): cv.hex_uint16_t, | ||||||
|  |         vol.Required(CONF_COMMAND): cv.hex_uint32_t, | ||||||
|  |     }), | ||||||
|  |     vol.Optional(CONF_RAW): vol.Schema({ | ||||||
|  |         vol.Required(CONF_DATA): [vol.Any(vol.Coerce(int), cv.time_period_microseconds)], | ||||||
|  |         vol.Optional(CONF_CARRIER_FREQUENCY): vol.All(cv.frequency, vol.Coerce(int)), | ||||||
|  |     }), | ||||||
|  |     vol.Optional(CONF_REPEAT): vol.Any(cv.positive_not_null_int, vol.Schema({ | ||||||
|  |         vol.Required(CONF_TIMES): cv.positive_not_null_int, | ||||||
|  |         vol.Required(CONF_WAIT_TIME): cv.positive_time_period_microseconds, | ||||||
|  |     })), | ||||||
|  |     cv.GenerateID(CONF_REMOTE_TRANSMITTER_ID): cv.use_variable_id(RemoteTransmitterComponent), | ||||||
|  |     cv.GenerateID(CONF_TRANSMITTER_ID): cv.declare_variable_id(RemoteTransmitter), | ||||||
|  |  | ||||||
|  |     vol.Optional(CONF_INVERTED): cv.invalid("Remote Transmitters do not support inverted mode!"), | ||||||
|  | }), cv.has_exactly_one_key(*IR_KEYS)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def transmitter_base(config): | ||||||
|  |     if CONF_LG in config: | ||||||
|  |         conf = config[CONF_LG] | ||||||
|  |         return LGTransmitter.new(config[CONF_NAME], conf[CONF_DATA], conf[CONF_NBITS]) | ||||||
|  |     elif CONF_NEC in config: | ||||||
|  |         conf = config[CONF_NEC] | ||||||
|  |         return NECTransmitter.new(config[CONF_NAME], conf[CONF_ADDRESS], conf[CONF_COMMAND]) | ||||||
|  |     elif CONF_PANASONIC in config: | ||||||
|  |         conf = config[CONF_PANASONIC] | ||||||
|  |         return PanasonicTransmitter.new(config[CONF_NAME], conf[CONF_ADDRESS], conf[CONF_COMMAND]) | ||||||
|  |     elif CONF_SONY in config: | ||||||
|  |         conf = config[CONF_SONY] | ||||||
|  |         return SonyTransmitter.new(config[CONF_NAME], conf[CONF_DATA], conf[CONF_NBITS]) | ||||||
|  |     elif CONF_RAW in config: | ||||||
|  |         conf = config[CONF_RAW] | ||||||
|  |         data = ArrayInitializer(*conf[CONF_DATA]) | ||||||
|  |         return RawTransmitter.new(data, conf[CONF_CARRIER_FREQUENCY]) | ||||||
|  |     else: | ||||||
|  |         raise ValueError("Unknown transmitter type {}".format(config)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def to_code(config): | ||||||
|  |     remote = None | ||||||
|  |     for remote in get_variable(config[CONF_REMOTE_TRANSMITTER_ID]): | ||||||
|  |         yield | ||||||
|  |     rhs = App.register_component(transmitter_base(config)) | ||||||
|  |     transmitter = Pvariable(config[CONF_TRANSMITTER_ID], rhs) | ||||||
|  |  | ||||||
|  |     if CONF_REPEAT in config: | ||||||
|  |         if isinstance(config[CONF_REPEAT], int): | ||||||
|  |             times = config[CONF_REPEAT] | ||||||
|  |             wait_us = 1000 | ||||||
|  |         else: | ||||||
|  |             times = config[CONF_REPEAT][CONF_TIMES] | ||||||
|  |             wait_us = config[CONF_REPEAT][CONF_WAIT_TIME] | ||||||
|  |         add(transmitter.set_repeat(times, wait_us)) | ||||||
|  |  | ||||||
|  |     switch.register_switch(remote.add_transmitter(transmitter), config) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | BUILD_FLAGS = '-DUSE_REMOTE_TRANSMITTER' | ||||||
| @@ -7,10 +7,10 @@ from esphomeyaml.helpers import App, Application, variable | |||||||
|  |  | ||||||
| MakeRestartSwitch = Application.MakeRestartSwitch | MakeRestartSwitch = Application.MakeRestartSwitch | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = switch.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeRestartSwitch), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeRestartSwitch), | ||||||
|     vol.Optional(CONF_INVERTED): cv.invalid("Restart switches do not support inverted mode!"), |     vol.Optional(CONF_INVERTED): cv.invalid("Restart switches do not support inverted mode!"), | ||||||
| }).extend(switch.SWITCH_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ from esphomeyaml.helpers import App, Application, variable | |||||||
|  |  | ||||||
| MakeShutdownSwitch = Application.MakeShutdownSwitch | MakeShutdownSwitch = Application.MakeShutdownSwitch | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = switch.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeShutdownSwitch), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeShutdownSwitch), | ||||||
|     vol.Optional(CONF_INVERTED): cv.invalid("Shutdown switches do not support inverted mode!"), |     vol.Optional(CONF_INVERTED): cv.invalid("Shutdown switches do not support inverted mode!"), | ||||||
| }).extend(switch.SWITCH_SCHEMA.schema) | })) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -10,13 +10,13 @@ from esphomeyaml.helpers import App, Application, process_lambda, variable, NoAr | |||||||
|  |  | ||||||
| MakeTemplateSwitch = Application.MakeTemplateSwitch | MakeTemplateSwitch = Application.MakeTemplateSwitch | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = vol.All(switch.PLATFORM_SCHEMA.extend({ | PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ | ||||||
|     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateSwitch), |     cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTemplateSwitch), | ||||||
|     vol.Optional(CONF_LAMBDA): cv.lambda_, |     vol.Optional(CONF_LAMBDA): cv.lambda_, | ||||||
|     vol.Optional(CONF_OPTIMISTIC): cv.boolean, |     vol.Optional(CONF_OPTIMISTIC): cv.boolean, | ||||||
|     vol.Optional(CONF_TURN_OFF_ACTION): automation.ACTIONS_SCHEMA, |     vol.Optional(CONF_TURN_OFF_ACTION): automation.ACTIONS_SCHEMA, | ||||||
|     vol.Optional(CONF_TURN_ON_ACTION): automation.ACTIONS_SCHEMA, |     vol.Optional(CONF_TURN_ON_ACTION): automation.ACTIONS_SCHEMA, | ||||||
| }).extend(switch.SWITCH_SCHEMA.schema), cv.has_at_least_one_key(CONF_LAMBDA, CONF_OPTIMISTIC)) | }), cv.has_at_least_one_key(CONF_LAMBDA, CONF_OPTIMISTIC)) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ import voluptuous as vol | |||||||
| import esphomeyaml.config_validation as cv | import esphomeyaml.config_validation as cv | ||||||
| from esphomeyaml import core | from esphomeyaml import core | ||||||
| from esphomeyaml.const import CONF_AP, CONF_CHANNEL, CONF_DNS1, CONF_DNS2, CONF_DOMAIN, \ | from esphomeyaml.const import CONF_AP, CONF_CHANNEL, CONF_DNS1, CONF_DNS2, CONF_DOMAIN, \ | ||||||
|     CONF_GATEWAY, CONF_HOSTNAME, CONF_ID, CONF_MANUAL_IP, CONF_PASSWORD, CONF_SSID, \ |     CONF_GATEWAY, CONF_HOSTNAME, CONF_ID, CONF_MANUAL_IP, CONF_NETWORKS, CONF_PASSWORD, CONF_SSID, \ | ||||||
|     CONF_STATIC_IP, CONF_SUBNET, ESP_PLATFORM_ESP8266 |     CONF_STATIC_IP, CONF_SUBNET, ESP_PLATFORM_ESP8266 | ||||||
| from esphomeyaml.helpers import App, Pvariable, StructInitializer, add, esphomelib_ns, global_ns | from esphomeyaml.helpers import App, Pvariable, StructInitializer, add, esphomelib_ns, global_ns | ||||||
|  |  | ||||||
| @@ -19,6 +19,15 @@ def validate_password(value): | |||||||
|     return value |     return value | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def validate_channel(value): | ||||||
|  |     value = cv.positive_int(value) | ||||||
|  |     if value < 1: | ||||||
|  |         raise vol.Invalid("Minimum WiFi channel is 1") | ||||||
|  |     if value > 14: | ||||||
|  |         raise vol.Invalid("Maximum WiFi channel is 14") | ||||||
|  |     return value | ||||||
|  |  | ||||||
|  |  | ||||||
| AP_MANUAL_IP_SCHEMA = vol.Schema({ | AP_MANUAL_IP_SCHEMA = vol.Schema({ | ||||||
|     vol.Required(CONF_STATIC_IP): cv.ipv4, |     vol.Required(CONF_STATIC_IP): cv.ipv4, | ||||||
|     vol.Required(CONF_GATEWAY): cv.ipv4, |     vol.Required(CONF_GATEWAY): cv.ipv4, | ||||||
| @@ -30,34 +39,64 @@ STA_MANUAL_IP_SCHEMA = AP_MANUAL_IP_SCHEMA.extend({ | |||||||
|     vol.Inclusive(CONF_DNS2, 'dns'): cv.ipv4, |     vol.Inclusive(CONF_DNS2, 'dns'): cv.ipv4, | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | CONF_BSSID = 'bssid' | ||||||
|  |  | ||||||
|  | WIFI_NETWORK_BASE = vol.Schema({ | ||||||
|  |     vol.Optional(CONF_SSID): cv.ssid, | ||||||
|  |     vol.Optional(CONF_PASSWORD): validate_password, | ||||||
|  |     vol.Optional(CONF_BSSID): cv.mac_address, | ||||||
|  |     vol.Optional(CONF_CHANNEL): validate_channel, | ||||||
|  |     vol.Optional(CONF_MANUAL_IP): AP_MANUAL_IP_SCHEMA, | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | WIFI_NETWORK_AP = vol.All(WIFI_NETWORK_BASE.extend({ | ||||||
|  |     vol.Optional(CONF_MANUAL_IP): AP_MANUAL_IP_SCHEMA, | ||||||
|  | }), cv.has_at_least_one_key(CONF_SSID, CONF_BSSID)) | ||||||
|  |  | ||||||
|  | WIFI_NETWORK_STA = vol.All(WIFI_NETWORK_BASE.extend({ | ||||||
|  |     vol.Optional(CONF_MANUAL_IP): STA_MANUAL_IP_SCHEMA, | ||||||
|  | }), cv.has_at_least_one_key(CONF_SSID, CONF_BSSID)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def validate_multi_wifi(config): | ||||||
|  |     if CONF_PASSWORD in config and CONF_SSID not in config: | ||||||
|  |         raise vol.Invalid("Cannot have WiFi password without SSID!") | ||||||
|  |     if CONF_SSID in config and CONF_NETWORKS in config: | ||||||
|  |         raise vol.Invalid("For multi-wifi mode (with 'networks:'), please specify all " | ||||||
|  |                           "networks within the 'networks:' key!") | ||||||
|  |  | ||||||
|  |     return config | ||||||
|  |  | ||||||
|  |  | ||||||
| # pylint: disable=invalid-name | # pylint: disable=invalid-name | ||||||
| IPAddress = global_ns.IPAddress | IPAddress = global_ns.IPAddress | ||||||
| ManualIP = esphomelib_ns.ManualIP | ManualIP = esphomelib_ns.ManualIP | ||||||
| WiFiComponent = esphomelib_ns.WiFiComponent | WiFiComponent = esphomelib_ns.WiFiComponent | ||||||
|  | WiFiAp = esphomelib_ns.WiFiAp | ||||||
|  |  | ||||||
| CONFIG_SCHEMA = vol.Schema({ | CONFIG_SCHEMA = vol.All(vol.Schema({ | ||||||
|     cv.GenerateID(): cv.declare_variable_id(WiFiComponent), |     cv.GenerateID(): cv.declare_variable_id(WiFiComponent), | ||||||
|     vol.Optional(CONF_SSID): cv.ssid, |     vol.Optional(CONF_SSID): cv.ssid, | ||||||
|     vol.Optional(CONF_PASSWORD): validate_password, |     vol.Optional(CONF_PASSWORD): validate_password, | ||||||
|     vol.Optional(CONF_MANUAL_IP): STA_MANUAL_IP_SCHEMA, |     vol.Optional(CONF_NETWORKS): vol.All(cv.ensure_list, [WIFI_NETWORK_STA]), | ||||||
|     vol.Optional(CONF_AP): vol.Schema({ |     vol.Optional(CONF_AP): WIFI_NETWORK_AP, | ||||||
|         vol.Required(CONF_SSID): cv.ssid, |  | ||||||
|         vol.Optional(CONF_PASSWORD): validate_password, |  | ||||||
|         vol.Optional(CONF_CHANNEL): vol.All(cv.positive_int, vol.Range(min=1, max=14)), |  | ||||||
|         vol.Optional(CONF_MANUAL_IP): AP_MANUAL_IP_SCHEMA, |  | ||||||
|     }), |  | ||||||
|     vol.Optional(CONF_HOSTNAME): cv.hostname, |     vol.Optional(CONF_HOSTNAME): cv.hostname, | ||||||
|     vol.Optional(CONF_DOMAIN, default='.local'): cv.domainname, |     vol.Optional(CONF_DOMAIN, default='.local'): cv.domainname, | ||||||
| }) |  | ||||||
|  |     vol.Optional(CONF_MANUAL_IP): cv.invalid("Manual IPs can only be specified in the 'networks:' " | ||||||
|  |                                              "section of the WiFi configuration since 1.7.0"), | ||||||
|  | }), validate_multi_wifi) | ||||||
|  |  | ||||||
|  |  | ||||||
| def safe_ip(ip): | def safe_ip(ip): | ||||||
|     if ip is None: |     if ip is None: | ||||||
|         return None |         return IPAddress(0, 0, 0, 0) | ||||||
|     return IPAddress(*ip.args) |     return IPAddress(*ip.args) | ||||||
|  |  | ||||||
|  |  | ||||||
| def manual_ip(config): | def manual_ip(config): | ||||||
|  |     if config is None: | ||||||
|  |         return None | ||||||
|     return StructInitializer( |     return StructInitializer( | ||||||
|         ManualIP, |         ManualIP, | ||||||
|         ('static_ip', safe_ip(config[CONF_STATIC_IP])), |         ('static_ip', safe_ip(config[CONF_STATIC_IP])), | ||||||
| @@ -68,27 +107,29 @@ def manual_ip(config): | |||||||
|     ) |     ) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def wifi_network(config): | ||||||
|  |     return StructInitializer( | ||||||
|  |         WiFiAp, | ||||||
|  |         ('ssid', config.get(CONF_SSID, "")), | ||||||
|  |         ('password', config.get(CONF_PASSWORD, "")), | ||||||
|  |         ('bssid', config.get(CONF_BSSID, core.MACAddress(0, 0, 0, 0, 0, 0)).as_hex()), | ||||||
|  |         ('channel', config.get(CONF_CHANNEL, -1)), | ||||||
|  |         ('manual_ip', manual_ip(config.get(CONF_MANUAL_IP))), | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |  | ||||||
| def to_code(config): | def to_code(config): | ||||||
|     sta = CONF_SSID in config |     if CONF_SSID in config: | ||||||
|     ap = CONF_AP in config |  | ||||||
|     if sta: |  | ||||||
|         rhs = App.init_wifi(config[CONF_SSID], config.get(CONF_PASSWORD)) |         rhs = App.init_wifi(config[CONF_SSID], config.get(CONF_PASSWORD)) | ||||||
|     else: |     else: | ||||||
|         rhs = App.init_wifi() |         rhs = App.init_wifi() | ||||||
|     wifi = Pvariable(config[CONF_ID], rhs) |     wifi = Pvariable(config[CONF_ID], rhs) | ||||||
|  |  | ||||||
|     if sta and CONF_MANUAL_IP in config: |     for network in config.get(CONF_NETWORKS, []): | ||||||
|         add(wifi.set_sta_manual_ip(manual_ip(config[CONF_MANUAL_IP]))) |         add(wifi.add_sta(wifi_network(network))) | ||||||
|  |  | ||||||
|     if ap: |     if CONF_AP in config: | ||||||
|         conf = config[CONF_AP] |         add(wifi.set_ap(wifi_network(config[CONF_AP]))) | ||||||
|         password = config.get(CONF_PASSWORD) |  | ||||||
|         if password is None and CONF_CHANNEL in conf: |  | ||||||
|             password = u"" |  | ||||||
|         add(wifi.set_ap(conf[CONF_SSID], password, conf.get(CONF_CHANNEL))) |  | ||||||
|  |  | ||||||
|         if CONF_MANUAL_IP in conf: |  | ||||||
|             add(wifi.set_ap_manual_ip(manual_ip(conf[CONF_MANUAL_IP]))) |  | ||||||
|  |  | ||||||
|     if CONF_HOSTNAME in config: |     if CONF_HOSTNAME in config: | ||||||
|         add(wifi.set_hostname(config[CONF_HOSTNAME])) |         add(wifi.set_hostname(config[CONF_HOSTNAME])) | ||||||
|   | |||||||
| @@ -220,7 +220,7 @@ def validate_config(config): | |||||||
|                 continue |                 continue | ||||||
|             platform = get_platform(domain, p_name) |             platform = get_platform(domain, p_name) | ||||||
|             if platform is None: |             if platform is None: | ||||||
|                 result.add_error(u"Platform not found: {}.{}") |                 result.add_error(u"Platform not found: {}.{}".format(domain, p_name)) | ||||||
|                 continue |                 continue | ||||||
|  |  | ||||||
|             success = True |             success = True | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ from esphomeyaml import core | |||||||
| from esphomeyaml.const import CONF_AVAILABILITY, CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_ID, \ | from esphomeyaml.const import CONF_AVAILABILITY, CONF_COMMAND_TOPIC, CONF_DISCOVERY, CONF_ID, \ | ||||||
|     CONF_NAME, CONF_PAYLOAD_AVAILABLE, \ |     CONF_NAME, CONF_PAYLOAD_AVAILABLE, \ | ||||||
|     CONF_PAYLOAD_NOT_AVAILABLE, CONF_PLATFORM, CONF_RETAIN, CONF_STATE_TOPIC, CONF_TOPIC, \ |     CONF_PAYLOAD_NOT_AVAILABLE, CONF_PLATFORM, CONF_RETAIN, CONF_STATE_TOPIC, CONF_TOPIC, \ | ||||||
|     ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266 |     ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266, CONF_INTERNAL | ||||||
| from esphomeyaml.core import HexInt, IPAddress, Lambda, TimePeriod, TimePeriodMicroseconds, \ | from esphomeyaml.core import HexInt, IPAddress, Lambda, TimePeriod, TimePeriodMicroseconds, \ | ||||||
|     TimePeriodMilliseconds, TimePeriodSeconds |     TimePeriodMilliseconds, TimePeriodSeconds | ||||||
|  |  | ||||||
| @@ -325,10 +325,29 @@ time_period = vol.Any(time_period_str_unit, time_period_str_colon, time_period_d | |||||||
| positive_time_period = vol.All(time_period, vol.Range(min=TimePeriod())) | positive_time_period = vol.All(time_period, vol.Range(min=TimePeriod())) | ||||||
| positive_time_period_milliseconds = vol.All(positive_time_period, time_period_in_milliseconds_) | positive_time_period_milliseconds = vol.All(positive_time_period, time_period_in_milliseconds_) | ||||||
| positive_time_period_seconds = vol.All(positive_time_period, time_period_in_seconds_) | positive_time_period_seconds = vol.All(positive_time_period, time_period_in_seconds_) | ||||||
|  | time_period_microseconds = vol.All(time_period, time_period_in_microseconds_) | ||||||
| positive_time_period_microseconds = vol.All(positive_time_period, time_period_in_microseconds_) | positive_time_period_microseconds = vol.All(positive_time_period, time_period_in_microseconds_) | ||||||
| positive_not_null_time_period = vol.All(time_period, | positive_not_null_time_period = vol.All(time_period, | ||||||
|                                         vol.Range(min=TimePeriod(), min_included=False)) |                                         vol.Range(min=TimePeriod(), min_included=False)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def mac_address(value): | ||||||
|  |     value = string_strict(value) | ||||||
|  |     parts = value.split(':') | ||||||
|  |     if len(parts) != 6: | ||||||
|  |         raise vol.Invalid("MAC Address must consist of 6 : (colon) separated parts") | ||||||
|  |     parts_int = [] | ||||||
|  |     if any(len(part) != 2 for part in parts): | ||||||
|  |         raise vol.Invalid("MAC Address must be format XX:XX:XX:XX:XX:XX") | ||||||
|  |     for part in parts: | ||||||
|  |         try: | ||||||
|  |             parts_int.append(int(part, 16)) | ||||||
|  |         except ValueError: | ||||||
|  |             raise vol.Invalid("MAC Address parts must be hexadecimal values from 00 to FF") | ||||||
|  |  | ||||||
|  |     return core.MACAddress(*parts_int) | ||||||
|  |  | ||||||
|  |  | ||||||
| METRIC_SUFFIXES = { | METRIC_SUFFIXES = { | ||||||
|     'E': 1e18, 'P': 1e15, 'T': 1e12, 'G': 1e9, 'M': 1e6, 'k': 1e3, 'da': 10, 'd': 1e-1, |     'E': 1e18, 'P': 1e15, 'T': 1e12, 'G': 1e9, 'M': 1e6, 'k': 1e3, 'da': 10, 'd': 1e-1, | ||||||
|     'c': 1e-2, 'm': 0.001, u'µ': 1e-6, 'u': 1e-6, 'n': 1e-9, 'p': 1e-12, 'f': 1e-15, 'a': 1e-18, |     'c': 1e-2, 'm': 0.001, u'µ': 1e-6, 'u': 1e-6, 'n': 1e-9, 'p': 1e-12, 'f': 1e-15, 'a': 1e-18, | ||||||
| @@ -352,6 +371,23 @@ def frequency(value): | |||||||
|     return mantissa * multiplier |     return mantissa * multiplier | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def validate_bytes(value): | ||||||
|  |     value = string(value) | ||||||
|  |     match = re.match(r"^([0-9]+)\s*(\w*?)(?:byte|B|b)?s?$", value) | ||||||
|  |  | ||||||
|  |     if match is None: | ||||||
|  |         raise vol.Invalid(u"Expected number of bytes with unit, got {}".format(value)) | ||||||
|  |  | ||||||
|  |     mantissa = int(match.group(1)) | ||||||
|  |     if match.group(2) not in METRIC_SUFFIXES: | ||||||
|  |         raise vol.Invalid(u"Invalid metric suffix {}".format(match.group(2))) | ||||||
|  |     multiplier = METRIC_SUFFIXES[match.group(2)] | ||||||
|  |     if multiplier < 1: | ||||||
|  |         raise vol.Invalid(u"Only suffixes with positive exponents are supported. " | ||||||
|  |                           u"Got {}".format(match.group(2))) | ||||||
|  |     return int(mantissa * multiplier) | ||||||
|  |  | ||||||
|  |  | ||||||
| def hostname(value): | def hostname(value): | ||||||
|     value = string(value) |     value = string(value) | ||||||
|     if len(value) > 63: |     if len(value) > 63: | ||||||
| @@ -482,6 +518,12 @@ def percentage(value): | |||||||
|     return zero_to_one_float(value) |     return zero_to_one_float(value) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def percentage_int(value): | ||||||
|  |     if isinstance(value, (str, unicode)) and value.endswith('%'): | ||||||
|  |         value = int(value[:-1].rstrip()) | ||||||
|  |     return value | ||||||
|  |  | ||||||
|  |  | ||||||
| def invalid(message): | def invalid(message): | ||||||
|     def validator(value): |     def validator(value): | ||||||
|         raise vol.Invalid(message) |         raise vol.Invalid(message) | ||||||
| @@ -518,6 +560,23 @@ class GenerateID(vol.Optional): | |||||||
|         super(GenerateID, self).__init__(key, default=lambda: None) |         super(GenerateID, self).__init__(key, default=lambda: None) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def nameable(*schemas): | ||||||
|  |     def validator(config): | ||||||
|  |         config = vol.All(*schemas)(config) | ||||||
|  |         if CONF_NAME not in config and CONF_ID not in config: | ||||||
|  |             raise vol.Invalid("At least one of 'id:' or 'name:' is required!") | ||||||
|  |         if CONF_NAME not in config: | ||||||
|  |             id = config[CONF_ID] | ||||||
|  |             if not id.is_manual: | ||||||
|  |                 raise vol.Invalid("At least one of 'id:' or 'name:' is required!") | ||||||
|  |             config[CONF_NAME] = id.id | ||||||
|  |             config[CONF_INTERNAL] = True | ||||||
|  |             return config | ||||||
|  |         return config | ||||||
|  |  | ||||||
|  |     return validator | ||||||
|  |  | ||||||
|  |  | ||||||
| PLATFORM_SCHEMA = vol.Schema({ | PLATFORM_SCHEMA = vol.Schema({ | ||||||
|     vol.Required(CONF_PLATFORM): valid, |     vol.Required(CONF_PLATFORM): valid, | ||||||
| }) | }) | ||||||
| @@ -529,11 +588,12 @@ MQTT_COMPONENT_AVAILABILITY_SCHEMA = vol.Schema({ | |||||||
| }) | }) | ||||||
|  |  | ||||||
| MQTT_COMPONENT_SCHEMA = vol.Schema({ | MQTT_COMPONENT_SCHEMA = vol.Schema({ | ||||||
|     vol.Required(CONF_NAME): string, |     vol.Optional(CONF_NAME): string, | ||||||
|     vol.Optional(CONF_RETAIN): boolean, |     vol.Optional(CONF_RETAIN): boolean, | ||||||
|     vol.Optional(CONF_DISCOVERY): boolean, |     vol.Optional(CONF_DISCOVERY): boolean, | ||||||
|     vol.Optional(CONF_STATE_TOPIC): publish_topic, |     vol.Optional(CONF_STATE_TOPIC): publish_topic, | ||||||
|     vol.Optional(CONF_AVAILABILITY): vol.Any(None, MQTT_COMPONENT_AVAILABILITY_SCHEMA), |     vol.Optional(CONF_AVAILABILITY): vol.Any(None, MQTT_COMPONENT_AVAILABILITY_SCHEMA), | ||||||
|  |     vol.Optional(CONF_INTERNAL): boolean, | ||||||
| }) | }) | ||||||
|  |  | ||||||
| MQTT_COMMAND_COMPONENT_SCHEMA = MQTT_COMPONENT_SCHEMA.extend({ | MQTT_COMMAND_COMPONENT_SCHEMA = MQTT_COMPONENT_SCHEMA.extend({ | ||||||
|   | |||||||
| @@ -148,7 +148,6 @@ CONF_TRIGGER_PIN = 'trigger_pin' | |||||||
| CONF_ECHO_PIN = 'echo_pin' | CONF_ECHO_PIN = 'echo_pin' | ||||||
| CONF_TIMEOUT_METER = 'timeout_meter' | CONF_TIMEOUT_METER = 'timeout_meter' | ||||||
| CONF_TIMEOUT_TIME = 'timeout_time' | CONF_TIMEOUT_TIME = 'timeout_time' | ||||||
| CONF_IR_TRANSMITTER_ID = 'ir_transmitter_id' |  | ||||||
| CONF_CARRIER_DUTY_PERCENT = 'carrier_duty_percent' | CONF_CARRIER_DUTY_PERCENT = 'carrier_duty_percent' | ||||||
| CONF_NEC = 'nec' | CONF_NEC = 'nec' | ||||||
| CONF_COMMAND = 'command' | CONF_COMMAND = 'command' | ||||||
| @@ -234,6 +233,13 @@ CONF_OPTIMISTIC = 'optimistic' | |||||||
| CONF_ON_BOOT = 'on_boot' | CONF_ON_BOOT = 'on_boot' | ||||||
| CONF_ON_SHUTDOWN = 'on_shutdown' | CONF_ON_SHUTDOWN = 'on_shutdown' | ||||||
| CONF_PRIORITY = 'priority' | CONF_PRIORITY = 'priority' | ||||||
|  | CONF_DUMP = 'dump' | ||||||
|  | CONF_BUFFER_SIZE = 'buffer_size' | ||||||
|  | CONF_TOLERANCE = 'tolerance' | ||||||
|  | CONF_FILTER = 'filter' | ||||||
|  | CONF_IDLE = 'idle' | ||||||
|  | CONF_NETWORKS = 'networks' | ||||||
|  | CONF_INTERNAL = 'internal' | ||||||
|  |  | ||||||
| ESP32_BOARDS = [ | ESP32_BOARDS = [ | ||||||
|     'featheresp32', 'node32s', 'espea32', 'firebeetle32', 'esp32doit-devkit-v1', |     'featheresp32', 'node32s', 'espea32', 'firebeetle32', 'esp32doit-devkit-v1', | ||||||
|   | |||||||
| @@ -32,6 +32,12 @@ class MACAddress(object): | |||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         return ':'.join('{:02X}'.format(part) for part in self.parts) |         return ':'.join('{:02X}'.format(part) for part in self.parts) | ||||||
|  |  | ||||||
|  |     def as_hex(self): | ||||||
|  |         import esphomeyaml.helpers | ||||||
|  |  | ||||||
|  |         num = ''.join('{:02X}'.format(part) for part in self.parts) | ||||||
|  |         return esphomeyaml.helpers.RawExpression('0x{}ULL'.format(num)) | ||||||
|  |  | ||||||
|  |  | ||||||
| def is_approximately_integer(value): | def is_approximately_integer(value): | ||||||
|     if isinstance(value, (int, long)): |     if isinstance(value, (int, long)): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user