1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-30 14:43:51 +00:00

ESP-IDF support and generic target platforms (#2303)

* Socket refactor and SSL

* esp-idf temp

* Fixes

* Echo component and noise

* Add noise API transport support

* Updates

* ESP-IDF

* Complete

* Fixes

* Fixes

* Versions update

* New i2c APIs

* Complete i2c refactor

* SPI migration

* Revert ESP Preferences migration, too complex for now

* OTA support

* Remove echo again

* Remove ssl again

* GPIOFlags updates

* Rename esphal and ICACHE_RAM_ATTR

* Make ESP32 arduino compilable again

* Fix GPIO flags

* Complete pin registry refactor and fixes

* Fixes to make test1 compile

* Remove sdkconfig file

* Ignore sdkconfig file

* Fixes in reviewing

* Make test2 compile

* Make test4 compile

* Make test5 compile

* Run clang-format

* Fix lint errors

* Use esp-idf APIs instead of btStart

* Another round of fixes

* Start implementing ESP8266

* Make test3 compile

* Guard esp8266 code

* Lint

* Reformat

* Fixes

* Fixes v2

* more fixes

* ESP-IDF tidy target

* Convert ARDUINO_ARCH_ESPxx

* Update WiFiSignalSensor

* Update time ifdefs

* OTA needs millis from hal

* RestartSwitch needs delay from hal

* ESP-IDF Uart

* Fix OTA blank password

* Allow setting sdkconfig

* Fix idf partitions and allow setting sdkconfig from yaml

* Re-add read/write compat APIs and fix esp8266 uart

* Fix esp8266 store log strings in flash

* Fix ESP32 arduino preferences not initialized

* Update ifdefs

* Change how sdkconfig change is detected

* Add checks to ci-custom and fix them

* Run clang-format

* Add esp-idf clang-tidy target and fix errors

* Fixes from clang-tidy idf round 2

* Fixes from compiling tests with esp-idf

* Run clang-format

* Switch test5.yaml to esp-idf

* Implement ESP8266 Preferences

* Lint

* Re-do PIO package version selection a bit

* Fix arduinoespressif32 package version

* Fix unit tests

* Lint

* Lint fixes

* Fix readv/writev not defined

* Fix graphing component

* Re-add all old options from core/config.py

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
Otto Winter
2021-09-20 11:47:51 +02:00
committed by GitHub
parent 1e8e471dec
commit ac0d921413
583 changed files with 9008 additions and 5420 deletions

View File

@@ -30,7 +30,7 @@ def test_binary_sensor_sets_mandatory_fields(generate_main):
# Then
assert 'bs_1->set_name("test bs1");' in main_cpp
assert "bs_1->set_pin(new GPIOPin" in main_cpp
assert "bs_1->set_pin(" in main_cpp
def test_binary_sensor_config_value_internal_set(generate_main):

View File

@@ -27,12 +27,6 @@ void setup() {
auto *ota = new ota::OTAComponent(); // NOLINT
ota->set_port(8266);
auto *gpio = new gpio::GPIOSwitch(); // NOLINT
gpio->set_name("GPIO Switch");
gpio->set_pin(new GPIOPin(8, OUTPUT, false)); // NOLINT
App.register_component(gpio);
App.register_switch(gpio);
App.setup();
}

View File

@@ -71,7 +71,6 @@ wifi:
password: ''
channel: 14
bssid: 'A1:63:95:47:D3:1D'
enable_mdns: true
manual_ip:
static_ip: 192.168.178.230
gateway: 192.168.178.1
@@ -82,6 +81,9 @@ wifi:
reboot_timeout: 120s
power_save_mode: light
mdns:
disabled: false
http_request:
useragent: esphome/device
timeout: 10s
@@ -170,6 +172,7 @@ i2c:
scan: True
frequency: 100kHz
setup_priority: -100
id: i2c_bus
spi:
clk_pin: GPIO21
@@ -177,15 +180,18 @@ spi:
miso_pin: GPIO23
uart:
- tx_pin: GPIO22
rx_pin: GPIO23
- tx_pin:
number: GPIO22
inverted: yes
rx_pin:
number: GPIO23
inverted: yes
baud_rate: 115200
id: uart0
parity: NONE
data_bits: 8
stop_bits: 1
rx_buffer_size: 512
invert: false
- id: adalight_uart
tx_pin: GPIO25
@@ -246,6 +252,7 @@ deep_sleep:
ads1115:
address: 0x48
i2c_id: i2c_bus
dallas:
pin: GPIO23
@@ -436,6 +443,7 @@ sensor:
availability:
state_topic: livingroom/custom_state_topic
measurement_duration: 31
i2c_id: i2c_bus
- platform: bme280
temperature:
name: 'Outside Temperature'
@@ -449,6 +457,7 @@ sensor:
address: 0x77
iir_filter: 16x
update_interval: 15s
i2c_id: i2c_bus
- platform: bme680
temperature:
name: 'Outside Temperature'
@@ -464,6 +473,7 @@ sensor:
temperature: 320
duration: 150ms
update_interval: 15s
i2c_id: i2c_bus
- platform: bmp085
temperature:
name: 'Outside Temperature'
@@ -473,6 +483,7 @@ sensor:
- lambda: >-
return x / powf(1.0 - (x / 44330.0), 5.255);
update_interval: 15s
i2c_id: i2c_bus
- platform: bmp280
temperature:
name: 'Outside Temperature'
@@ -482,6 +493,7 @@ sensor:
address: 0x77
update_interval: 15s
iir_filter: 16x
i2c_id: i2c_bus
- platform: dallas
address: 0x1C0000031EDD2A28
name: 'Living Room Temperature'
@@ -503,6 +515,7 @@ sensor:
humidity:
name: 'Living Room Humidity 4'
update_interval: 15s
i2c_id: i2c_bus
- platform: duty_cycle
pin: GPIO25
name: Duty Cycle Sensor
@@ -515,6 +528,7 @@ sensor:
humidity:
name: 'Living Room Pressure 5'
update_interval: 15s
i2c_id: i2c_bus
- platform: hlw8012
sel_pin: 5
cf_pin: 14
@@ -560,6 +574,7 @@ sensor:
range: 130uT
oversampling: 8x
update_interval: 15s
i2c_id: i2c_bus
- platform: qmc5883l
address: 0x0D
field_strength_x:
@@ -573,6 +588,7 @@ sensor:
range: 800uT
oversampling: 256x
update_interval: 15s
i2c_id: i2c_bus
- platform: hx711
name: 'HX711 Value'
dout_pin: GPIO23
@@ -593,6 +609,7 @@ sensor:
max_voltage: 32.0V
max_current: 3.2A
update_interval: 15s
i2c_id: i2c_bus
- platform: ina226
address: 0x40
shunt_resistance: 0.1 ohm
@@ -606,6 +623,7 @@ sensor:
name: 'INA226 Shunt Voltage'
max_current: 3.2A
update_interval: 15s
i2c_id: i2c_bus
- platform: ina3221
address: 0x40
channel_1:
@@ -619,12 +637,14 @@ sensor:
shunt_voltage:
name: 'INA3221 Channel 1 Shunt Voltage'
update_interval: 15s
i2c_id: i2c_bus
- platform: htu21d
temperature:
name: 'Living Room Temperature 6'
humidity:
name: 'Living Room Humidity 6'
update_interval: 15s
i2c_id: i2c_bus
- platform: max6675
name: 'Living Room Temperature'
cs_pin: GPIO23
@@ -670,6 +690,7 @@ sensor:
name: 'MPU6050 Gyro z'
temperature:
name: 'MPU6050 Temperature'
i2c_id: i2c_bus
- platform: ms5611
temperature:
name: 'Outside Temperature'
@@ -677,6 +698,7 @@ sensor:
name: 'Outside Pressure'
address: 0x77
update_interval: 15s
i2c_id: i2c_bus
- platform: pmsa003i
pm_1_0:
name: "PMSA003i PM1.0"
@@ -698,6 +720,7 @@ sensor:
name: "PMSA003i PMC <10µm"
address: 0x12
standard_units: True
i2c_id: i2c_bus
- platform: pulse_counter
name: 'Pulse Counter'
pin: GPIO12
@@ -768,10 +791,12 @@ sensor:
humidity:
name: 'Living Room Humidity 8'
address: 0x44
i2c_id: i2c_bus
update_interval: 15s
- platform: sts3x
name: 'Living Room Temperature 9'
address: 0x4A
i2c_id: i2c_bus
- platform: scd30
co2:
name: 'Living Room CO2 9'
@@ -785,6 +810,7 @@ sensor:
altitude_compensation: 10m
ambient_pressure_compensation: 961mBar
temperature_offset: 4.2C
i2c_id: i2c_bus
- platform: sgp30
eco2:
name: 'Workshop eCO2'
@@ -794,6 +820,7 @@ sensor:
accuracy_decimals: 1
address: 0x58
update_interval: 5s
i2c_id: i2c_bus
- platform: sps30
pm_1_0:
name: 'Workshop PM <1µm Weight concentration'
@@ -824,6 +851,7 @@ sensor:
id: 'workshop_PMC_10_0'
address: 0x69
update_interval: 10s
i2c_id: i2c_bus
- platform: sht4x
temperature:
name: 'SHT4X Temperature'
@@ -831,6 +859,7 @@ sensor:
name: 'SHT4X Humidity'
address: 0x44
update_interval: 15s
i2c_id: i2c_bus
- platform: shtcx
temperature:
name: 'Living Room Temperature 10'
@@ -838,6 +867,7 @@ sensor:
name: 'Living Room Humidity 10'
address: 0x70
update_interval: 15s
i2c_id: i2c_bus
- platform: template
name: 'Template Sensor'
state_class: measurement
@@ -863,6 +893,7 @@ sensor:
is_cs_package: true
integration_time: 402ms
gain: 16x
i2c_id: i2c_bus
- platform: tsl2591
id: this_little_light_of_mine
address: 0x29
@@ -882,6 +913,7 @@ sensor:
calculated_lux:
name: "tsl2591 calculated_lux"
id: tsl2591_cl
i2c_id: i2c_bus
- platform: ultrasonic
trigger_pin: GPIO25
echo_pin:
@@ -921,6 +953,7 @@ sensor:
name: CCS811 TVOC
update_interval: 30s
baseline: 0x4242
i2c_id: i2c_bus
- platform: tx20
wind_speed:
name: 'Windspeed'
@@ -946,6 +979,7 @@ sensor:
- platform: tmp117
name: 'TMP117 Temperature'
update_interval: 5s
i2c_id: i2c_bus
- platform: hm3301
pm_1_0:
name: 'PM1.0'
@@ -956,6 +990,7 @@ sensor:
aqi:
name: 'AQI'
calculation_type: 'CAQI'
i2c_id: i2c_bus
- platform: teleinfo
tag_name: "HCHC"
name: "hchc"
@@ -965,15 +1000,18 @@ sensor:
- platform: mcp9808
name: 'MCP9808 Temperature'
update_interval: 15s
i2c_id: i2c_bus
- platform: ezo
id: ph_ezo
address: 99
unit_of_measurement: 'pH'
i2c_id: i2c_bus
- platform: sdp3x
name: "HVAC Filter Pressure drop"
id: filter_pressure
update_interval: 5s
accuracy_decimals: 3
i2c_id: i2c_bus
- platform: cs5460a
id: cs5460a1
current:
@@ -1216,14 +1254,18 @@ binary_sensor:
pca9685:
frequency: 500
address: 0x0
i2c_id: i2c_bus
tlc59208f:
- address: 0x20
id: tlc59208f_1
i2c_id: i2c_bus
- address: 0x22
id: tlc59208f_2
i2c_id: i2c_bus
- address: 0x24
id: tlc59208f_3
i2c_id: i2c_bus
my9231:
data_pin: GPIO12
@@ -1363,6 +1405,7 @@ output:
id: dac_output
- platform: mcp4725
id: mcp4725_dac_output
i2c_id: i2c_bus
e131:
@@ -1992,6 +2035,7 @@ display:
address: 0x3F
lambda: |-
it.print("Hello World!");
i2c_id: i2c_bus
- platform: max7219
cs_pin: GPIO23
num_chips: 1
@@ -2039,6 +2083,7 @@ display:
then:
lambda: |-
ESP_LOGD("display", "1 -> 2");
i2c_id: i2c_bus
- platform: ssd1306_spi
model: 'SSD1306 128x64'
cs_pin: GPIO23
@@ -2073,6 +2118,7 @@ display:
- id: page13272
lambda: |-
// Nothing
i2c_id: i2c_bus
- platform: ssd1327_spi
model: 'SSD1327 128x128'
cs_pin: GPIO23
@@ -2151,6 +2197,7 @@ pn532_spi:
payload: !lambda 'return x;'
pn532_i2c:
i2c_id: i2c_bus
rdm6300:
uart_id: uart0
@@ -2167,11 +2214,13 @@ rc522_i2c:
on_tag:
- lambda: |-
ESP_LOGD("main", "Found tag %s", x.c_str());
i2c_id: i2c_bus
- update_interval: 1s
on_tag:
- lambda: |-
ESP_LOGD("main", "Found tag %s", x.c_str());
i2c_id: i2c_bus
gps:
uart_id: uart0
@@ -2198,6 +2247,7 @@ time:
on_time:
seconds: 0
then: ds1307.read_time
i2c_id: i2c_bus
cover:
- platform: template
@@ -2225,31 +2275,35 @@ debug:
tca9548a:
- address: 0x70
id: multiplex0
scan: True
channels:
- bus_id: multiplex0_chan0
channel: 0
i2c_id: i2c_bus
- address: 0x71
id: multiplex1
scan: True
multiplexer:
id: multiplex0
channel: 0
i2c_id: multiplex0_chan0
pcf8574:
- id: 'pcf8574_hub'
address: 0x21
pcf8575: False
i2c_id: i2c_bus
mcp23017:
- id: 'mcp23017_hub'
open_drain_interrupt: 'true'
i2c_id: i2c_bus
mcp23008:
- id: 'mcp23008_hub'
address: 0x22
open_drain_interrupt: 'true'
i2c_id: i2c_bus
mcp23016:
- id: 'mcp23016_hub'
address: 0x23
i2c_id: i2c_bus
stepper:
- platform: a4988

View File

@@ -14,13 +14,15 @@ ethernet:
clk_mode: GPIO0_IN
phy_addr: 0
power_pin: GPIO25
enable_mdns: false
manual_ip:
static_ip: 192.168.178.56
gateway: 192.168.178.1
subnet: 255.255.255.0
domain: .local
mdns:
disabled: true
api:
i2c:
@@ -360,7 +362,7 @@ esp32_ble_tracker:
ble_client:
- mac_address: 01:02:03:04:05:06
id: airthings01
airthings_ble:
#esp32_ble_beacon:

View File

@@ -259,7 +259,7 @@ ota:
logger:
hardware_uart: UART1
level: DEBUG
esp8266_store_log_strings_in_flash: false
esp8266_store_log_strings_in_flash: true
web_server:

View File

@@ -379,7 +379,7 @@ display:
it.rectangle(3, 3, it.get_width()-6, it.get_height()-6, red);
rotation: 0°
update_interval: 16ms
- platform: waveshare_epaper
cs_pin: GPIO23
dc_pin: GPIO23
@@ -407,6 +407,23 @@ display:
full_update_every: 30
lambda: |-
it.rectangle(0, 0, it.get_width(), it.get_height());
- platform: inkplate6
id: inkplate_display
greyscale: false
partial_updating: false
update_interval: 60s
ckv_pin: GPIO1
sph_pin: GPIO1
gmod_pin: GPIO1
gpio0_enable_pin: GPIO1
oe_pin: GPIO1
spv_pin: GPIO1
powerup_pin: GPIO1
wakeup_pin: GPIO1
vcom_pin: GPIO1
text_sensor:
- platform: pipsolar

View File

@@ -1,12 +1,15 @@
esphome:
name: test5
platform: ESP32
board: nodemcu-32s
build_path: build/test5
project:
name: esphome.test5_project
version: "1.0.0"
esp32:
board: nodemcu-32s
framework:
type: esp-idf
wifi:
networks:
- ssid: 'MySSID'
@@ -151,20 +154,3 @@ sensor:
uart_id: uart2
co2:
name: CO2 Sensor
display:
- platform: inkplate6
id: inkplate_display
greyscale: false
partial_updating: false
update_interval: 60s
ckv_pin: GPIO1
sph_pin: GPIO1
gmod_pin: GPIO1
gpio0_enable_pin: GPIO1
oe_pin: GPIO1
spv_pin: GPIO1
powerup_pin: GPIO1
wakeup_pin: GPIO1
vcom_pin: GPIO1

View File

@@ -531,13 +531,13 @@ class TestEsphomeCore:
assert target.address == "4.3.2.1"
def test_is_esp32(self, target):
target.esp_platform = "ESP32"
target.data[const.KEY_CORE] = {const.KEY_TARGET_PLATFORM: "esp32"}
assert target.is_esp32 is True
assert target.is_esp8266 is False
def test_is_esp8266(self, target):
target.esp_platform = "ESP8266"
target.data[const.KEY_CORE] = {const.KEY_TARGET_PLATFORM: "esp8266"}
assert target.is_esp32 is False
assert target.is_esp8266 is True

View File

@@ -3,7 +3,6 @@ from mock import Mock
from esphome import cpp_helpers as ch
from esphome import const
from esphome.cpp_generator import MockObj
@pytest.mark.asyncio
@@ -13,15 +12,6 @@ async def test_gpio_pin_expression__conf_is_none(monkeypatch):
assert actual is None
@pytest.mark.asyncio
async def test_gpio_pin_expression__new_pin(monkeypatch):
actual = await ch.gpio_pin_expression(
{const.CONF_NUMBER: 42, const.CONF_MODE: "input", const.CONF_INVERTED: False}
)
assert isinstance(actual, MockObj)
@pytest.mark.asyncio
async def test_register_component(monkeypatch):
var = Mock(base="foo.bar")

View File

@@ -1,346 +0,0 @@
"""
Please Note:
These tests cover the process of identifying information about pins, they do not
check if the definition of MCUs and pins is correct.
"""
import logging
import pytest
from esphome.config_validation import Invalid
from esphome.core import EsphomeCore
from esphome import boards, pins
MOCK_ESP8266_BOARD_ID = "_mock_esp8266"
MOCK_ESP8266_PINS = {"X0": 16, "X1": 5, "X2": 4, "LED": 2}
MOCK_ESP8266_BOARD_ALIAS_ID = "_mock_esp8266_alias"
MOCK_ESP8266_FLASH_SIZE = boards.FLASH_SIZE_2_MB
MOCK_ESP32_BOARD_ID = "_mock_esp32"
MOCK_ESP32_PINS = {"Y0": 12, "Y1": 8, "Y2": 3, "LED": 9, "A0": 8}
MOCK_ESP32_BOARD_ALIAS_ID = "_mock_esp32_alias"
UNKNOWN_PLATFORM = "STM32"
@pytest.fixture
def mock_mcu(monkeypatch):
"""
Add a mock MCU into the lists as a stable fixture
"""
boards.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ID] = MOCK_ESP8266_PINS
boards.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ID] = MOCK_ESP8266_FLASH_SIZE
boards.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ALIAS_ID] = MOCK_ESP8266_BOARD_ID
boards.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ALIAS_ID] = MOCK_ESP8266_FLASH_SIZE
boards.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ID] = MOCK_ESP32_PINS
boards.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ALIAS_ID] = MOCK_ESP32_BOARD_ID
yield
del boards.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ID]
del boards.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ID]
del boards.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ALIAS_ID]
del boards.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ALIAS_ID]
del boards.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ID]
del boards.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ALIAS_ID]
@pytest.fixture
def core(monkeypatch, mock_mcu):
core = EsphomeCore()
monkeypatch.setattr(pins, "CORE", core)
return core
@pytest.fixture
def core_esp8266(core):
core.esp_platform = "ESP8266"
core.board = MOCK_ESP8266_BOARD_ID
return core
@pytest.fixture
def core_esp32(core):
core.esp_platform = "ESP32"
core.board = MOCK_ESP32_BOARD_ID
return core
class Test_lookup_pin:
@pytest.mark.parametrize(
"value, expected",
(
("X1", 5),
("MOSI", 13),
),
)
def test_valid_esp8266_pin(self, core_esp8266, value, expected):
actual = pins._lookup_pin(value)
assert actual == expected
def test_valid_esp8266_pin_alias(self, core_esp8266):
core_esp8266.board = MOCK_ESP8266_BOARD_ALIAS_ID
actual = pins._lookup_pin("X2")
assert actual == 4
@pytest.mark.parametrize(
"value, expected",
(
("Y1", 8),
("A0", 8),
("MOSI", 23),
),
)
def test_valid_esp32_pin(self, core_esp32, value, expected):
actual = pins._lookup_pin(value)
assert actual == expected
def test_valid_32_pin_alias(self, core_esp32):
core_esp32.board = MOCK_ESP32_BOARD_ALIAS_ID
actual = pins._lookup_pin("Y2")
assert actual == 3
def test_invalid_pin(self, core_esp8266):
with pytest.raises(
Invalid, match="Cannot resolve pin name 'X42' for board _mock_esp8266."
):
pins._lookup_pin("X42")
def test_unsupported_platform(self, core):
core.esp_platform = UNKNOWN_PLATFORM
with pytest.raises(NotImplementedError):
pins._lookup_pin("TX")
class Test_translate_pin:
@pytest.mark.parametrize(
"value, expected",
(
(2, 2),
("3", 3),
("GPIO4", 4),
("TX", 1),
("Y0", 12),
),
)
def test_valid_values(self, core_esp32, value, expected):
actual = pins._translate_pin(value)
assert actual == expected
@pytest.mark.parametrize("value", ({}, None))
def test_invalid_values(self, core_esp32, value):
with pytest.raises(Invalid, match="This variable only supports"):
pins._translate_pin(value)
class Test_validate_gpio_pin:
def test_esp32_valid(self, core_esp32):
actual = pins.validate_gpio_pin("GPIO22")
assert actual == 22
@pytest.mark.parametrize(
"value, match",
(
(-1, "ESP32: Invalid pin number: -1"),
(40, "ESP32: Invalid pin number: 40"),
(6, "This pin cannot be used on ESP32s and"),
(7, "This pin cannot be used on ESP32s and"),
(8, "This pin cannot be used on ESP32s and"),
(11, "This pin cannot be used on ESP32s and"),
(20, "The pin GPIO20 is not usable on ESP32s"),
(24, "The pin GPIO24 is not usable on ESP32s"),
(28, "The pin GPIO28 is not usable on ESP32s"),
(29, "The pin GPIO29 is not usable on ESP32s"),
(30, "The pin GPIO30 is not usable on ESP32s"),
(31, "The pin GPIO31 is not usable on ESP32s"),
),
)
def test_esp32_invalid_pin(self, core_esp32, value, match):
with pytest.raises(Invalid, match=match):
pins.validate_gpio_pin(value)
@pytest.mark.parametrize("value", (9, 10))
def test_esp32_warning(self, core_esp32, caplog, value):
caplog.at_level(logging.WARNING)
pins.validate_gpio_pin(value)
assert len(caplog.messages) == 1
assert caplog.messages[0].endswith("flash interface in QUAD IO flash mode.")
def test_esp8266_valid(self, core_esp8266):
actual = pins.validate_gpio_pin("GPIO12")
assert actual == 12
@pytest.mark.parametrize(
"value, match",
(
(-1, "ESP8266: Invalid pin number: -1"),
(18, "ESP8266: Invalid pin number: 18"),
(6, "This pin cannot be used on ESP8266s and"),
(7, "This pin cannot be used on ESP8266s and"),
(8, "This pin cannot be used on ESP8266s and"),
(11, "This pin cannot be used on ESP8266s and"),
),
)
def test_esp8266_invalid_pin(self, core_esp8266, value, match):
with pytest.raises(Invalid, match=match):
pins.validate_gpio_pin(value)
@pytest.mark.parametrize("value", (9, 10))
def test_esp8266_warning(self, core_esp8266, caplog, value):
caplog.at_level(logging.WARNING)
pins.validate_gpio_pin(value)
assert len(caplog.messages) == 1
assert caplog.messages[0].endswith("flash interface in QUAD IO flash mode.")
def test_unknown_device(self, core):
core.esp_platform = UNKNOWN_PLATFORM
with pytest.raises(NotImplementedError):
pins.validate_gpio_pin("0")
class Test_input_pin:
@pytest.mark.parametrize("value, expected", (("X0", 16),))
def test_valid_esp8266_values(self, core_esp8266, value, expected):
actual = pins.input_pin(value)
assert actual == expected
@pytest.mark.parametrize(
"value, expected",
(
("Y0", 12),
(17, 17),
),
)
def test_valid_esp32_values(self, core_esp32, value, expected):
actual = pins.input_pin(value)
assert actual == expected
@pytest.mark.parametrize("value", (17,))
def test_invalid_esp8266_values(self, core_esp8266, value):
with pytest.raises(Invalid):
pins.input_pin(value)
def test_unknown_platform(self, core):
core.esp_platform = UNKNOWN_PLATFORM
with pytest.raises(NotImplementedError):
pins.input_pin(2)
class Test_input_pullup_pin:
@pytest.mark.parametrize("value, expected", (("X0", 16),))
def test_valid_esp8266_values(self, core_esp8266, value, expected):
actual = pins.input_pullup_pin(value)
assert actual == expected
@pytest.mark.parametrize(
"value, expected",
(
("Y0", 12),
(17, 17),
),
)
def test_valid_esp32_values(self, core_esp32, value, expected):
actual = pins.input_pullup_pin(value)
assert actual == expected
@pytest.mark.parametrize("value", (0,))
def test_invalid_esp8266_values(self, core_esp8266, value):
with pytest.raises(Invalid):
pins.input_pullup_pin(value)
def test_unknown_platform(self, core):
core.esp_platform = UNKNOWN_PLATFORM
with pytest.raises(NotImplementedError):
pins.input_pullup_pin(2)
class Test_output_pin:
@pytest.mark.parametrize("value, expected", (("X0", 16),))
def test_valid_esp8266_values(self, core_esp8266, value, expected):
actual = pins.output_pin(value)
assert actual == expected
@pytest.mark.parametrize(
"value, expected",
(
("Y0", 12),
(17, 17),
),
)
def test_valid_esp32_values(self, core_esp32, value, expected):
actual = pins.output_pin(value)
assert actual == expected
@pytest.mark.parametrize("value", (17,))
def test_invalid_esp8266_values(self, core_esp8266, value):
with pytest.raises(Invalid):
pins.output_pin(value)
@pytest.mark.parametrize("value", range(34, 40))
def test_invalid_esp32_values(self, core_esp32, value):
with pytest.raises(Invalid):
pins.output_pin(value)
def test_unknown_platform(self, core):
core.esp_platform = UNKNOWN_PLATFORM
with pytest.raises(NotImplementedError):
pins.output_pin(2)
class Test_analog_pin:
@pytest.mark.parametrize("value, expected", ((17, 17),))
def test_valid_esp8266_values(self, core_esp8266, value, expected):
actual = pins.analog_pin(value)
assert actual == expected
@pytest.mark.parametrize(
"value, expected",
(
(32, 32),
(39, 39),
),
)
def test_valid_esp32_values(self, core_esp32, value, expected):
actual = pins.analog_pin(value)
assert actual == expected
@pytest.mark.parametrize("value", ("X0",))
def test_invalid_esp8266_values(self, core_esp8266, value):
with pytest.raises(Invalid):
pins.analog_pin(value)
@pytest.mark.parametrize("value", ("Y0",))
def test_invalid_esp32_values(self, core_esp32, value):
with pytest.raises(Invalid):
pins.analog_pin(value)
def test_unknown_platform(self, core):
core.esp_platform = UNKNOWN_PLATFORM
with pytest.raises(NotImplementedError):
pins.analog_pin(2)

View File

@@ -2,7 +2,7 @@
import esphome.wizard as wz
import pytest
from esphome.boards import ESP8266_BOARD_PINS
from esphome.components.esp8266.boards import ESP8266_BOARD_PINS
from mock import MagicMock