MCP23017 works with polling, doesn't work with interrupts

I found the docs for the MCP23017 as a GPIO expander while looking through the docs. I need a few more total pins than a normal ESP32 has between communications and GPIO so the expander seems perfect.

It seems to work in polling mode, but I can't seem to make it work in interrupt mode.

i2c:
  - id: exp_bus
    sda: GPIO05
    scl: GPIO17
    frequency: 100kHz
    scan: true

mcp23017:
  - id: 'mcp23017_hub'
    i2c_id: exp_bus
    address: 0x20
    open_drain_interrupt: false
    interrupt_pin: GPIO18

binary_sensor:
  - platform: gpio
    name: "MCP23017 Pin A0"
    pin:
      mcp23xxx: mcp23017_hub
      number: 0
      mode:
        input: true
        #pullup: true
      inverted: true
      interrupt: CHANGE

I'm supplying power to the MCP23017 with 3.3v so it's my understanding based on the docs that I don't need a pull-up resistor as I don't want/need to use open drain mode. But when configured this way the initial state of the GPIO on the A0 pin persists indefinitely no matter how much I change the input. It's the same for the rest of the pins but I left them out for brevity.

Looking at the build logs, I don't feel like this is a good sign:

INFO GPIO binary_sensor 'MCP23017 Pin A0': Pin is not an internal GPIO, falling back to polling mode.
INFO GPIO binary_sensor 'MCP23017 Pin A1': Pin is not an internal GPIO, falling back to polling mode.
INFO GPIO binary_sensor 'MCP23017 Pin A2': Pin is not an internal GPIO, falling back to polling mode.
INFO GPIO binary_sensor 'MCP23017 Pin A3': Pin is not an internal GPIO, falling back to polling mode.
INFO GPIO binary_sensor 'MCP23017 Pin A4': Pin is not an internal GPIO, falling back to polling mode.
INFO GPIO binary_sensor 'MCP23017 Pin A5': Pin is not an internal GPIO, falling back to polling mode.
INFO GPIO binary_sensor 'MCP23017 Pin A6': Pin is not an internal GPIO, falling back to polling mode.
INFO GPIO binary_sensor 'MCP23017 Pin A7': Pin is not an internal GPIO, falling back to polling mode.

But, when I look at the run logs I see something that's closer to right:

[08:33:33.973][C][mcp23017:039]: MCP23017:
[08:33:33.974][C][mcp23017:152]:   Interrupt Pin: GPIO18
[08:33:34.015][C][gpio.binary_sensor:016]: GPIO Binary Sensor 'MCP23017 Pin A0'
[08:33:34.034][C][gpio.binary_sensor:152]:   Pin: 0 via MCP23XXX
[08:33:34.035][C][gpio.binary_sensor:061]:   Mode: polling

Maybe this should say Mode: interrupt since there's a way for it to be interrupt-able?

Did I miss something? Is the pull-up resistor required either way, even though I'm supplying 3.3v to the MCP23017? Any help is greatly appreciated.

Looking at the datasheet here:

I see in the very top section that the interrupt is configurable:

Configurable Interrupt Output Pins:
- Configurable as active-high, active-low or
open-drain

I'm looking at the source code and it seems like the configuration is only setup if the open drain is specified: ESPHome: esphome/components/mcp23017/mcp23017.cpp Source File

I'm trying to follow the trail to where the interrupt pin default mode is set, i.e. what the open_drain_interrupt: true overrides but I'm not super familiar with the project. I found this file that seems to have some relevant info but no real interrupt defaults: ESPHome: esphome/components/mcp23x17_base/mcp23x17_base.cpp Source File

The header has some info too, but I'm not seeing defaults: ESPHome: esphome/components/mcp23x17_base/mcp23x17_base.h Source File

Here I see the set_open_drain_ints that sets up for open drain interrupts, but again I don't see any defaults anywhere that setup active high or active low interrupts if the interrupt pin is set but the open drain setting is false. ESPHome: esphome/components/mcp23xxx_base/mcp23xxx_base.h Source File

I am starting to wonder if I should be filing an issue on GitHub as this doesn't necessarily seem to be something I did wrong re: config at this point.

I ended up filing an issue about this: MCP23017 non-open-drain interrupts don't work, but open drain with pull-up resistor does · Issue #17330 · esphome/esphome · GitHub