V0.5.5 - Motion Zones, ESPHome support, Home Assistant Add-on, and Docker installation

Last month I released my project called TOMMY Motion Sensor which transforms ESP32 devices into motion sensors and connects with Home Assistant and Matter ecosystems. My initial release post gained a lot of interest, with many people requesting support for zones and ESPHome integration (to use existing devices).

This is finally ready in v0.5.5 which also includes a Home Assistant Add-on, Docker support and a UI update to the dashboard.

I have created a landing page with installation instructions for both Docker and the Home Assistant Add-on.

For support, feature requests and release updates please join the Discord channel.

I hope you like it! :slight_smile:

This sounds very interesting. Can the ESP32 devices be existing devices setup with ESPHome or do they need to be dedicated for use with TOMMY?

Also I just tried to install it as a Home Assistant Add-On. It all installs fine but I am unable to add a Zone so not able to get any further.

The ESP32 devices can be added to existing ESPHome setups, so no need for dedicated devices. Regarding the zone creation, could I ask you to open a thread in the Discord channel? Then I’ll try to help you debug it :slight_smile:

Does it support ESP32, or do I need a variant of ESP32? Also, I can only get version 0.5, is there no push? What is the timeliness of detecting someone? Is it fast

For now it supports the ESP32-C5, ESP32-C6 and ESP32-S3. And no 0.5.0 is the correct version. I just realized I made a typo in the title :face_with_open_eyes_and_hand_over_mouth:

Why doesn’t ESP32 regular version support it? Is there any special hardware for the variant? Most of the devices at home are ESP32. There are only a few ESP32s3 available

I should be able to support all of them. But there are a few device specific tweaks I need to make to the code. I’m going to order some of the other ESP32 variants one of these weeks and make it work for them too. Which variants do you have?

It’s the ESP32 standard version. Is your project still in memory? My version is 0.5.0, not 0.5.5. Is it still in beta testing? I installed it with addons, not Docker, so I can’t add regions. The logs are as follows

HTTP server running at http://0.0.0.0:8090
Config store location: http://0.0.0.0:8090/config
HTTPS server running at https://0.0.0.0:8091
[2025-10-16T12:43:11.388Z] [Config] INFO: Config constructor with port: 8090
[2025-10-16T12:43:11.389Z] [Config] INFO: Starting config subscription with 1000ms interval at: http://127.0.0.1:8090/config
WebSocket server running on port 8101
[2025-10-16T12:43:11.464Z] [WebSocketClient] INFO: Connecting to WebSocket server...
Client connected: b8lZwOR83k9ryNcDAAAB
[2025-10-16T12:43:11.521Z] [WebSocketClient] INFO: WebSocket connected
[2025-10-16T12:43:11.524Z] [MQTTServer] INFO: Starting...
device-runtime registering
device-runtime registered
e[2m2025-10-16 20:43:11.550 FATAL  e[0;1;90mLogger               e[31mUnhandled error detected: e[0;31mbind EADDRINUSE 0.0.0.0:1884
  e[2;39mat e[0mlistenOnPrimaryHandlee[2m (node:net:2021:18)
  at e[0mrre[2m (node:internal/cluster/child:163:12)
  at e[0mWorker.<anonymous>e[2m (node:internal/cluster/child:113:7)
  at e[0mprocess.onInternalMessagee[2m (node:internal/cluster/utils:49:5)
  at e[0mprocess.emite[2m (node:events:531:35)
  at e[0memite[2m (node:internal/child_process:949:14)
  at e[0mprocess.processTicksAndRejectionse[2m (node:internal/process/task_queues:91:21)e[0m
Error: bind EADDRINUSE 0.0.0.0:1884
    at listenOnPrimaryHandle (node:net:2021:18)
    at rr (node:internal/cluster/child:163:12)
    at Worker.<anonymous> (node:internal/cluster/child:113:7)
    at process.onInternalMessage (node:internal/cluster/utils:49:5)
    at process.emit (node:events:531:35)
    at emit (node:internal/child_process:949:14)
    at process.processTicksAndRejections (node:internal/process/task_queues:91:21)
2025-10-16T20:43:11: PM2 log: App name:device-runtime id:0 disconnected
2025-10-16T20:43:11: PM2 log: App [device-runtime:0] exited with code [0] via signal [SIGINT]
2025-10-16T20:43:12: PM2 log: App [device-runtime:0] starting in -cluster mode-
2025-10-16T20:43:12: PM2 log: App [device-runtime:0] online
[2025-10-16T12:43:19.730Z] [DeviceRuntime] INFO: Starting...
[2025-10-16T12:43:19.742Z] [FileServer] INFO: Starting File server...
HTTP server running at http://0.0.0.0:8090
Config store location: http://0.0.0.0:8090/config
HTTPS server running at https://0.0.0.0:8091
[2025-10-16T12:43:20.153Z] [Config] INFO: Config constructor with port: 8090
[2025-10-16T12:43:20.153Z] [Config] INFO: Starting config subscription with 1000ms interval at: http://127.0.0.1:8090/config
WebSocket server running on port 8101
[2025-10-16T12:43:20.265Z] [WebSocketClient] INFO: Connecting to WebSocket server...
Client connected: gNzBPycnVihlORWGAAAB
[2025-10-16T12:43:20.333Z] [WebSocketClient] INFO: WebSocket connected
[2025-10-16T12:43:20.335Z] [MQTTServer] INFO: Starting...
device-runtime registering
device-runtime registered
e[2m2025-10-16 20:43:20.352 FATAL  e[0;1;90mLogger               e[31mUnhandled error detected: e[0;31mbind EADDRINUSE 0.0.0.0:1884
  e[2;39mat e[0mlistenOnPrimaryHandlee[2m (node:net:2021:18)
  at e[0mrre[2m (node:internal/cluster/child:163:12)
  at e[0mWorker.<anonymous>e[2m (node:internal/cluster/child:113:7)
  at e[0mprocess.onInternalMessagee[2m (node:internal/cluster/utils:49:5)
  at e[0mprocess.emite[2m (node:events:531:35)
  at e[0memite[2m (node:internal/child_process:949:14)
  at e[0mprocess.processTicksAndRejectionse[2m (node:internal/process/task_queues:91:21)e[0m
Error: bind EADDRINUSE 0.0.0.0:1884
    at listenOnPrimaryHandle (node:net:2021:18)
    at rr (node:internal/cluster/child:163:12)
    at Worker.<anonymous> (node:internal/cluster/child:113:7)
    at process.onInternalMessage (node:internal/cluster/utils:49:5)
    at process.emit (node:events:531:35)
    at emit (node:internal/child_process:949:14)
    at process.processTicksAndRejections (node:internal/process/task_queues:91:21)
2025-10-16T20:43:20: PM2 log: App name:device-runtime id:0 disconnected
2025-10-16T20:43:20: PM2 log: App [device-runtime:0] exited with code [0] via signal [SIGINT]
2025-10-16T20:43:21: PM2 log: App [device-runtime:0] starting in -cluster mode-
2025-10-16T20:43:21: PM2 log: App [device-runtime:0] online
[2025-10-16T12:43:28.607Z] [DeviceRuntime] INFO: Starting...
[2025-10-16T12:43:28.623Z] [FileServer] INFO: Starting File server...
HTTP server running at http://0.0.0.0:8090
Config store location: http://0.0.0.0:8090/config
HTTPS server running at https://0.0.0.0:8091
[2025-10-16T12:43:28.984Z] [Config] INFO: Config constructor with port: 8090
[2025-10-16T12:43:28.985Z] [Config] INFO: Starting config subscription with 1000ms interval at: http://127.0.0.1:8090/config
WebSocket server running on port 8101
[2025-10-16T12:43:29.042Z] [WebSocketClient] INFO: Connecting to WebSocket server...
Client connected: wlVtDCcSrsF9s0PqAAAB
[2025-10-16T12:43:29.092Z] [WebSocketClient] INFO: WebSocket connected
[2025-10-16T12:43:29.094Z] [MQTTServer] INFO: Starting...
device-runtime registering
device-runtime registered
e[2m2025-10-16 20:43:29.112 FATAL  e[0;1;90mLogger               e[31mUnhandled error detected: e[0;31mbind EADDRINUSE 0.0.0.0:1884
  e[2;39mat e[0mlistenOnPrimaryHandlee[2m (node:net:2021:18)
  at e[0mrre[2m (node:internal/cluster/child:163:12)
  at e[0mWorker.<anonymous>e[2m (node:internal/cluster/child:113:7)
  at e[0mprocess.onInternalMessagee[2m (node:internal/cluster/utils:49:5)
  at e[0mprocess.emite[2m (node:events:531:35)
  at e[0memite[2m (node:internal/child_process:949:14)
  at e[0mprocess.processTicksAndRejectionse[2m (node:internal/process/task_queues:91:21)e[0m
Error: bind EADDRINUSE 0.0.0.0:1884
    at listenOnPrimaryHandle (node:net:2021:18)
    at rr (node:internal/cluster/child:163:12)
    at Worker.<anonymous> (node:internal/cluster/child:113:7)
    at process.onInternalMessage (node:internal/cluster/utils:49:5)
    at process.emit (node:events:531:35)
    at emit (node:internal/child_process:949:14)
    at process.processTicksAndRejections (node:internal/process/task_queues:91:21)
2025-10-16T20:43:29: PM2 log: App name:device-runtime id:0 disconnected
2025-10-16T20:43:29: PM2 log: App [device-runtime:0] exited with code [0] via signal [SIGINT]
2025-10-16T20:43:30: PM2 log: App [device-runtime:0] starting in -cluster mode-
2025-10-16T20:43:30: PM2 log: App [device-runtime:0] online

If you update the HA Add-on to 0.6.0 you are able to change the MQTT port from 1884 to something else in the add-on configuration to handle that port conflict.

Regarding the ESP32 support, I’m going to order some this week and create support for it. For now you will have to use a C5, C6 or S3 :slight_smile:

Thank you. Upgraded to 0.6.0

1 Like

I would like to ask some questions. I am very interested in your project, but your documentation is not specific enough. I would like to retain the functionality of my original ESPHome device. Can I add the following code to the ESPHome code and use OTA. Also, does it require two ESP devices in an area for the human body sensor to take effect? Is this sensor exposed to HA through your add-on? Or through MQTT?

esp32:
  ...
  variant: ESP32C3
  framework:
    type: esp-idf
    version: 5.4.2
    sdkconfig_options:
      CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM: '128'
      CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM: '128'
      CONFIG_ESP_WIFI_CSI_ENABLED: y
      CONFIG_ESP_WIFI_AMPDU_TX_ENABLED: n
      CONFIG_ESP_WIFI_AMPDU_RX_ENABLED: n
      CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE: n
      CONFIG_PM_ENABLE: n
      CONFIG_ESP_TASK_WDT_TIMEOUT_S: '30'

wifi:
  ...
  power_save_mode: NONE

external_components:
  - source: github://tommy-sense/esphome
    components: [ sensor_tommy ]

I know the documentation is lacking. It’s on my todo for the coming weeks to improve that.

When adding the configuration to ESPHome, you will keep the functionality of the existing device. It’s added on top as an external component.

You need at least 2 devices to create a zone. A zone is exposed as a Matter device which can be integrated in Home Assistant. The dashboard guides you through the whole process. Although a proper Home Assistant Integration, where zones are integrated natively, is in the works and expected to be released in the next couple of weeks.

If you have a Discord user, you are welcome to join the Discord channel. You can keep track of the planned updates there and get support from me and other users :slight_smile:

Also, I see you are trying to use a ESP32-C3. There isn’t official support for that yet, but I have released a version which has experimental support for it. There’s a channel on Discord with a test group for the C3.

I tried it after reading your document that updated esp32c3. I happen to have one esp32s3 and one espc3 at home, so I wanted to give it a try. I am in China and really like your project, but I don’t know how to use Discord. Thank you for your reply, and I will continue to follow up. I have flashed your code into the only two ESP devices that meet the requirements, but it seems to not work. I haven’t found anything in the dashboard. According to the ESPHome official website, there are currently ESP32, ESP32s2, ESP32s3, ESP32c2, ESP32c3, ESP32c5, ESP32c6, ESP32h2 or ESP32p4 devices. As far as I know, the first ESP32 device is the most common, and I suggest you learn about this chip. If possible, I suggest you improve your official website to facilitate our learning.

Which version of TOMMY are you on? Could you try again with the latest version (+0.10.4)?

Regarding the other devices. I have ordered test devices for the other variants which aren’t supported now. I’m hoping to be able to add support as soon as I receive them, which should be tomorrow or start next week :slight_smile:

It has been upgraded to 0.10.4 and can now be used. I missed a line of code in my previous ESPHome, sensor_tommy:, After adding it, it’s enough. He runs very well, occasionally reporting false alarms. May I ask if your sensitivity adjustment on the dashboard is more sensitive as the value increases, or not? What does the retention time in Matter integration mean? This project is very sci-fi and great!

It has been upgraded to 0.10.4 and can now be used. I missed a line of code in my previous ESPHome, sensor_tommy:, After adding it, it’s enough. He runs very well, occasionally reporting false alarms. May I ask if your sensitivity adjustment on the dashboard is more sensitive as the value increases, or not? What does the retention time in Matter integration mean? This project is very sci-fi and great!

1 Like

I’m glad you got it working!

The sensitivity explanation is a bit confusing. I’m going to change that. But the lower the slider is the more sensitive it is. So if you get false positives try to increase the slider.

I’m not entirely sure which retention time you are referring to. But it sounds like something in the Home Assistant’s Matter integration, right? Just keep it at the default. TOMMY handles all of those things internally, so the value is always in sync in Home Assistant.

It’s time in the Matter integration, I don’t know what’s the use of it, what can be changed by modifying the time? I’m still observing the effectiveness of the sensor, and I don’t think it can replace millimeter wave radar in the sensor, but it can be used as a supplement to human in the sensor, or as an extension in special scenarios, such as sleep detection. Because this wifi detection is not fast enough and cannot automatically turn on the lights, it can be used as a complementary solution or as a trigger for leaving home scenarios, provided that there are ESP devices in each area. This project is really interesting, and I look forward to its improvement and continue to pay attention to its accuracy. Thank you, author!

Right now it’s not able to replace the mmWave sensors, but rather motion sensors. But I expect to have stationary presence detection ready in Q1 2026, which should make it able to compete with mmWave :slight_smile:

After increasing the sensitivity value, there were basically no false alarms, and it worked very well. I deployed it in the living room, and it may have been a bit difficult to cover with two ESP devices due to its large area. I estimate that adding two more will solve the problem. But if deployed in the bedroom, there should be no problem with two ESP devices. We look forward to your future human body functioning. Thank you.