From 0698be39956f55f02c83bd7b606f0e9f6a0b0a05 Mon Sep 17 00:00:00 2001 From: Otto Winter Date: Wed, 4 Dec 2019 16:47:34 +0100 Subject: [PATCH] Better/stricter pin validation (#903) * Better/stricter pin validation * Update tests --- esphome/pins.py | 40 ++++++++++++++++++++++++++++++---------- tests/test1.yaml | 12 ++++++------ tests/test2.yaml | 4 ++-- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/esphome/pins.py b/esphome/pins.py index 42c8548da4..9a2cf90984 100644 --- a/esphome/pins.py +++ b/esphome/pins.py @@ -289,30 +289,48 @@ def _translate_pin(value): return _lookup_pin(value) +_ESP_SDIO_PINS = { + 6: 'Flash Clock', + 7: 'Flash Data 0', + 8: 'Flash Data 1', + 11: 'Flash Command', +} + + def validate_gpio_pin(value): value = _translate_pin(value) if CORE.is_esp32: if value < 0 or value > 39: raise cv.Invalid(u"ESP32: Invalid pin number: {}".format(value)) - if 6 <= value <= 11: - _LOGGER.warning(u"ESP32: Pin %s (6-11) might already be used by the " - u"flash interface. Be warned.", value) + if value in _ESP_SDIO_PINS: + raise cv.Invalid("This pin cannot be used on ESP32s and is already used by " + "the flash interface (function: {})".format(_ESP_SDIO_PINS[value])) + if 9 <= value <= 10: + _LOGGER.warning(u"ESP32: Pin %s (9-10) might already be used by the " + u"flash interface in QUAD IO flash mode.", value) if value in (20, 24, 28, 29, 30, 31): - _LOGGER.warning(u"ESP32: Pin %s (20, 24, 28-31) can usually not be used. " - u"Be warned.", value) + # These pins are not exposed in GPIO mux (reason unknown) + # but they're missing from IO_MUX list in datasheet + raise cv.Invalid("The pin GPIO{} is not usable on ESP32s.".format(value)) return value if CORE.is_esp8266: - if 6 <= value <= 11: - _LOGGER.warning(u"ESP8266: Pin %s (6-11) might already be used by the " - u"flash interface. Be warned.", value) if value < 0 or value > 17: raise cv.Invalid(u"ESP8266: Invalid pin number: {}".format(value)) + if value in _ESP_SDIO_PINS: + raise cv.Invalid("This pin cannot be used on ESP8266s and is already used by " + "the flash interface (function: {})".format(_ESP_SDIO_PINS[value])) + if 9 <= value <= 10: + _LOGGER.warning(u"ESP8266: Pin %s (9-10) might already be used by the " + u"flash interface in QUAD IO flash mode.", value) return value raise NotImplementedError def input_pin(value): - return validate_gpio_pin(value) + value = validate_gpio_pin(value) + if CORE.is_esp8266 and value == 17: + raise cv.Invalid("GPIO17 (TOUT) is an analog-only pin on the ESP8266.") + return value def input_pullup_pin(value): @@ -335,6 +353,8 @@ def output_pin(value): u"input pin.".format(value)) return value if CORE.is_esp8266: + if value == 17: + raise cv.Invalid("GPIO17 (TOUT) is an analog-only pin on the ESP8266.") return value raise NotImplementedError @@ -348,7 +368,7 @@ def analog_pin(value): if CORE.is_esp8266: if value == 17: # A0 return value - raise cv.Invalid(u"ESP8266: Only pin A0 (17) supports ADC.") + raise cv.Invalid(u"ESP8266: Only pin A0 (GPIO17) supports ADC.") raise NotImplementedError diff --git a/tests/test1.yaml b/tests/test1.yaml index 192d7a2fc9..b7f3d04b40 100644 --- a/tests/test1.yaml +++ b/tests/test1.yaml @@ -435,7 +435,7 @@ sensor: - platform: hx711 name: "HX711 Value" dout_pin: GPIO23 - clk_pin: GPIO24 + clk_pin: GPIO25 gain: 128 update_interval: 15s - platform: ina219 @@ -542,7 +542,7 @@ sensor: name: "Rotary Encoder" id: rotary_encoder1 pin_a: GPIO23 - pin_b: GPIO24 + pin_b: GPIO25 pin_reset: GPIO25 filters: - or: @@ -655,7 +655,7 @@ sensor: integration_time: 402ms gain: 16x - platform: ultrasonic - trigger_pin: GPIO24 + trigger_pin: GPIO25 echo_pin: number: GPIO23 inverted: true @@ -1396,11 +1396,11 @@ display: dimensions: 18x4 data_pins: - GPIO19 - - GPIO20 - GPIO21 - GPIO22 + - GPIO23 enable_pin: GPIO23 - rs_pin: GPIO24 + rs_pin: GPIO25 lambda: |- it.print("Hello World!"); - platform: lcd_pcf8574 @@ -1528,7 +1528,7 @@ stepper: - platform: a4988 id: my_stepper step_pin: GPIO23 - dir_pin: GPIO24 + dir_pin: GPIO25 sleep_pin: GPIO25 max_speed: 250 steps/s acceleration: 100 steps/s^2 diff --git a/tests/test2.yaml b/tests/test2.yaml index 935f9edb84..bcc777b83b 100644 --- a/tests/test2.yaml +++ b/tests/test2.yaml @@ -10,7 +10,7 @@ substitutions: ethernet: type: LAN8720 mdc_pin: GPIO23 - mdio_pin: GPIO24 + mdio_pin: GPIO25 clk_mode: GPIO0_IN phy_addr: 0 power_pin: GPIO25 @@ -286,7 +286,7 @@ stepper: - platform: uln2003 id: my_stepper pin_a: GPIO23 - pin_b: GPIO24 + pin_b: GPIO27 pin_c: GPIO25 pin_d: GPIO26 sleep_when_done: no