[APP][Pro] Esphome Controller App

Hello everyone,
I have developed an application to add Esphome devices to Homey Pro and released a test version.
When adding an Esphome device, give the device a name, enter its IP address and Encryption Key information.

I hope you like the app and look forward to your feedback! I will try to respond to all requests as quickly as possible, but since I have a regular job, I will try to resolve issues as quickly as possible.

  • PayPal Support: If you like my work and want to buy me a coffee: PayPal.Me
3 Likes

Congratulations! Is this the official ESPHome app that @Doekse has been talking about?

Thank you, I made this app myself. @Doekse, adding devices to the app he made was a bit more difficult. If there are any bugs in the first version, I will try to fix them over time.

@ugrbnk Thanks for the new app. My Konnected Garage Door Opener (GDO V2 White) running ESPhome 2025.12.7 was very easy to connect using the new app. Unfortunately it sees the device as a fan or something. What information can I supply to help troubleshoot the issue?

Hi @ugrbnk,

I"ve experimented with a presence sensor.
It seems to connect well, the temperature and humidity entities are functional, but there it ends for now;
The result seems to be part of a default or template device for a fan.

Pro 2026 v12.11.0
App v1.0.21
ESPhome v2026.1.3

H.A. ESP:

Homey:


.
I noticed you changed the app id from
com.esphome.homey
to
com.ugrbnk.esphome
but it’s not in the changelog. But maybe it’s not needed in the early versions.

Thank you, I will fix the problem.

@ugrbnk Configuration info for Konnected Garage Door Opener. Thanks for the putting an effort into this.

I sent a new test version. Would you mind trying it out?

@ugrbnk Testing v1.0.25. Progress for sure my friend but not there yet. I ran through the THEN cards and check what the door did and the ESPhome log. See crude test report below. This link to the Konnected GDO White API should help. Let me know what I can do here. Is there a better way to communicate?

ESPhome Controller v1.0.25 Test Report for Konnected GDOV2 White

I sent a new test version. I may need your Yml file for better support.

@ugrbnk Test results for the v1.0.29 follows. I don’t have a yaml file using Homey. However, you the Konnected Yaml info between the Konnected link posted yesterday and the one below. Thanks again for taking on the ESPhome interface to Homey.

1 Like

Hello UÄźur,

If you’d like to extend the presence sensor entities/capabilities it’ll be very much appreciated.

Here’s the sensor yaml:

esphome:
  name: "presence-badkamer"
  friendly_name: "Presence Badkamer"
  includes:
    - uart_read_line_sensor_ld2410v3.h
  on_boot:
    priority: -100
    then:
      - script.execute: get_config

esp32:
  board: esp32-s2-saola-1
  framework:
    type: arduino

# Enable logging
logger:
  baud_rate: 0
  logs:
    sensor: INFO # DEBUG level with uart_target_output = overload!
    binary_sensor: INFO
    text_sensor: INFO

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxx"

ota:
  - platform: esphome # uncomment when needed after 2024.6 update
    password: !secret presence_badkamer_ota
    #num_attempts: 3 
    #safe_mode: none

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  #use_address: 192.168.
  # Manual IP if needed
  #manual_ip: 
    #static_ip: 192.168.
    #gateway: 192.168.
    #subnet: 255.255.255.0


  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "PB Hotspot"
    password: "xxxxx"

substitutions:
  device_name: dev-sensor

web_server:
  port: 80
  version: 2
  include_internal: true
  ota: false

# Workaround for deprecation of custom_components:
# https://github.com/robertklep/esphome-custom-custom_component:
external_components:
  - source:
      type: git
      url: https://github.com/robertklep/esphome-custom-component
    components: [ custom, custom_component ]

captive_portal:

uart:
  id: uart_bus
  tx_pin:
    number: GPIO18
  rx_pin:
    number: GPIO33
  baud_rate: 256000
  parity: NONE
  stop_bits: 1

switch:
  - platform: safe_mode
    name: "Use safemode"
    id: use_safemode

  - platform: template
    name: "Config mode"
    id: configmode
    optimistic: true
    # assumed_state: false
    turn_on_action:
      # - switch.turn_off: engineering_mode
      - lambda: 'static_cast<LD2410 *>(ld2410)->setConfigMode(true);'
      - delay: 100ms
      - script.execute: clear_targets
    turn_off_action:
      - lambda: 'static_cast<LD2410 *>(ld2410)->setConfigMode(false);'

  - platform: template
    name: "Show Target stats"
    id: show_stats
    optimistic: true
    internal: true
    turn_off_action:
      - script.execute: clear_targets

text_sensor:
  - platform: template
    name: "Uptime human"
    id: uptime_human_readable
    icon: mdi:clock-start
    update_interval: 60s

sensor:
  - platform: uptime
    name: "Uptime"
    id: uptime_sensor
    update_interval: 60s
    internal: true
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human_readable
            state: !lambda |-
                      int seconds = round(id(uptime_sensor).raw_state);
                      int days = seconds / (24 * 3600);
                      seconds = seconds % (24 * 3600);
                      int hours = seconds / 3600;
                      seconds = seconds % 3600;
                      int minutes = seconds /  60;
                      seconds = seconds % 60;
                      return (
                        (days ? to_string(days)+"d:" : "00d:") +
                        (hours ? to_string(hours)+"h:" : "00h:") +
                        (minutes ? to_string(minutes)+"m:" : "00m:") +
                        (to_string(seconds)) +"s"
                      ).c_str();

  - platform: custom # Deprecated - currently crashes ESP32
    lambda: |-
      auto uart_component = static_cast<LD2410 *>(ld2410);
      //return {uart_component->movingTargetDistance,uart_component->movingTargetEnergy,uart_component->stillTargetDistance,uart_component->stillTargetEnergy,uart_component->detectDistance};
      return {};
    sensors:

  - platform: template
    name: "Target Moving Distance"
    id: movingTargetDistance
    unit_of_measurement: "cm"
    accuracy_decimals: 0
    internal: false

  - platform: template
    name: "Target Moving Energy"
    id: movingTargetEnergy
    unit_of_measurement: "%"
    accuracy_decimals: 0
    internal: false

  - platform: template
    name: "Target Still Distance"
    id: stillTargetDistance
    unit_of_measurement: "cm"
    accuracy_decimals: 0
    internal: false

  - platform: template
    name: "Target Still Energy"
    id: stillTargetEnergy
    unit_of_measurement: "%"
    accuracy_decimals: 0
    internal: false

  - platform: template
    name: "Distance Detection"
    id: detectDistance
    unit_of_measurement: "cm"
    accuracy_decimals: 0
    internal: false

  - platform: dht
    pin: GPIO9
    temperature:
      name: "Temperature"
      id: temperature
      filters:
        - offset: -1.0
        - sliding_window_moving_average:
            window_size: 10
            send_every: 10
    humidity:
      name: "Humidity"
      id: humidity
      filters:
        - sliding_window_moving_average:
            window_size: 10
            send_every: 10
    update_interval: 10s
    model: DHT11

  - platform: adc
    pin: GPIO3
    name: "Illuminance"
    id: illuminance
    update_interval: '60s'
    unit_of_measurement: lux
    filters:
      - lambda: |-
          return ((x / 10000.0) * -20000000.0) + 1635;
          // KY-018 background: https://community.home-assistant.io/t/126274/11
          // https://community.home-assistant.io/t/126274/17

custom_component:
  - lambda: |-
      return {new LD2410(id(uart_bus))};
    components:
      - id: ld2410

binary_sensor:
  - platform: gpio
    name: "Detectie"
    id: mmwave_presence_ld2410
    pin: GPIO5
    device_class: occupancy
    on_state:
      then:
        - if:
            condition:
              - binary_sensor.is_off: mmwave_presence_ld2410
            then:
              - delay: 150ms
              - script.execute: clear_targets

number:
  - platform: template
    name: "Max Distance"
    id: maxconfigDistance
    unit_of_measurement: "m"
    min_value: 0.75
    max_value: 6
    step: 0.75
    mode: slider #default: slider
    update_interval: never
    optimistic: true
    set_action:
      - switch.turn_on: configmode
      - delay: 50ms
      - lambda: |-
          auto uart_component = static_cast<LD2410 *>(ld2410);
          uart_component->setMaxDistancesAndNoneDuration(x/0.75,x/0.75,id(noneDuration).state);
      - delay: 50ms
      - lambda: 'static_cast<LD2410 *>(ld2410)->queryParameters();'
      - delay: 50ms
      - switch.turn_off: configmode

  - platform: template
    name: "Sensitivity T.hold"
    id: allSensitivity
    unit_of_measurement: "%"
    min_value: 10
    max_value: 100
    step: 2 #5
    mode: slider # default: slider
    update_interval: never
    optimistic: true
    set_action:
      - switch.turn_on: configmode
      - delay: 50ms
      - lambda: |-
          auto uart_component = static_cast<LD2410 *>(ld2410);
          uart_component->setAllSensitivity(x);
      - delay: 50ms
      - lambda: 'static_cast<LD2410 *>(ld2410)->queryParameters();'
      - delay: 50ms
      - switch.turn_off: configmode

  - platform: template
    name: "Motion Hold"
    id: noneDuration
    min_value: 0
    # max_value: 32767
    max_value: 200
    unit_of_measurement: "s"
    step: 2
    mode: slider
    update_interval: never
    optimistic: true
    set_action:
      - switch.turn_on: configmode
      - delay: 50ms
      - lambda: |-
          auto uart_component = static_cast<LD2410 *>(ld2410);
          uart_component->setMaxDistancesAndNoneDuration(id(maxconfigDistance).state, id(maxconfigDistance).state, x);
      - delay: 50ms
      - lambda: 'static_cast<LD2410 *>(ld2410)->queryParameters();'
      - delay: 50ms
      - switch.turn_off: configmode

button:
  - platform: restart
    name: "Restart ESP"
    id: restart_esp
    entity_category: diagnostic
    on_press:
      - switch.turn_on: configmode
      - delay: 50ms
      - lambda: 'static_cast<LD2410 *>(ld2410)->factoryReset();'
      - delay: 150ms
      - lambda: 'static_cast<LD2410 *>(ld2410)->reboot();'
      - delay: 150ms

script:
  - id: get_config
    then:
      - switch.turn_on: configmode
      - delay: 500ms
      - lambda: 'static_cast<LD2410 *>(ld2410)->queryParameters();'
      - delay: 500ms
      - switch.turn_off: configmode

  - id: clear_targets
    then:
      - lambda: |-
          //id(hasTarget).publish_state(0);
          //id(hasMovingTarget).publish_state(0);
          //id(hasStillTarget).publish_state(0);
          id(movingTargetDistance).publish_state(0);
          id(movingTargetEnergy).publish_state(0);
          id(stillTargetDistance).publish_state(0);
          id(stillTargetEnergy).publish_state(0);
          id(detectDistance).publish_state(0);

and below’s the entities what Home Assistant comes up with

  • the number entities should be added to Homey as slider with these min - max values:
    • max_distance 0 - 6 / 2 digits
    • motion_hold 0 - 200 / 0 digits
    • sensitivity_thold 10 - 100 / 0 digits
binary_sensor.occupancy
button.restart_esp
number.max_distance (m)
number.motion_hold (s)
number.sensitivity_thold (%)
sensor.distance_detection (cm)
sensor.humidity (%)
sensor.illuminance (lux)
sensor.target_moving_distance (cm)
sensor.target_moving_energy (%)
sensor.target_still_distance (cm)
sensor.target_still_energy (%)
sensor.temperature (°C)
sensor.uptime_human (string)
switch.config_mode
switch.safe_mode
switch.show_target_stats

At the moment, this is what works, except for the dim capability

The dim capability errors with

Let me know if you need more info / testing.

Thanks!

Hello, I tried to provide support. I created a test driver for you. Add it with the general Esphome driver. If you report the problematic parts, I will do my best. Have a nice day.

iPhone’umdan gönderildi

Hello, I tried to provide support. I created a test driver for you. Add it with the general Esphome driver. If you report the problematic parts, I will do my best. Have a nice day.

Thank you.
This is the result, all currently added capabilities work, except for signal_strength; but that’s because my sensor hasn’t such an entity.

I used the general Esphome driver

They look like the same distance entity in Insights.

As a comparison, the H.A. graphs



1 Like

After updating to v1.0.53 I can’t select the app anymore to add new devices.
The app doesn’t seem to start
Diag:
37e900c6-8050-4339-986f-17be12c8ee07

When I press “Restart” it shows:

Yes, I am aware of the issue. Currently, I believe there is a problem with the Homey App Store; it is not downloading the packages correctly.

This phenomenon occurred with an other app as well, it was solved by publishing/uploading the app version again.

Just FYI, the stable version installs without issues.

I’ve sent many new versions so far, but the same problem occurred with all of them. I’ll wait for the system to be fixed. It contains fixes for your presence sensor.