Add ESP32 Ethernet Support (#301)

* Fix

* Build flags

* Fix
This commit is contained in:
Otto Winter 2019-01-05 20:47:33 +01:00 committed by GitHub
parent 3f4bba57f4
commit e72ef9e061
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 98 additions and 10 deletions

View file

@ -23,7 +23,8 @@ from esphomeyaml.util import run_external_command, safe_print
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
PRE_INITIALIZE = ['esphomeyaml', 'logger', 'wifi', 'ota', 'mqtt', 'web_server', 'api', 'i2c'] PRE_INITIALIZE = ['esphomeyaml', 'logger', 'wifi', 'ethernet', 'ota', 'mqtt', 'web_server', 'api',
'i2c']
def get_serial_ports(): def get_serial_ports():

View file

@ -0,0 +1,73 @@
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_HOSTNAME, CONF_ID, CONF_MANUAL_IP, CONF_TYPE, \
ESP_PLATFORM_ESP32
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
CONFLICTS_WITH = ['wifi']
ESP_PLATFORMS = [ESP_PLATFORM_ESP32]
CONF_PHY_ADDR = 'phy_addr'
CONF_MDC_PIN = 'mdc_pin'
CONF_MDIO_PIN = 'mdio_pin'
CONF_CLK_MODE = 'clk_mode'
CONF_POWER_PIN = 'power_pin'
EthernetType = esphomelib_ns.enum('EthernetType')
ETHERNET_TYPES = {
'LAN8720': EthernetType.ETHERNET_TYPE_LAN8720,
'TLK110': EthernetType.ETHERNET_TYPE_TLK110,
}
eth_clock_mode_t = global_ns.enum('eth_clock_mode_t')
CLK_MODES = {
'GPIO0_IN': eth_clock_mode_t.ETH_CLOCK_GPIO0_IN,
'GPIO0_OUT': eth_clock_mode_t.ETH_CLOCK_GPIO0_OUT,
'GPIO16_OUT': eth_clock_mode_t.ETH_CLOCK_GPIO16_OUT,
'GPIO17_OUT': eth_clock_mode_t.ETH_CLOCK_GPIO17_OUT,
}
EthernetComponent = esphomelib_ns.class_('EthernetComponent', Component)
CONFIG_SCHEMA = 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,
vol.Required(CONF_MDIO_PIN): pins.input_output_pin,
vol.Optional(CONF_CLK_MODE, default='GPIO0_IN'): cv.one_of(*CLK_MODES, upper=True, space='_'),
vol.Optional(CONF_PHY_ADDR, default=0): vol.All(cv.int_, vol.Range(min=0, max=31)),
vol.Optional(CONF_POWER_PIN): pins.gpio_output_pin_schema,
vol.Optional(CONF_MANUAL_IP): wifi.STA_MANUAL_IP_SCHEMA,
vol.Optional(CONF_HOSTNAME): cv.hostname,
vol.Optional(CONF_DOMAIN, default='.local'): cv.domain_name,
})
def to_code(config):
rhs = App.init_ethernet()
eth = Pvariable(config[CONF_ID], rhs)
add(eth.set_phy_addr(config[CONF_PHY_ADDR]))
add(eth.set_mdc_pin(config[CONF_MDC_PIN]))
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]]))
if CONF_POWER_PIN in config:
for pin in gpio_output_pin_expression(config[CONF_POWER_PIN]):
yield
add(eth.set_power_pin(pin))
if CONF_HOSTNAME in config:
add(eth.set_hostname(config[CONF_HOSTNAME]))
if CONF_MANUAL_IP in config:
add(eth.set_manual_ip(wifi.manual_ip(config[CONF_MANUAL_IP])))
REQUIRED_BUILD_FLAGS = '-DUSE_ETHERNET'

View file

@ -79,7 +79,6 @@ def _path_begins_with_(path, other): # type: (ConfigPath, ConfigPath) -> bool
def _path_begins_with(path, other): # type: (ConfigPath, ConfigPath) -> bool def _path_begins_with(path, other): # type: (ConfigPath, ConfigPath) -> bool
ret = _path_begins_with_(path, other) ret = _path_begins_with_(path, other)
# print('_path_begins_with({}, {}) -> {}'.format(path, other, ret))
return ret return ret
@ -262,7 +261,7 @@ def validate_config(config):
success = True success = True
conflicts_with = getattr(component, 'CONFLICTS_WITH', []) conflicts_with = getattr(component, 'CONFLICTS_WITH', [])
for conflict in conflicts_with: for conflict in conflicts_with:
if conflict not in config: if conflict in config:
result.add_error(u"Component {} cannot be used together with component {}" result.add_error(u"Component {} cannot be used together with component {}"
u"".format(domain, conflict), [domain]) u"".format(domain, conflict), [domain])
success = False success = False
@ -317,7 +316,7 @@ def validate_config(config):
success = True success = True
conflicts_with = getattr(platform, 'CONFLICTS_WITH', []) conflicts_with = getattr(platform, 'CONFLICTS_WITH', [])
for conflict in conflicts_with: for conflict in conflicts_with:
if conflict not in config: if conflict in config:
result.add_error(u"Platform {} cannot be used together with component {}" result.add_error(u"Platform {} cannot be used together with component {}"
u"".format(p_domain, conflict), [domain, i]) u"".format(p_domain, conflict), [domain, i])
success = False success = False

View file

@ -315,7 +315,13 @@ class EsphomeyamlCore(object):
def address(self): # type: () -> str def address(self): # type: () -> str
from esphomeyaml.components import wifi from esphomeyaml.components import wifi
return wifi.get_upload_host(self.config[CONF_WIFI]) if 'wifi' in self.config:
return wifi.get_upload_host(self.config[CONF_WIFI])
if 'ethernet' in self.config:
return wifi.get_upload_host(self.config['ethernet'])
return None
@property @property
def esphomelib_version(self): # type: () -> Dict[str, str] def esphomelib_version(self): # type: () -> Dict[str, str]

View file

@ -291,6 +291,6 @@ class CheckForUpdateThread(threading.Thread):
def start_update_check_thread(path): def start_update_check_thread(path):
# dummy call to strptime as python 2.7 has a bug with strptime when importing from threads # dummy call to strptime as python 2.7 has a bug with strptime when importing from threads
datetime.strptime('20180101', '%Y%m%d') datetime.strptime('20180101', '%Y%m%d')
thread = CheckForUpdateThread(path) thread = CheckForUpdateThread(os.path.abspath(path))
thread.start() thread.start()
return thread return thread

View file

@ -11,10 +11,19 @@ esphomeyaml:
substitutions: substitutions:
devicename: test2 devicename: test2
wifi: ethernet:
ssid: 'MySSID' type: LAN8720
password: 'password1' mdc_pin: GPIO23
reboot_timeout: 120s mdio_pin: GPIO24
clk_mode: GPIO0_IN
phy_addr: 0
power_pin: GPIO25
manual_ip:
static_ip: 192.168.178.56
gateway: 192.168.178.1
subnet: 255.255.255.0
hostname: helloworld
domain: .local
mqtt: mqtt:
broker: '192.168.178.84' broker: '192.168.178.84'