From c3b2ab0085b0ad8052a822cdee4a1ca4572c0e3a Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Mon, 19 Nov 2018 22:49:06 +0100 Subject: [PATCH 1/5] Fix SNTP servers option (#237) * Fix SNTP servers option * Lint --- esphomeyaml/components/light/__init__.py | 20 ++++++++------------ esphomeyaml/components/time/sntp.py | 6 ++++-- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/esphomeyaml/components/light/__init__.py b/esphomeyaml/components/light/__init__.py index 0262e3b9b0..6b71d42edf 100644 --- a/esphomeyaml/components/light/__init__.py +++ b/esphomeyaml/components/light/__init__.py @@ -1,18 +1,16 @@ import voluptuous as vol -from esphomeyaml.automation import maybe_simple_id, ACTION_REGISTRY +from esphomeyaml.automation import ACTION_REGISTRY, maybe_simple_id from esphomeyaml.components import mqtt import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_ALPHA, CONF_BLUE, CONF_BRIGHTNESS, CONF_COLORS, \ - CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECTS, CONF_EFFECT_ID, \ - CONF_GAMMA_CORRECT, CONF_GREEN, CONF_ID, CONF_INTERNAL, CONF_LAMBDA, CONF_MQTT_ID, CONF_NAME, \ - CONF_NUM_LEDS, CONF_RANDOM, CONF_RED, CONF_SPEED, CONF_STATE, CONF_TRANSITION_LENGTH, \ - CONF_UPDATE_INTERVAL, CONF_WHITE, CONF_WIDTH, CONF_FLASH_LENGTH, CONF_COLOR_TEMPERATURE, \ - CONF_EFFECT -from esphomeyaml.helpers import Application, ArrayInitializer, Pvariable, RawExpression, \ - StructInitializer, add, add_job, esphomelib_ns, process_lambda, setup_mqtt_component, \ - get_variable, TemplateArguments, templatable, uint32, float_, std_string, Nameable, Component, \ - Action + CONF_COLOR_TEMPERATURE, CONF_DEFAULT_TRANSITION_LENGTH, CONF_DURATION, CONF_EFFECT, \ + CONF_EFFECTS, CONF_EFFECT_ID, CONF_FLASH_LENGTH, CONF_GAMMA_CORRECT, CONF_GREEN, CONF_ID, \ + CONF_INTERNAL, CONF_LAMBDA, CONF_MQTT_ID, CONF_NAME, CONF_NUM_LEDS, CONF_RANDOM, CONF_RED, \ + CONF_SPEED, CONF_STATE, CONF_TRANSITION_LENGTH, CONF_UPDATE_INTERVAL, CONF_WHITE, CONF_WIDTH +from esphomeyaml.helpers import Action, Application, ArrayInitializer, Component, Nameable, \ + Pvariable, StructInitializer, TemplateArguments, add, add_job, esphomelib_ns, float_, \ + get_variable, process_lambda, setup_mqtt_component, std_string, templatable, uint32 PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ @@ -33,7 +31,6 @@ TurnOnAction = light_ns.class_('TurnOnAction', Action) LightColorValues = light_ns.class_('LightColorValues') - MQTTJSONLightComponent = light_ns.class_('MQTTJSONLightComponent', mqtt.MQTTComponent) # Effects @@ -354,7 +351,6 @@ def setup_light(light_obj, mqtt_obj, config): BUILD_FLAGS = '-DUSE_LIGHT' - CONF_LIGHT_TOGGLE = 'light.toggle' LIGHT_TOGGLE_ACTION_SCHEMA = maybe_simple_id({ vol.Required(CONF_ID): cv.use_variable_id(LightState), diff --git a/esphomeyaml/components/time/sntp.py b/esphomeyaml/components/time/sntp.py index 0422c8b6fa..2f63891c07 100644 --- a/esphomeyaml/components/time/sntp.py +++ b/esphomeyaml/components/time/sntp.py @@ -9,7 +9,7 @@ SNTPComponent = time_.time_ns.class_('SNTPComponent', time_.RealTimeClockCompone PLATFORM_SCHEMA = time_.TIME_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(SNTPComponent), - vol.Optional(CONF_SERVERS): vol.All(cv.ensure_list, [cv.string], vol.Length(max=3)), + vol.Optional(CONF_SERVERS): vol.All(cv.ensure_list, [cv.string], vol.Length(min=1, max=3)), vol.Optional(CONF_LAMBDA): cv.lambda_, }).extend(cv.COMPONENT_SCHEMA.schema) @@ -18,7 +18,9 @@ def to_code(config): rhs = App.make_sntp_component() sntp = Pvariable(config[CONF_ID], rhs) if CONF_SERVERS in config: - add(sntp.set_servers(*config[CONF_SERVERS])) + servers = config[CONF_SERVERS] + servers += [''] * (3 - len(servers)) + add(sntp.set_servers(*servers)) time_.setup_time(sntp, config) setup_component(sntp, config) From b4c4dc8cfb75a3ab3237132dfa2dc8138f7375db Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Mon, 19 Nov 2018 23:01:27 +0100 Subject: [PATCH 2/5] Bump HassIO version to v1.9.1 --- esphomeyaml-beta/config.json | 2 +- esphomeyaml/config.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphomeyaml-beta/config.json b/esphomeyaml-beta/config.json index c30ccc1f17..bed0cada3d 100644 --- a/esphomeyaml-beta/config.json +++ b/esphomeyaml-beta/config.json @@ -1,6 +1,6 @@ { "name": "esphomeyaml-beta", - "version": "1.9.0", + "version": "1.9.1", "slug": "esphomeyaml-beta", "description": "Beta version of esphomeyaml HassIO add-on.", "url": "https://beta.esphomelib.com/esphomeyaml/index.html", diff --git a/esphomeyaml/config.json b/esphomeyaml/config.json index cfb1043e70..31702787a8 100644 --- a/esphomeyaml/config.json +++ b/esphomeyaml/config.json @@ -1,6 +1,6 @@ { "name": "esphomeyaml", - "version": "1.9.0", + "version": "1.9.1", "slug": "esphomeyaml", "description": "esphomeyaml HassIO add-on for intelligently managing all your ESP8266/ESP32 devices.", "url": "https://esphomelib.com/esphomeyaml/index.html", From bb9c1faffa73d7b51c21ca2d1cfc76659cabf938 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Fri, 23 Nov 2018 13:51:22 +0100 Subject: [PATCH 3/5] Improve one_of validator (#240) --- esphomeyaml/components/binary_sensor/__init__.py | 2 +- .../components/binary_sensor/remote_receiver.py | 4 ++-- esphomeyaml/components/deep_sleep.py | 6 +++--- esphomeyaml/components/display/ssd1306_spi.py | 2 +- esphomeyaml/components/display/waveshare_epaper.py | 2 +- esphomeyaml/components/esp32_ble_beacon.py | 2 +- esphomeyaml/components/fan/__init__.py | 6 +----- esphomeyaml/components/light/fastled_clockless.py | 4 ++-- esphomeyaml/components/light/fastled_spi.py | 4 ++-- esphomeyaml/components/logger.py | 4 ++-- esphomeyaml/components/my9231.py | 3 +-- esphomeyaml/components/remote_receiver.py | 2 +- esphomeyaml/components/remote_transmitter.py | 8 +++----- esphomeyaml/components/sensor/adc.py | 3 ++- esphomeyaml/components/sensor/bme280.py | 4 ++-- esphomeyaml/components/sensor/bme680.py | 4 ++-- esphomeyaml/components/sensor/bmp280.py | 4 ++-- esphomeyaml/components/sensor/dht.py | 2 +- esphomeyaml/components/sensor/hmc5883l.py | 2 +- esphomeyaml/components/sensor/hx711.py | 2 +- esphomeyaml/components/sensor/pmsx003.py | 2 +- esphomeyaml/components/sensor/pulse_counter.py | 2 +- esphomeyaml/components/sensor/rotary_encoder.py | 2 +- esphomeyaml/components/sensor/tcs34725.py | 4 ++-- esphomeyaml/components/sensor/tsl2561.py | 2 +- .../components/switch/remote_transmitter.py | 4 ++-- esphomeyaml/components/wifi.py | 2 +- esphomeyaml/config_validation.py | 14 +++++++++++++- esphomeyaml/core_config.py | 6 +++--- esphomeyaml/pins.py | 9 ++++----- 30 files changed, 61 insertions(+), 56 deletions(-) diff --git a/esphomeyaml/components/binary_sensor/__init__.py b/esphomeyaml/components/binary_sensor/__init__.py index e4cf8a264b..9f53a0e2db 100644 --- a/esphomeyaml/components/binary_sensor/__init__.py +++ b/esphomeyaml/components/binary_sensor/__init__.py @@ -150,7 +150,7 @@ def validate_multi_click_timing(value): BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend({ cv.GenerateID(CONF_MQTT_ID): cv.declare_variable_id(MQTTBinarySensorComponent), - vol.Optional(CONF_DEVICE_CLASS): vol.All(vol.Lower, cv.one_of(*DEVICE_CLASSES)), + vol.Optional(CONF_DEVICE_CLASS): cv.one_of(*DEVICE_CLASSES, lower=True), vol.Optional(CONF_FILTERS): FILTERS_SCHEMA, vol.Optional(CONF_ON_PRESS): automation.validate_automation({ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(PressTrigger), diff --git a/esphomeyaml/components/binary_sensor/remote_receiver.py b/esphomeyaml/components/binary_sensor/remote_receiver.py index 4d66caca44..d91d560430 100644 --- a/esphomeyaml/components/binary_sensor/remote_receiver.py +++ b/esphomeyaml/components/binary_sensor/remote_receiver.py @@ -39,7 +39,7 @@ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend cv.GenerateID(): cv.declare_variable_id(RemoteReceiver), 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_NBITS, default=28): cv.one_of(28, 32, int=True), }), vol.Optional(CONF_NEC): vol.Schema({ vol.Required(CONF_ADDRESS): cv.hex_uint16_t, @@ -50,7 +50,7 @@ PLATFORM_SCHEMA = cv.nameable(binary_sensor.BINARY_SENSOR_PLATFORM_SCHEMA.extend }), 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_NBITS, default=12): cv.one_of(12, 15, 20, int=True), }), vol.Optional(CONF_PANASONIC): vol.Schema({ vol.Required(CONF_ADDRESS): cv.hex_uint16_t, diff --git a/esphomeyaml/components/deep_sleep.py b/esphomeyaml/components/deep_sleep.py index 4b5f57c2f5..2bfd9ae54a 100644 --- a/esphomeyaml/components/deep_sleep.py +++ b/esphomeyaml/components/deep_sleep.py @@ -43,12 +43,12 @@ CONFIG_SCHEMA = vol.Schema({ vol.Optional(CONF_SLEEP_DURATION): cv.positive_time_period_milliseconds, vol.Optional(CONF_WAKEUP_PIN): vol.All(cv.only_on_esp32, pins.internal_gpio_input_pin_schema, validate_pin_number), - vol.Optional(CONF_WAKEUP_PIN_MODE): vol.All(cv.only_on_esp32, vol.Upper, - cv.one_of(*WAKEUP_PIN_MODES)), + vol.Optional(CONF_WAKEUP_PIN_MODE): vol.All(cv.only_on_esp32, + cv.one_of(*WAKEUP_PIN_MODES), upper=True), vol.Optional(CONF_ESP32_EXT1_WAKEUP): vol.All(cv.only_on_esp32, vol.Schema({ vol.Required(CONF_PINS): vol.All(cv.ensure_list, [pins.shorthand_input_pin], [validate_pin_number]), - vol.Required(CONF_MODE): vol.All(vol.Upper, cv.one_of(*EXT1_WAKEUP_MODES)), + vol.Required(CONF_MODE): cv.one_of(*EXT1_WAKEUP_MODES, upper=True), })), vol.Optional(CONF_RUN_CYCLES): cv.positive_int, vol.Optional(CONF_RUN_DURATION): cv.positive_time_period_milliseconds, diff --git a/esphomeyaml/components/display/ssd1306_spi.py b/esphomeyaml/components/display/ssd1306_spi.py index bf47a5e92a..33c3f6b454 100644 --- a/esphomeyaml/components/display/ssd1306_spi.py +++ b/esphomeyaml/components/display/ssd1306_spi.py @@ -27,7 +27,7 @@ MODELS = { 'SH1106_64X48': SSD1306Model.SH1106_MODEL_64_48, } -SSD1306_MODEL = vol.All(vol.Upper, vol.Replace(' ', '_'), cv.one_of(*MODELS)) +SSD1306_MODEL = vol.All(vol.Replace(' ', '_'), cv.one_of(*MODELS, upper=True)) PLATFORM_SCHEMA = display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(SPISSD1306), diff --git a/esphomeyaml/components/display/waveshare_epaper.py b/esphomeyaml/components/display/waveshare_epaper.py index 51723440cf..b7007840e1 100644 --- a/esphomeyaml/components/display/waveshare_epaper.py +++ b/esphomeyaml/components/display/waveshare_epaper.py @@ -43,7 +43,7 @@ PLATFORM_SCHEMA = vol.All(display.FULL_DISPLAY_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_SPI_ID): cv.use_variable_id(SPIComponent), vol.Required(CONF_CS_PIN): pins.gpio_output_pin_schema, vol.Required(CONF_DC_PIN): pins.gpio_output_pin_schema, - vol.Required(CONF_MODEL): vol.All(vol.Lower, cv.one_of(*MODELS)), + vol.Required(CONF_MODEL): cv.one_of(*MODELS, lower=True), vol.Optional(CONF_RESET_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_BUSY_PIN): pins.gpio_input_pin_schema, vol.Optional(CONF_FULL_UPDATE_EVERY): cv.uint32_t, diff --git a/esphomeyaml/components/esp32_ble_beacon.py b/esphomeyaml/components/esp32_ble_beacon.py index 2d9e8d37a4..88eb237157 100644 --- a/esphomeyaml/components/esp32_ble_beacon.py +++ b/esphomeyaml/components/esp32_ble_beacon.py @@ -14,7 +14,7 @@ CONF_MINOR = 'minor' CONFIG_SCHEMA = vol.Schema({ cv.GenerateID(): cv.declare_variable_id(ESP32BLEBeacon), - vol.Required(CONF_TYPE): vol.All(vol.Upper, cv.one_of('IBEACON')), + vol.Required(CONF_TYPE): cv.one_of('IBEACON', upper=True), vol.Required(CONF_UUID): cv.uuid, vol.Optional(CONF_MAJOR): cv.uint16_t, vol.Optional(CONF_MINOR): cv.uint16_t, diff --git a/esphomeyaml/components/fan/__init__.py b/esphomeyaml/components/fan/__init__.py index 9874c4114f..090ec463c4 100644 --- a/esphomeyaml/components/fan/__init__.py +++ b/esphomeyaml/components/fan/__init__.py @@ -47,10 +47,6 @@ FAN_SPEEDS = { } -def validate_fan_speed(value): - return vol.All(vol.Upper, cv.one_of(*FAN_SPEEDS))(value) - - def setup_fan_core_(fan_var, mqtt_var, config): if CONF_INTERNAL in config: add(fan_var.set_internal(config[CONF_INTERNAL])) @@ -111,7 +107,7 @@ CONF_FAN_TURN_ON = 'fan.turn_on' FAN_TURN_ON_ACTION_SCHEMA = maybe_simple_id({ vol.Required(CONF_ID): cv.use_variable_id(FanState), vol.Optional(CONF_OSCILLATING): cv.templatable(cv.boolean), - vol.Optional(CONF_SPEED): cv.templatable(validate_fan_speed), + vol.Optional(CONF_SPEED): cv.templatable(cv.one_of(*FAN_SPEEDS, upper=True)), }) diff --git a/esphomeyaml/components/light/fastled_clockless.py b/esphomeyaml/components/light/fastled_clockless.py index c779f4ceed..4ee12dc78d 100644 --- a/esphomeyaml/components/light/fastled_clockless.py +++ b/esphomeyaml/components/light/fastled_clockless.py @@ -58,12 +58,12 @@ MakeFastLEDLight = Application.struct('MakeFastLEDLight') PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ 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): cv.one_of(*TYPES, upper=True), vol.Required(CONF_PIN): pins.output_pin, vol.Required(CONF_NUM_LEDS): cv.positive_not_null_int, vol.Optional(CONF_MAX_REFRESH_RATE): cv.positive_time_period_microseconds, - vol.Optional(CONF_RGB_ORDER): vol.All(vol.Upper, cv.one_of(*RGB_ORDERS)), + vol.Optional(CONF_RGB_ORDER): cv.one_of(*RGB_ORDERS, upper=True), vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, vol.Optional(CONF_COLOR_CORRECT): vol.All([cv.percentage], vol.Length(min=3, max=3)), diff --git a/esphomeyaml/components/light/fastled_spi.py b/esphomeyaml/components/light/fastled_spi.py index bd4df644e3..70b256bbb9 100644 --- a/esphomeyaml/components/light/fastled_spi.py +++ b/esphomeyaml/components/light/fastled_spi.py @@ -35,12 +35,12 @@ MakeFastLEDLight = Application.struct('MakeFastLEDLight') PLATFORM_SCHEMA = cv.nameable(light.LIGHT_PLATFORM_SCHEMA.extend({ 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): cv.one_of(*CHIPSETS, upper=True), vol.Required(CONF_DATA_PIN): pins.output_pin, vol.Required(CONF_CLOCK_PIN): pins.output_pin, vol.Required(CONF_NUM_LEDS): cv.positive_not_null_int, - vol.Optional(CONF_RGB_ORDER): vol.All(vol.Upper, cv.one_of(*RGB_ORDERS)), + vol.Optional(CONF_RGB_ORDER): cv.one_of(*RGB_ORDERS, upper=True), vol.Optional(CONF_MAX_REFRESH_RATE): cv.positive_time_period_microseconds, vol.Optional(CONF_GAMMA_CORRECT): cv.positive_float, diff --git a/esphomeyaml/components/logger.py b/esphomeyaml/components/logger.py index 839d371d56..0509864bc0 100644 --- a/esphomeyaml/components/logger.py +++ b/esphomeyaml/components/logger.py @@ -32,7 +32,7 @@ LOG_LEVEL_TO_ESP_LOG = { LOG_LEVEL_SEVERITY = ['NONE', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'VERBOSE', 'VERY_VERBOSE'] # pylint: disable=invalid-name -is_log_level = vol.All(vol.Upper, cv.one_of(*LOG_LEVELS)) +is_log_level = cv.one_of(*LOG_LEVELS, upper=True) def validate_local_no_higher_than_global(value): @@ -109,7 +109,7 @@ CONF_LOGGER_LOG = 'logger.log' LOGGER_LOG_ACTION_SCHEMA = vol.All(maybe_simple_message({ vol.Required(CONF_FORMAT): cv.string, vol.Optional(CONF_ARGS, default=list): vol.All(cv.ensure_list, [cv.lambda_]), - vol.Optional(CONF_LEVEL, default="DEBUG"): vol.All(vol.Upper, cv.one_of(*LOG_LEVEL_TO_ESP_LOG)), + vol.Optional(CONF_LEVEL, default="DEBUG"): cv.one_of(*LOG_LEVEL_TO_ESP_LOG, upper=True), vol.Optional(CONF_TAG, default="main"): cv.string, }), validate_printf) diff --git a/esphomeyaml/components/my9231.py b/esphomeyaml/components/my9231.py index a52e1b1033..a3259d3c68 100644 --- a/esphomeyaml/components/my9231.py +++ b/esphomeyaml/components/my9231.py @@ -20,8 +20,7 @@ MY9231_SCHEMA = vol.Schema({ vol.Range(3, 1020)), vol.Optional(CONF_NUM_CHIPS): vol.All(vol.Coerce(int), vol.Range(1, 255)), - vol.Optional(CONF_BIT_DEPTH): vol.All(vol.Coerce(int), - cv.one_of(8, 12, 14, 16)), + vol.Optional(CONF_BIT_DEPTH): cv.one_of(8, 12, 14, 16, int=True), vol.Optional(CONF_UPDATE_ON_BOOT): vol.Coerce(bool), }).extend(cv.COMPONENT_SCHEMA.schema) diff --git a/esphomeyaml/components/remote_receiver.py b/esphomeyaml/components/remote_receiver.py index 878e5a6fc5..7e143d4823 100644 --- a/esphomeyaml/components/remote_receiver.py +++ b/esphomeyaml/components/remote_receiver.py @@ -40,7 +40,7 @@ CONFIG_SCHEMA = vol.All(cv.ensure_list, [vol.Schema({ vol.Required(CONF_PIN): pins.gpio_input_pin_schema, vol.Optional(CONF_DUMP, default=[]): vol.Any(validate_dumpers_all, - vol.All(cv.ensure_list, [vol.All(vol.Lower, cv.one_of(*DUMPERS))])), + vol.All(cv.ensure_list, [cv.one_of(*DUMPERS, lower=True)])), 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, diff --git a/esphomeyaml/components/remote_transmitter.py b/esphomeyaml/components/remote_transmitter.py index 144ac2bfdf..49d1abf4b3 100644 --- a/esphomeyaml/components/remote_transmitter.py +++ b/esphomeyaml/components/remote_transmitter.py @@ -61,17 +61,15 @@ RC_SWITCH_TYPE_B_SCHEMA = vol.Schema({ vol.Optional(CONF_PROTOCOL, default=1): RC_SWITCH_PROTOCOL_SCHEMA, }) RC_SWITCH_TYPE_C_SCHEMA = vol.Schema({ - vol.Required(CONF_FAMILY): vol.All( - cv.string, vol.Lower, - cv.one_of('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', - 'p')), + vol.Required(CONF_FAMILY): cv.one_of('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', + 'l', 'm', 'n', 'o', 'p', lower=True), vol.Required(CONF_GROUP): vol.All(cv.uint8_t, vol.Range(min=1, max=4)), vol.Required(CONF_DEVICE): vol.All(cv.uint8_t, vol.Range(min=1, max=4)), vol.Required(CONF_STATE): cv.boolean, vol.Optional(CONF_PROTOCOL, default=1): RC_SWITCH_PROTOCOL_SCHEMA, }) RC_SWITCH_TYPE_D_SCHEMA = vol.Schema({ - vol.Required(CONF_GROUP): vol.All(cv.string, vol.Lower, cv.one_of('a', 'b', 'c', 'd')), + vol.Required(CONF_GROUP): cv.one_of('a', 'b', 'c', 'd', lower=True), vol.Required(CONF_DEVICE): vol.All(cv.uint8_t, vol.Range(min=1, max=3)), vol.Required(CONF_STATE): cv.boolean, vol.Optional(CONF_PROTOCOL, default=1): RC_SWITCH_PROTOCOL_SCHEMA, diff --git a/esphomeyaml/components/sensor/adc.py b/esphomeyaml/components/sensor/adc.py index f629ee3d4d..5c3cc1cd3c 100644 --- a/esphomeyaml/components/sensor/adc.py +++ b/esphomeyaml/components/sensor/adc.py @@ -29,7 +29,8 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(ADCSensorComponent), cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeADCSensor), 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, + lower=True)), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema)) diff --git a/esphomeyaml/components/sensor/bme280.py b/esphomeyaml/components/sensor/bme280.py index 23e395f6ef..b0d0331aff 100644 --- a/esphomeyaml/components/sensor/bme280.py +++ b/esphomeyaml/components/sensor/bme280.py @@ -28,7 +28,7 @@ IIR_FILTER_OPTIONS = { } BME280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ - vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)), + vol.Optional(CONF_OVERSAMPLING): cv.one_of(*OVERSAMPLING_OPTIONS, upper=True), }) MakeBME280Sensor = Application.struct('MakeBME280Sensor') @@ -51,7 +51,7 @@ PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ vol.Required(CONF_HUMIDITY): cv.nameable(BME280_OVERSAMPLING_SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(BME280HumiditySensor), })), - vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), + vol.Optional(CONF_IIR_FILTER): cv.one_of(*IIR_FILTER_OPTIONS, upper=True), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) diff --git a/esphomeyaml/components/sensor/bme680.py b/esphomeyaml/components/sensor/bme680.py index 71778574a1..4aeafa3e9e 100644 --- a/esphomeyaml/components/sensor/bme680.py +++ b/esphomeyaml/components/sensor/bme680.py @@ -33,7 +33,7 @@ IIR_FILTER_OPTIONS = { } BME680_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ - vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)), + vol.Optional(CONF_OVERSAMPLING): cv.one_of(*OVERSAMPLING_OPTIONS, upper=True), }) MakeBME680Sensor = Application.struct('MakeBME680Sensor') @@ -61,7 +61,7 @@ PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ vol.Required(CONF_GAS_RESISTANCE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(BME680GasResistanceSensor), })), - vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), + vol.Optional(CONF_IIR_FILTER): cv.one_of(*IIR_FILTER_OPTIONS, upper=True), vol.Optional(CONF_HEATER): vol.Any(None, vol.All(vol.Schema({ vol.Optional(CONF_TEMPERATURE, default=320): vol.All(vol.Coerce(int), vol.Range(200, 400)), vol.Optional(CONF_DURATION, default='150ms'): vol.All( diff --git a/esphomeyaml/components/sensor/bmp280.py b/esphomeyaml/components/sensor/bmp280.py index 35d30403d8..6101659106 100644 --- a/esphomeyaml/components/sensor/bmp280.py +++ b/esphomeyaml/components/sensor/bmp280.py @@ -28,7 +28,7 @@ IIR_FILTER_OPTIONS = { } BMP280_OVERSAMPLING_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ - vol.Optional(CONF_OVERSAMPLING): vol.All(vol.Upper, cv.one_of(*OVERSAMPLING_OPTIONS)), + vol.Optional(CONF_OVERSAMPLING): cv.one_of(*OVERSAMPLING_OPTIONS, upper=True), }) MakeBMP280Sensor = Application.struct('MakeBMP280Sensor') @@ -46,7 +46,7 @@ PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ vol.Required(CONF_PRESSURE): cv.nameable(BMP280_OVERSAMPLING_SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(BMP280PressureSensor), })), - vol.Optional(CONF_IIR_FILTER): vol.All(vol.Upper, cv.one_of(*IIR_FILTER_OPTIONS)), + vol.Optional(CONF_IIR_FILTER): cv.one_of(*IIR_FILTER_OPTIONS, upper=True), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) diff --git a/esphomeyaml/components/sensor/dht.py b/esphomeyaml/components/sensor/dht.py index a13d0f0fdd..3d8b4be963 100644 --- a/esphomeyaml/components/sensor/dht.py +++ b/esphomeyaml/components/sensor/dht.py @@ -34,7 +34,7 @@ PLATFORM_SCHEMA = sensor.PLATFORM_SCHEMA.extend({ vol.Required(CONF_HUMIDITY): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(DHTHumiditySensor), })), - vol.Optional(CONF_MODEL): vol.All(vol.Upper, cv.one_of(*DHT_MODELS)), + vol.Optional(CONF_MODEL): cv.one_of(*DHT_MODELS, upper=True), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema) diff --git a/esphomeyaml/components/sensor/hmc5883l.py b/esphomeyaml/components/sensor/hmc5883l.py index a4ed04cf0a..e5ba7ddc5a 100644 --- a/esphomeyaml/components/sensor/hmc5883l.py +++ b/esphomeyaml/components/sensor/hmc5883l.py @@ -37,7 +37,7 @@ def validate_range(value): value = cv.string(value) if value.endswith(u'µT') or value.endswith('uT'): value = value[:-2] - return cv.one_of(*HMC5883L_RANGES)(int(value)) + return cv.one_of(*HMC5883L_RANGES, int=True)(value) SENSOR_KEYS = [CONF_FIELD_STRENGTH_X, CONF_FIELD_STRENGTH_Y, CONF_FIELD_STRENGTH_Z, diff --git a/esphomeyaml/components/sensor/hx711.py b/esphomeyaml/components/sensor/hx711.py index 9f35e31cca..38e32393bc 100644 --- a/esphomeyaml/components/sensor/hx711.py +++ b/esphomeyaml/components/sensor/hx711.py @@ -24,7 +24,7 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeHX711Sensor), vol.Required(CONF_DOUT_PIN): pins.gpio_input_pin_schema, vol.Required(CONF_CLK_PIN): pins.gpio_output_pin_schema, - vol.Optional(CONF_GAIN): vol.All(cv.int_, cv.one_of(*GAINS)), + vol.Optional(CONF_GAIN): cv.one_of(*GAINS, int=True), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema)) diff --git a/esphomeyaml/components/sensor/pmsx003.py b/esphomeyaml/components/sensor/pmsx003.py index fe4f2bc089..9858e4a66b 100644 --- a/esphomeyaml/components/sensor/pmsx003.py +++ b/esphomeyaml/components/sensor/pmsx003.py @@ -48,7 +48,7 @@ PMSX003_SENSOR_SCHEMA = sensor.SENSOR_SCHEMA.extend({ PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(PMSX003Component), cv.GenerateID(CONF_UART_ID): cv.use_variable_id(UARTComponent), - vol.Required(CONF_TYPE): vol.All(vol.Upper, cv.one_of(*PMSX003_TYPES)), + vol.Required(CONF_TYPE): cv.one_of(*PMSX003_TYPES, upper=True), vol.Optional(CONF_PM_1_0): cv.nameable(PMSX003_SENSOR_SCHEMA), vol.Optional(CONF_PM_2_5): cv.nameable(PMSX003_SENSOR_SCHEMA), diff --git a/esphomeyaml/components/sensor/pulse_counter.py b/esphomeyaml/components/sensor/pulse_counter.py index b73d62123e..95c17102d8 100644 --- a/esphomeyaml/components/sensor/pulse_counter.py +++ b/esphomeyaml/components/sensor/pulse_counter.py @@ -16,7 +16,7 @@ COUNT_MODES = { 'DECREMENT': PulseCounterCountMode.PULSE_COUNTER_DECREMENT, } -COUNT_MODE_SCHEMA = vol.All(vol.Upper, cv.one_of(*COUNT_MODES)) +COUNT_MODE_SCHEMA = cv.one_of(*COUNT_MODES, upper=True) PulseCounterBase = sensor.sensor_ns.class_('PulseCounterBase') MakePulseCounterSensor = Application.struct('MakePulseCounterSensor') diff --git a/esphomeyaml/components/sensor/rotary_encoder.py b/esphomeyaml/components/sensor/rotary_encoder.py index 1be3d44803..4713b2b821 100644 --- a/esphomeyaml/components/sensor/rotary_encoder.py +++ b/esphomeyaml/components/sensor/rotary_encoder.py @@ -27,7 +27,7 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ vol.Required(CONF_PIN_A): 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_RESOLUTION): vol.All(cv.string, cv.one_of(*RESOLUTIONS)), + vol.Optional(CONF_RESOLUTION): cv.one_of(*RESOLUTIONS, string=True), }).extend(cv.COMPONENT_SCHEMA.schema)) diff --git a/esphomeyaml/components/sensor/tcs34725.py b/esphomeyaml/components/sensor/tcs34725.py index 8322e1f054..7082bc1ba1 100644 --- a/esphomeyaml/components/sensor/tcs34725.py +++ b/esphomeyaml/components/sensor/tcs34725.py @@ -62,8 +62,8 @@ PLATFORM_SCHEMA = vol.All(sensor.PLATFORM_SCHEMA.extend({ vol.Optional(CONF_COLOR_TEMPERATURE): cv.nameable(sensor.SENSOR_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(TCS35725ColorTemperatureSensor), })), - vol.Optional(CONF_INTEGRATION_TIME): cv.one_of(*TCS34725_INTEGRATION_TIMES), - vol.Optional(CONF_GAIN): vol.All(vol.Upper, cv.one_of(*TCS34725_GAINS)), + vol.Optional(CONF_INTEGRATION_TIME): cv.one_of(*TCS34725_INTEGRATION_TIMES, lower=True), + vol.Optional(CONF_GAIN): vol.All(vol.Upper, cv.one_of(*TCS34725_GAINS), upper=True), vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema), cv.has_at_least_one_key(*SENSOR_KEYS)) diff --git a/esphomeyaml/components/sensor/tsl2561.py b/esphomeyaml/components/sensor/tsl2561.py index 53112efc46..30b7940d62 100644 --- a/esphomeyaml/components/sensor/tsl2561.py +++ b/esphomeyaml/components/sensor/tsl2561.py @@ -40,7 +40,7 @@ PLATFORM_SCHEMA = cv.nameable(sensor.SENSOR_PLATFORM_SCHEMA.extend({ cv.GenerateID(CONF_MAKE_ID): cv.declare_variable_id(MakeTSL2561Sensor), vol.Optional(CONF_ADDRESS, default=0x39): cv.i2c_address, vol.Optional(CONF_INTEGRATION_TIME): validate_integration_time, - vol.Optional(CONF_GAIN): vol.All(vol.Upper, cv.one_of(*GAINS)), + vol.Optional(CONF_GAIN): cv.one_of(*GAINS, upper=True), vol.Optional(CONF_IS_CS_PACKAGE): cv.boolean, vol.Optional(CONF_UPDATE_INTERVAL): cv.update_interval, }).extend(cv.COMPONENT_SCHEMA.schema)) diff --git a/esphomeyaml/components/switch/remote_transmitter.py b/esphomeyaml/components/switch/remote_transmitter.py index effa4121d5..c6320d2cc8 100644 --- a/esphomeyaml/components/switch/remote_transmitter.py +++ b/esphomeyaml/components/switch/remote_transmitter.py @@ -42,7 +42,7 @@ PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ cv.GenerateID(): cv.declare_variable_id(RemoteTransmitter), 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_NBITS, default=28): cv.one_of(28, 32, int=True), }), vol.Optional(CONF_NEC): vol.Schema({ vol.Required(CONF_ADDRESS): cv.hex_uint16_t, @@ -53,7 +53,7 @@ PLATFORM_SCHEMA = cv.nameable(switch.SWITCH_PLATFORM_SCHEMA.extend({ }), 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_NBITS, default=12): cv.one_of(12, 15, 20, int=True), }), vol.Optional(CONF_PANASONIC): vol.Schema({ vol.Required(CONF_ADDRESS): cv.hex_uint16_t, diff --git a/esphomeyaml/components/wifi.py b/esphomeyaml/components/wifi.py index a627f9bb73..4f160b366e 100644 --- a/esphomeyaml/components/wifi.py +++ b/esphomeyaml/components/wifi.py @@ -86,7 +86,7 @@ CONFIG_SCHEMA = vol.All(vol.Schema({ vol.Optional(CONF_HOSTNAME): cv.hostname, vol.Optional(CONF_DOMAIN, default='.local'): cv.domain_name, vol.Optional(CONF_REBOOT_TIMEOUT): cv.positive_time_period_milliseconds, - vol.Optional(CONF_POWER_SAVE_MODE): vol.All(vol.Upper, cv.one_of(*WIFI_POWER_SAVE_MODES)), + vol.Optional(CONF_POWER_SAVE_MODE): cv.one_of(*WIFI_POWER_SAVE_MODES, upper=True), }), validate) diff --git a/esphomeyaml/config_validation.py b/esphomeyaml/config_validation.py index dac218c76b..6a6cac907f 100644 --- a/esphomeyaml/config_validation.py +++ b/esphomeyaml/config_validation.py @@ -584,10 +584,22 @@ def valid(value): return value -def one_of(*values): +def one_of(*values, **kwargs): options = u', '.join(u"'{}'".format(x) for x in values) + lower = kwargs.get('lower', False) + upper = kwargs.get('upper', False) + string_ = kwargs.get('string', False) or lower or upper + to_int = kwargs.get('int', False) def validator(value): + if string_: + value = string(value) + if to_int: + value = int_(value) + if lower: + value = vol.Lower(value) + if upper: + value = vol.Upper(value) if value not in values: raise vol.Invalid(u"Unknown value '{}', must be one of {}".format(value, options)) return value diff --git a/esphomeyaml/core_config.py b/esphomeyaml/core_config.py index cbeea9e486..0890b54b04 100644 --- a/esphomeyaml/core_config.py +++ b/esphomeyaml/core_config.py @@ -158,15 +158,15 @@ def default_build_path(): CONFIG_SCHEMA = vol.Schema({ vol.Required(CONF_NAME): cv.valid_name, - vol.Required(CONF_PLATFORM): vol.All(vol.Upper, cv.one_of('ESP8266', 'ESPRESSIF8266', - 'ESP32', 'ESPRESSIF32')), + vol.Required(CONF_PLATFORM): cv.one_of('ESP8266', 'ESPRESSIF8266', 'ESP32', 'ESPRESSIF32', + upper=True), vol.Required(CONF_BOARD): validate_board, vol.Optional(CONF_ESPHOMELIB_VERSION, default='latest'): ESPHOMELIB_VERSION_SCHEMA, vol.Optional(CONF_ARDUINO_VERSION, default='recommended'): validate_arduino_version, vol.Optional(CONF_USE_CUSTOM_CODE, default=False): cv.boolean, vol.Optional(CONF_BUILD_PATH, default=default_build_path): cv.string, - vol.Optional(CONF_BOARD_FLASH_MODE): vol.All(vol.Lower, cv.one_of(*BUILD_FLASH_MODES)), + vol.Optional(CONF_BOARD_FLASH_MODE): cv.one_of(*BUILD_FLASH_MODES, lower=True), vol.Optional(CONF_ON_BOOT): automation.validate_automation({ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_variable_id(StartupTrigger), vol.Optional(CONF_PRIORITY): vol.Coerce(float), diff --git a/esphomeyaml/pins.py b/esphomeyaml/pins.py index 8d736ee9b2..0734a4f8fe 100644 --- a/esphomeyaml/pins.py +++ b/esphomeyaml/pins.py @@ -254,11 +254,10 @@ PIN_MODES_ESP32 = [ def pin_mode(value): - value = vol.All(vol.Coerce(str), vol.Upper)(value) if core.ESP_PLATFORM == ESP_PLATFORM_ESP32: - return cv.one_of(*PIN_MODES_ESP32)(value) + return cv.one_of(*PIN_MODES_ESP32, upper=True)(value) elif core.ESP_PLATFORM == ESP_PLATFORM_ESP8266: - return cv.one_of(*PIN_MODES_ESP8266)(value) + return cv.one_of(*PIN_MODES_ESP8266, upper=True)(value) raise vol.Invalid(u"Invalid ESP platform.") @@ -291,12 +290,12 @@ PCF8574Component = io_ns.class_('PCF8574Component', Component, I2CDevice) PCF8574_OUTPUT_PIN_SCHEMA = vol.Schema({ vol.Required(CONF_PCF8574): cv.use_variable_id(PCF8574Component), vol.Required(CONF_NUMBER): vol.Coerce(int), - vol.Optional(CONF_MODE): vol.All(vol.Upper, cv.one_of("OUTPUT")), + vol.Optional(CONF_MODE): cv.one_of("OUTPUT", upper=True), vol.Optional(CONF_INVERTED, default=False): cv.boolean, }) PCF8574_INPUT_PIN_SCHEMA = PCF8574_OUTPUT_PIN_SCHEMA.extend({ - vol.Optional(CONF_MODE): vol.All(vol.Upper, cv.one_of("INPUT", "INPUT_PULLUP")), + vol.Optional(CONF_MODE): cv.one_of("INPUT", "INPUT_PULLUP", upper=True), }) From db90a7a334e3b55a767866655d7d097ab8db6fd3 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Fri, 23 Nov 2018 13:51:39 +0100 Subject: [PATCH 4/5] Add Logo and Icon to HassIO add-on (#241) --- esphomeyaml-beta/icon.png | Bin 0 -> 2892 bytes esphomeyaml-beta/logo.png | Bin 0 -> 5605 bytes esphomeyaml-edge/icon.png | Bin 0 -> 2892 bytes esphomeyaml-edge/logo.png | Bin 0 -> 5605 bytes esphomeyaml/icon.png | Bin 0 -> 2892 bytes esphomeyaml/logo.png | Bin 0 -> 5605 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 esphomeyaml-beta/icon.png create mode 100644 esphomeyaml-beta/logo.png create mode 100644 esphomeyaml-edge/icon.png create mode 100644 esphomeyaml-edge/logo.png create mode 100644 esphomeyaml/icon.png create mode 100644 esphomeyaml/logo.png diff --git a/esphomeyaml-beta/icon.png b/esphomeyaml-beta/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6018ac5fc759ba525ed66fbd1482dbe4448e46bb GIT binary patch literal 2892 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 C$R%I^ literal 0 HcmV?d00001 diff --git a/esphomeyaml-beta/logo.png b/esphomeyaml-beta/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a202ef0a28a0c097e95883599b51e2f733359936 GIT binary patch literal 5605 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 literal 0 HcmV?d00001 diff --git a/esphomeyaml-edge/icon.png b/esphomeyaml-edge/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6018ac5fc759ba525ed66fbd1482dbe4448e46bb GIT binary patch literal 2892 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 C$R%I^ literal 0 HcmV?d00001 diff --git a/esphomeyaml-edge/logo.png b/esphomeyaml-edge/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a202ef0a28a0c097e95883599b51e2f733359936 GIT binary patch literal 5605 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt010qNS#tmY6%%vJw&!)`TtW0TkI35k)|$MHK7ORzztnYNfW~ z(zj}_*47Hh|8~<|o@|}` zv>renGV)3ky8W}$5+E#hna&!MF3-}*mK&=9c>KjH5sJ^zLI`NQKn<&EmI zdr9QWpPJ_!x}ocVVOjeYMZU4vH1EKO-enh!>zZq?SU`jj;vH>pKth@nqTAGJ=WN%$P9v2ST zjZ=8*>V?OR!{ZT7*;7|9+-~7;dW5GnbGS5l$e|bV4&UM~Um8*U(%9cox-p#uT>!ir` z{jSdR4;3F$80wM?CA;>Va9cX{%?ww@N^*7=c`fbw^fos+KKr-qF0^T^odynR3&5FN zB~%fHzTtpt>W2M~by5zHK67?)!z)!Ifj@|2fA&c`>8>5>g*@vfC;0c!X37R%g8E^c#bU8o ztnZ3bFK0ynkT7Yp5JD8cIw%r=m~m?wWwU#x`AtFCfCV-ogxHW8WwBT+7IQ{{5JDX6 zqL5MTw+bOjKbqLyXQYjNUa1m|_p(tO_+z&)08QHTgF*;#@K4>t0Hn6}?NKi~UwiJv z@B#pG_zv|k=(X10|E2oqr+wk}$U;1(P?7g{S2?B8yBY!V`>$0&T*kMmwDI{w^|4C& zo5IF>%Bhs*Z5SRf5*?NcdCl;Eg-QBA4&b^ZT{VqydbtoH+v0!lun;c4pkx^8`^Er6d++1Q}D@5chfWoBi@185#|2$Ai#X^9FT@jlYBNr-0@Ai~WG zyV6WWCceEyj<%}T9i8{2SxpZ*dTu~ka35lybL`pFW}m2iW;Gbc-__MDYIEM+Ad@%y zJu@Jd{0K2KCZ&YgPp){Qh!ZCw@9a%lKV40}7Xj%v4o{XUw|=wJ3)}y+C_XUbkB~OB zUrf!u>?6RQg)b-q_s;vf8;ql-^tNzj-#@;s$Mt%`qZ&vU z2=8BU=7>z2b`~@IY++$q|GwSh^|qX)+hxS!Tdo59d#PKEls>GNsVZmP31Izghh0*} zkX}(|_N+S&Z2M?d3w_A!W;CR3mVsLfo7Ir_jS%sIujAzHfaxnCgs2<>(i1+*{aFkU z^{o)KCFM(_0MqmXiU~RSq#4l8QE3PXkL>XXA>_TcNI>@@Wo&H%V4YL#tJS?84!LyTw8Q^~Yqk-{JRSg~*D8 zLI@#FwFkN_cl*XpjQ~jd#BXj(M+5qWz8Js&@d3~DoCd7l3nAng!1%g`Nab4SobTgN zv_k{mC+=m223 z9(#xiul&6o1_q)EX`sPL(UByGv=n1oGDz_a(vTrdv#5qxX9cU74u~!TRW)IN^)yt;8lZ4H7;g%MO({JKA;)2a{#k1% zS?!xo{<@l|@j>#yP8yk7^|h%g|C6$e4kXpOSrK+zmFF&gs57L3+}zyU+}wSoO`meS zG`rrPZX<=rXlrtSo|-y;b0kK9Eg!IE0iWN!to)qp^y>%gtqwMnXaJl5)!Tq>jf$EB zx&hnm!QP9DY)o6D0H+MFuL5Gy>l-*0$w0mhu#DHjDxdg@Rzv@RL8gw>f-Hw9s<$zm z&A;qwQKnw-`bGuvqu-cO-I}XLrfOuIRYA*U4gZzY0jZ7lt4jqc zYzfW3cvh7Muy1bC={y6_@%s7Hth`PG*#G4sbxh!xZT@EG=~{=RH^$g6!fjBaJVf5& zQWP+Kn!1Ab+Fu-v)bgLw-(!MIRTs26Y?n2lo!0iH?Ovc_&D!J}?jIOhMv*!f@;R;{ zYds)Yny41wwzu$3GU)T}dH~({k84?TDh0^f4A*t`4{x5cw$@){I|trB8Ibs^3N`{r z#o-fGzQtM4?vz?Nb?r*4VnUom!ie=j?0deBJ)ld97thtL@Nq4T) z=>lzD0=f)qT!FdTn`YfHl}u;aUivF``M8*dGG4oqA`^iZyvopy&zR)KL6Xxj`S@JkKT_ zh?*u51)z^;+1|C`K%dtlM6fs~cHAc6SUE9_vTvZzRlc#Ej~@l=m>b$hXhHksbM6bR zAdLViomHU7@KEDGDk|03XdlV3L8r1B!C4ymmfkdU=!}h@uPcYzIYYaJ2%QUn*qG*d zPK>C8V;(i@oAmM>UcpNu*DT70uX)5H}@J$xy$y+0~LJE&lX+Ape^X50q~QxA)@Q% zLe?JJ;Jb$tntjMPvhAe3u-j<}I=nFtq^rW4UnqLOMmVtL7FE}_13*@I3pd|Ax|GuF z%;1Az6F#?lSKfE>I~bYa>pN5qNn=_lm;W3Pt+Z%`kJI^5FhAg9BZN`XU-O}xT}vN4 zJ3(1ylSJE_eGp`f+zXX1L$Jxq->HM-QRni-qZZUs_uhzrtEpX73vI4#>E=84%*OlC zEos3=hxGh`AM$n{C){tMsB}ZrMf&t?5J1vq9+v>5O`EG5K@j=Ni~udtLS43x?2?CT zPKHV@Cq)WS{?tj0+-*>b>RhR^CT}3;te=|=jPD*aoRk8cS6}@ttbS{ze-iQj*T4;# zq2E*WN`Z+iP#^ zq(f5kfS4xKD77qG6T7OLa)(MgHKE*C`#YZ!6il0Si{b;kM^`QC^llU&BXi`l8OnQk z*+Az&KxBU{<{BlaJn_m~9_Tz(4=$(1<^^1JvL;*uZl`3E0hiq?g=?dyZLP-jH{CSF zY1kJ&=YZs?25>v2S{ZQFN>YTRdaqXFr)#}{yGAdCYq(|69>k*h$1^p);?I)ozy7>| zv$1cT79ZBa%?+26oy-o3KYCVS*Y@$7G6-9p)`-)kwF|&e@6j10aJsa0!Dy$$tusoZ zUe-AP*=CpZhR}cJ>rt)7$RtZ4os;F8~P6DfriMt# z>o~CXcH&=2p#6;B)ZtmOdCahmVfIsdw(hLrwW}Mxv(bI%XOu#lv4KnEtG+^>=e#R5 z+*7%0$x1s={(yeeqx!}F)K%1h_pKG)tXUDT=rdiF4a9=g-XTvI;iFG<)iuDP_1^wZ zMb~FQrTu|Nk>fE_==gytG%sKr(x>Mh%ct1^el*y>9b8D>-B@f>{ z2+(xA>8{B`ET}F`{I}P7Yr7;R`ZT}b6hesSRO#w|A;f!u6Jc5_geaXN0Yvs3HL7PM zfc}wMA%s{E(B7mXA;f%DE&G%ZVqsvOHphez^)r>zu8*`tD9LK%r-AK!WB{0C5A=MS z0FX3n+~{sb@O^M-vcrFc3vgYv5aM?M`evID;&GK>KO;(e1;}5zo4LXj(Wy%LL;fQF z{KD%dmEUXLetZWY*Zcf}b;84u5Iz&-6Dd3++iTgw`} z|A$`=i}RupNJ2=GkdPY@k|dCX(Ad}9wy04Wk7xh-ZHH^*u=tGrgVI$ctGe%3?Jjd` zBRX6&x?95mS$AtSQJ?hQvg>fA+mzbps)j=F!Ce2D62@U>IKIozrwAMDi*hP9f1h*O zNqF*r5rh0G;jx^C=ORXgH=@nMjBq^1uOT9QgfFnD+_G`cDW}HNE_2|3CP~!SlWqLz z`Nn-GSAKWICM9OwJXn8pw*W+Hf6cywehG`jL3-GGsDW;qrGwl94Rpd_z4PBy{_V*f z`${2wh`O!stI;LKV>A<;6i$q!PmCkngf%Ig7%8kx91$jB+8D|B?Cf`)H6^Di>(09J z^wgd{da}x)?#i}+d6f{dqt0e`xA;ph-nx>4qh)sar+#@xwpSLHR6EWdcu7P2=3x6P zwf*EpL$r|JpgPcNK3o-Y>ep@ zu4@ye?c5_ypLC(CotIPFo`ZfuC&kQx%%efhj1Ti34ocMDgfr*>cc`XNWxw%WH3t?ZiIedFu7 zo~~x;&73to%s*}Ui%`G5aIJ7P+?aZ)R}E>*b`LXK?<;ryCDGh{h1fB~95bz|{^e{ofU~=ds&~3KjA1WTc#^s??OL3S&o?%cbRF2{6V&6 z`+h8=!y{*;U&@95i@$a9U;MqSv2hKj!4z}3$whNVrtg#(I$hdh+WJ%Dm)S{Z6+tT?t*x2%|69q` zLuliFNB{r;C3HntbYx+4WjbSWWnpw>05UK!I4vppnF*q$TF)cAUR53U@FgH3iF)J`JIxsLP#PlZs z000?uMObuGZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs00000NkvXXu0mjf&VuZB literal 0 HcmV?d00001 diff --git a/esphomeyaml/icon.png b/esphomeyaml/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6018ac5fc759ba525ed66fbd1482dbe4448e46bb GIT binary patch literal 2892 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 C$R%I^ literal 0 HcmV?d00001 diff --git a/esphomeyaml/logo.png b/esphomeyaml/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a202ef0a28a0c097e95883599b51e2f733359936 GIT binary patch literal 5605 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 literal 0 HcmV?d00001 From 5d5529ff15e8d7d87ace4a077f4c8044d8d56445 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Sun, 25 Nov 2018 18:00:20 +0100 Subject: [PATCH 5/5] Bump HassIO version to v1.9.2 --- esphomeyaml-beta/config.json | 2 +- esphomeyaml/config.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphomeyaml-beta/config.json b/esphomeyaml-beta/config.json index bed0cada3d..cf90f84b56 100644 --- a/esphomeyaml-beta/config.json +++ b/esphomeyaml-beta/config.json @@ -1,6 +1,6 @@ { "name": "esphomeyaml-beta", - "version": "1.9.1", + "version": "1.9.2", "slug": "esphomeyaml-beta", "description": "Beta version of esphomeyaml HassIO add-on.", "url": "https://beta.esphomelib.com/esphomeyaml/index.html", diff --git a/esphomeyaml/config.json b/esphomeyaml/config.json index 31702787a8..539f1dc215 100644 --- a/esphomeyaml/config.json +++ b/esphomeyaml/config.json @@ -1,6 +1,6 @@ { "name": "esphomeyaml", - "version": "1.9.1", + "version": "1.9.2", "slug": "esphomeyaml", "description": "esphomeyaml HassIO add-on for intelligently managing all your ESP8266/ESP32 devices.", "url": "https://esphomelib.com/esphomeyaml/index.html",