Missing GPIO Entities - ESP32-POE-ISO

Having used another POE ESP32 dev board successfully for GPIO input and output I am trying to use an Olimex ESP32-POE-ISO because I want the electrical isolation it provides. Everything works as I would expect until I look at the entities that the device has registered in home assistant and any GPIO entities are missing.

I have tried multiple Olimex ESP32-POE-ISO, arduino framework rather than esp-idf, poe powered connected over ethernet, usb powererd connected over WiFi, board type of esp32-poe-iso and esp32dev and tried configuring every free GPIO pin. I have also tried deleting the device from Home assistant and rebooting before adding it back. And tried a new clean installation of Home Assistant and everything is on latest recommended versions.

The configured entities are recognised at the ESP32 boot time and appear listed in the boot logs and when a voltage is applied at the input GPIO pin the logs report that the ESP32 is sending on and off states. But Home Assistant does not list the entities under the integration, developers tools or ESPHome Compiler - Visit.
Any ideas?

ESPHome Yaml File

substitutions:
  name: esphome-web-904818
  friendly_name: ESP32_POE_ISO_EA

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.6.0
  name_add_mac_suffix: false
  project:
    name: esphome.web
    version: dev

esp32:
  board: esp32-poe-iso
  framework:
    type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api: 

# Allow Over-The-Air updates
ota:
- platform: esphome

# Allow provisioning Wi-Fi via serial
improv_serial:

wifi:
  # Set up a wifi access point
  ap: {}

# In combination with the `ap` this allows the user
# to provision wifi credentials to the device via WiFi AP.
captive_portal:

dashboard_import:
  package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
  import_full_config: true

# Sets up Bluetooth LE (Only on ESP32) to allow the user
# to provision wifi credentials to the device.
esp32_improv:
  authorizer: none

# To have a "next url" for improv serial
web_server:


switch:
# module restart
  - platform: restart
    name: "${friendly_name} Restart"

# halt module
  - platform: shutdown
    name: "${friendly_name} Stop"
# test output
  - platform: gpio
    id: james
    pin: 
      number: GPIO4
      mode:
        output: true

# test input
binary_sensor:
  - platform: gpio
    id: input_1
    pin: 
      number: 36
      mode: input



Explanation in last sentence:

  • internal (Optional, boolean): Mark this component as internal. Internal components will not be exposed to the frontend (like Home Assistant). Only specifying an id without a name will implicitly set this to true.

To expose entity to HA it must have a name. id is for internal purposes - to address in lambdas, actions, etc.

Masterzz,
Thank you so much I have been tearing my hair out for days trying to work out what I was doing wrong! As simple as a name!