Aqui vão algumas recomendações para resolver o seu problema com o MCP23017 e o ESP32 rodando ESPHome:
Veja se você está usando pinos I²C livres e não “boot-strap” do módulo:
Evite usar GPIO0, GPIO2, GPIO12, GPIO15 etc., pois esses pinos têm funções internas de seleção de boot.
Use, por exemplo, SDA = GPIO21 e SCL = GPIO22 no ESP32-WROOM-32E.
(baseado em guidance da knowledge base: evite boot-strapped pins quando possível)
Garanta pull-ups e desacoplamento adequados:
Coloque dois 4.7k Resistor (um em SDA, outro em SCL) na tensão de 3.3 V.
Acrescente também um 0.1 µF Capacitor próximo ao pino EN do ESP32 para melhorar imunidade a ruídos.
(conforme recomendação da knowledge base: pull-ups de 4.7 kΩ e C_EN = 0.1 µF)
No YAML do ESPHome, defina o barramento e insira um delay antes de iniciar o MCP23017:
Yaml
i2c:sda: GPIO21
scl: GPIO22
scan:True# opcional, ajuda no debug# opcional: para dar tempo de estabilizaçãoon_boot:then:-delay: 2s
mcp23017:-id: expander
address:0x20# ajuste conforme o A0/A1/A2# seus pinos e configurações…
Verifique o hardware do MCP23017:
VDD em 3.3 V, VSS em GND.
RESET puxado para 3.3 V (por resistor interno ou externo).
Endereço I²C configurado corretamente via A0/A1/A2.
Teste o scan do I²C separadamente:
Programe ESPHome apenas com o bloco i2c: e scan: True.
Abra o console e valide se o 0x20 aparece na lista de dispositivos encontrados.