diff --git a/esphomeyaml/components/ethernet.py b/esphomeyaml/components/ethernet.py index 1284bc0aa7..1f26327a4a 100644 --- a/esphomeyaml/components/ethernet.py +++ b/esphomeyaml/components/ethernet.py @@ -3,8 +3,9 @@ import voluptuous as vol from esphomeyaml import pins from esphomeyaml.components import wifi import esphomeyaml.config_validation as cv -from esphomeyaml.const import CONF_DOMAIN, CONF_ID, CONF_MANUAL_IP, CONF_TYPE, \ - ESP_PLATFORM_ESP32 +from esphomeyaml.const import CONF_DOMAIN, CONF_ID, CONF_MANUAL_IP, CONF_TYPE, ESP_PLATFORM_ESP32, \ + CONF_USE_ADDRESS, CONF_STATIC_IP +from esphomeyaml.core import CORE from esphomeyaml.cpp_generator import Pvariable, add from esphomeyaml.cpp_helpers import gpio_output_pin_expression from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns @@ -34,7 +35,18 @@ CLK_MODES = { EthernetComponent = esphomelib_ns.class_('EthernetComponent', Component) -CONFIG_SCHEMA = vol.Schema({ + +def validate(config): + if CONF_USE_ADDRESS not in config: + if CONF_MANUAL_IP in config: + use_address = str(config[CONF_MANUAL_IP][CONF_STATIC_IP]) + else: + use_address = CORE.name + config[CONF_DOMAIN] + config[CONF_USE_ADDRESS] = use_address + return config + + +CONFIG_SCHEMA = vol.All(vol.Schema({ cv.GenerateID(): cv.declare_variable_id(EthernetComponent), vol.Required(CONF_TYPE): cv.one_of(*ETHERNET_TYPES, upper=True), vol.Required(CONF_MDC_PIN): pins.output_pin, @@ -44,7 +56,10 @@ CONFIG_SCHEMA = vol.Schema({ vol.Optional(CONF_POWER_PIN): pins.gpio_output_pin_schema, vol.Optional(CONF_MANUAL_IP): wifi.STA_MANUAL_IP_SCHEMA, vol.Optional(CONF_DOMAIN, default='.local'): cv.domain_name, -}) + vol.Optional(CONF_USE_ADDRESS): cv.string_strict, + + vol.Optional('hostname'): cv.invalid("The hostname option has been removed in 1.11.0"), +}), validate) def to_code(config): @@ -56,6 +71,7 @@ def to_code(config): add(eth.set_mdio_pin(config[CONF_MDIO_PIN])) add(eth.set_type(ETHERNET_TYPES[config[CONF_TYPE]])) add(eth.set_clk_mode(CLK_MODES[config[CONF_CLK_MODE]])) + add(eth.set_use_address(config[CONF_USE_ADDRESS])) if CONF_POWER_PIN in config: for pin in gpio_output_pin_expression(config[CONF_POWER_PIN]): diff --git a/esphomeyaml/components/wifi.py b/esphomeyaml/components/wifi.py index 85a20060dc..70b955919c 100644 --- a/esphomeyaml/components/wifi.py +++ b/esphomeyaml/components/wifi.py @@ -2,9 +2,9 @@ import voluptuous as vol import esphomeyaml.config_validation as cv from esphomeyaml.const import CONF_AP, CONF_BSSID, CONF_CHANNEL, CONF_DNS1, CONF_DNS2, \ - CONF_DOMAIN, \ - CONF_FAST_CONNECT, CONF_GATEWAY, CONF_HOSTNAME, CONF_ID, CONF_MANUAL_IP, CONF_NETWORKS, \ - CONF_PASSWORD, CONF_POWER_SAVE_MODE, CONF_REBOOT_TIMEOUT, CONF_SSID, CONF_STATIC_IP, CONF_SUBNET + CONF_DOMAIN, CONF_FAST_CONNECT, CONF_GATEWAY, CONF_ID, CONF_MANUAL_IP, CONF_NETWORKS, \ + CONF_PASSWORD, CONF_POWER_SAVE_MODE, CONF_REBOOT_TIMEOUT, CONF_SSID, CONF_STATIC_IP, \ + CONF_SUBNET, CONF_USE_ADDRESS from esphomeyaml.core import CORE, HexInt from esphomeyaml.cpp_generator import Pvariable, StructInitializer, add, variable from esphomeyaml.cpp_types import App, Component, esphomelib_ns, global_ns @@ -94,6 +94,13 @@ def validate(config): if len(networks) != 1: raise vol.Invalid("Fast connect can only be used with one network!") + if CONF_USE_ADDRESS not in config: + if CONF_MANUAL_IP in config: + use_address = str(config[CONF_MANUAL_IP][CONF_STATIC_IP]) + else: + use_address = CORE.name + config[CONF_DOMAIN] + config[CONF_USE_ADDRESS] = use_address + return config @@ -106,14 +113,13 @@ CONFIG_SCHEMA = vol.All(vol.Schema({ vol.Optional(CONF_MANUAL_IP): STA_MANUAL_IP_SCHEMA, vol.Optional(CONF_AP): WIFI_NETWORK_AP, - 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): cv.one_of(*WIFI_POWER_SAVE_MODES, upper=True), vol.Optional(CONF_FAST_CONNECT): cv.boolean, + vol.Optional(CONF_USE_ADDRESS): cv.string_strict, - vol.Optional(CONF_HOSTNAME): cv.invalid("The hostname option has been removed in 1.11.0, " - "now it's always the node name.") + vol.Optional('hostname'): cv.invalid("The hostname option has been removed in 1.11.0"), }), validate) @@ -152,16 +158,10 @@ def wifi_network(config, static_ip): return ap -def get_upload_host(config): - if CONF_MANUAL_IP in config: - return str(config[CONF_MANUAL_IP][CONF_STATIC_IP]) - hostname = config.get(CONF_HOSTNAME) or CORE.name - return hostname + config[CONF_DOMAIN] - - def to_code(config): rhs = App.init_wifi() wifi = Pvariable(config[CONF_ID], rhs) + add(wifi.set_use_address(config[CONF_USE_ADDRESS])) for network in config.get(CONF_NETWORKS, []): add(wifi.add_sta(wifi_network(network, config.get(CONF_MANUAL_IP)))) diff --git a/esphomeyaml/config_validation.py b/esphomeyaml/config_validation.py index 48c352178a..b6330538a6 100644 --- a/esphomeyaml/config_validation.py +++ b/esphomeyaml/config_validation.py @@ -468,7 +468,9 @@ def domain(value): def domain_name(value): - value = string(value) + value = string_strict(value) + if not value: + return value if not value.startswith('.'): raise vol.Invalid("Domain name must start with .") if value.startswith('..'): diff --git a/esphomeyaml/const.py b/esphomeyaml/const.py index 04a2ebebc6..0db0031f75 100644 --- a/esphomeyaml/const.py +++ b/esphomeyaml/const.py @@ -112,7 +112,6 @@ CONF_PAYLOAD = 'payload' CONF_QOS = 'qos' CONF_DISCOVERY_RETAIN = 'discovery_retain' CONF_TOPIC_PREFIX = 'topic_prefix' -CONF_HOSTNAME = 'hostname' CONF_PHASE_BALANCER = 'phase_balancer' CONF_ADDRESS = 'address' CONF_ENABLE_TIME = 'enable_time' @@ -403,6 +402,7 @@ CONF_FAST_CONNECT = 'fast_connect' CONF_INTERLOCK = 'interlock' CONF_ON_TURN_ON = 'on_turn_on' CONF_ON_TURN_OFF = 'on_turn_off' +CONF_USE_ADDRESS = 'use_address' ALLOWED_NAME_CHARS = u'abcdefghijklmnopqrstuvwxyz0123456789_' ARDUINO_VERSION_ESP32_DEV = 'https://github.com/platformio/platform-espressif32.git#feature/stage' diff --git a/esphomeyaml/core.py b/esphomeyaml/core.py index cd81dc5241..5ff76cc9c3 100644 --- a/esphomeyaml/core.py +++ b/esphomeyaml/core.py @@ -7,7 +7,7 @@ import os import re from esphomeyaml.const import CONF_ARDUINO_VERSION, CONF_ESPHOMELIB_VERSION, CONF_ESPHOMEYAML, \ - CONF_LOCAL, CONF_WIFI, ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266 + CONF_LOCAL, CONF_WIFI, ESP_PLATFORM_ESP32, ESP_PLATFORM_ESP8266, CONF_USE_ADDRESS from esphomeyaml.helpers import ensure_unique_string # pylint: disable=unused-import, wrong-import-order @@ -316,13 +316,11 @@ class EsphomeyamlCore(object): @property def address(self): # type: () -> str - from esphomeyaml.components import wifi - if 'wifi' in self.config: - return wifi.get_upload_host(self.config[CONF_WIFI]) + return self.config[CONF_WIFI][CONF_USE_ADDRESS] if 'ethernet' in self.config: - return wifi.get_upload_host(self.config['ethernet']) + return self.config['ethernet'][CONF_USE_ADDRESS] return None