Athom Human Presence Sensor mmwave (share your experiences)

Best sensor I have in my house… i have 5 of them around the house and they are spot on (at least for me) works like a charm and never fail me.

Use both the PIR and mmWave sensors as triggers to turn “on” your light. Use the mmWave as an “off” trigger.

Does anyone know how to turn off the LED permanently? If I turn it off via GUI or web interface, it’ll go back on after some time.

I’m using blakkader’s modified version so I’ve opened up an issue but maybe there’s a workaround without having to modify the firmware

‘# out lines 120 to 125 in the yaml.

Yaml is the workaround!

Anyone having the situation that sometime the presence sensor is not going back to “off”?

Only restarting the device then set it back.

For me the presence sensor worked flawless for months and then got stuck.
I assumed it was because he got power from the nuc running homeassistant and it happened right after restarting the device.
Unfortunately also another power source and installing the default config or resetting did not help so i removed it from power for a day or two and now it works ok-ish.
Only thing i noticed is, that it takes 1min + to reset detection after there is no more movement :confused:
This is my config at the moment: https://github.com/Nailik/EspHomeConfigs/blob/521d050800a0b2e3e72219b0fa807666461859de/athom-presence-sensor.yaml

Main difference is that i removed the led and set the lux sensor to update more frequently because in the beginning i had it to turn the lights only on when it is dark and the issue was that when someone left the room and reentered it sometimes the lux didn’t update and therefore didn’t turn on the light.

Hi guys,

i bricked my Athom Presence Sensor during an update via WIFI.
Now the device can’t be flashed via USB (CH430C) - (second device works flawless via USB).

So i think via TTL → USB Adapter it could work to flash the right firmware, but I don’t know how to connect the PINS correct.

Hope you can help me to make the sensor work again

Here are the Pins on the board - but I’dont know which i need to connect.

P1 = Boot
P1 = Ground
J1 = 3V3
J1 = RXD
J1 = TXD
J1 = Ground

Thank you :wink:

Hi sparkydave (and everyone else reading this!) I would also like to flash Blakadder’s ESPHome config on my two Athom PS01 Presence Sensors, but I’m new to Home Assistant and would appreciate guidance on how to do this. I’ve reviewed the ESPHome docs and Athom’s docs (Athom’s are very minimal, kind of a joke) but am not sure how to proceed.

I want to flash Blakadder’s version because whatever is running on my PS01s now makes them very slow to rejoin the wifi network and go online. If I power cycle a PS01 it won’t always join the network right away… I need to restart Home Assistant and sometimes even reboot the entire Home Assistant server (Raspberry Pi) in order for the devices to show up again. I need to get this fixed so I don’t have to restart Home Assistant every time there’s a power outage and my PS01s power cycle.

To summarize I’m running Home Assistant OS (v11.5) on a Raspberry Pi. I have installed ESPHome dashboard. When I got the Athom PS01 (two of them) from Athom two days ago, I followed their minimal directions to set up the PS01s: Plug in PS01, connect to wifi on my phone, find Athom’s SSID, connect, enter SSID/password for my network. PS01 joins network. Next go to Home Assistant, find discovered device and add it/config. That worked fine and my PS01s were in Home Assistant and I could config them with automations. I even moved them around a couple of times (unplug, reorient to hide cable, plug in again) and they were back online in less than 2 min each time.

After a day I noticed in the ESPHome web UI that the two devices were showing up with an “Adopt” option. I clicked “Adopt” for each one and followed the steps to have ESPHome “adopt” the devices. Code was compiled and installed and the devices rejoined the network OK. According to Device Info both are running Firmware 2023.12.9.

I think to install Blakadder’s config from Blakadder’s ESPHome Configurations | esphome-configs I need to go into ESPHome Web UI, click “EDIT” for the PS01 device I want to edit, and replace the yaml that shows up there with Blakadder’s. Do I also need to ensure my api encryption key and wifi SSID and password are in the config? I noticed those settings are in my current yaml cfg for these devices, but do not exist in Blakadder’s config.

I just want to make sure I follow the right process and don’t “brick” these devices. I really like the PS01… it works great. I just need it to be able to recover from a power outage. When I first added them to Home Assistant using Athom’s minimal process they were able to recover from a power outage fine. It seems after installing the firmware (adopting the PS01 into ESPHome UI) I am having this issue where the PS01 doesn’t want to rejoin the network/come online in Home Assistant, without a hard reboot of the system.

Thanks for the guidance - first time using ESPHome (been using Home Assistant for 5 months).

I have lots of automations set up using motion sensors, door sensors etc. and recently began adding presence sensors. I also bought a Tuya ZY-M100 but that thing is flaky. I had to add another Zigbee coordinator running Zigbee2MQTT in order to get that thing to be configurable, and it locks up every 2 days (so hooked it up to smart plug and power cycle every day to keep it functional). Also got a Linptech ES1 but set it up in ZHA before I got the Zigbee2MQTT set up so right now it’s just got basic presence sensing. I may try moving it to the other Zigbee network at some point.

I prefer the PS01 as it was easy to add to Home Assistant, is very responsive, has PIR and mmWave sensing as well as light/lux sensor. Hoping I can get this silly issue fixed with it not recovering gracefully from a power cycle… was thinking this would be the unit to go with but if I can’t get this working I don’t think I will be buying more of them!

Appreciate the help. :slightly_smiling_face:

Yes, just add as needed.

Here is my version of the Blakadder one which includes wifi settings.

substitutions:
  name: "alfresco-presence-sensor"
  friendly_name: "Alfresco Presence Sensor"
#  room: ""
  device_description: "mmwave radar human presence sensor"
  project_name: "Athom Technology.Presence Sensor"
  project_version: "1.0-blak"
  pir_delay_off: "1s" # set the PIR no occupancy delay here, it also influences delay for Occupancy sensor

esphome:
  name: "${name}"
  friendly_name: "${friendly_name}"
  name_add_mac_suffix: true
  project:
    name: "${project_name}"
    version: "${project_version}"

esp8266:
  board: esp8285
  restore_from_flash: True

logger:

api:

ota:

mdns:
  disabled: false

web_server:
  port: 80

wifi:
  ssid: !secret wifi_ssid_not_1
  password: !secret wifi_password_not_1
  manual_ip:
    static_ip: 192.168.30.181
    gateway: 192.168.30.1
    subnet: 255.255.255.0

captive_portal:

dashboard_import:
  package_import_url: github://blakadder/esphome-configs/athom_ps01.yaml

light:
  - platform: status_led
    name: "Status LED"
    id: led
    pin: GPIO16
    disabled_by_default: true
    entity_category: config

i2c:
  sda: GPIO4
  scl: GPIO5
  scan: true

uart:
  tx_pin: GPIO15
  rx_pin: GPIO13
  baud_rate: 115200
  # debug:
  #   direction: BOTH
  #   dummy_receiver: true
  #   after:
  #     delimiter: "\n"
  #   sequence:
  #     - lambda: UARTDebug::log_string(direction, bytes);


binary_sensor:
  - platform: status
    name: "Status"

  - platform: gpio
    pin:
      number: GPIO0
      mode: INPUT_PULLUP
      inverted: true
    name: "Button"
    disabled_by_default: true
    internal: true
    on_multi_click:
      - timing:
          - ON for at least 10s
        then:
          - button.press: factory_reset_device

  - platform: gpio
    pin:
      number: GPIO14
      mode:
        input: true
        pullup: true
    name: "Pir Sensor"
    id: pir
    filters:
#      - delayed_on: 50ms
#      - delayed_off: 500ms
       - delayed_off: ${pir_delay_off}
    device_class: motion
#    on_press:
#      then:
#        - light.turn_on: led

  - platform: gpio
    pin:
      number: GPIO12
      mode:
        input: true
        pullup: true
    name: "mmWave Sensor"
    id: mmwave
#    filters:
#      - delayed_on: 50ms
    device_class: occupancy
    on_press:
      then:
        - light.turn_on: led
    on_release:
      then:
        - light.turn_off: led


  - platform: template
    name: "Occupancy"
    id: occupancy
    device_class: occupancy
    lambda: |-
      if ( id(mmwave).state or id(pir).state) {
        return true;
      } 
      else if (id(mmwave).state == 0 and id(pir).state == 0) {
        return false;
      } 
      else {
        return id(occupancy).state;
      }
  
sensor:
  - platform: uptime
    name: "Uptime Sensor"

  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    update_interval: 60s

  - platform: bh1750
    name: "Light Sensor"
    address: 0x23
    update_interval: 5s

switch:
  - platform: template
    name: "mmWave Status"
    id: "mmwave_sensor"
    internal: true
    entity_category: config
    optimistic: true
    restore_mode: DISABLED
    turn_on_action:
      - uart.write: "sensorStart\r\n"
    turn_off_action:
      - uart.write: "sensorStop\r\n"

number:
  - platform: template
    name: Farthest Detection          #Value range: 1.9 ~ 12m  Default: 6 
    id: Farthest_Detection
    entity_category: config
    min_value: 1.9
    max_value: 12
    initial_value: 6
    optimistic: true
    step: 0.1
    restore_value: true
    unit_of_measurement: m
    mode: box
    set_action:
      - switch.turn_off: mmwave_sensor
      - delay: 500ms
      - uart.write: !lambda 
          std::string ranges = "setRange 1.8 " + str_sprintf("%.1f",id(Farthest_Detection).state) + "\r\n";
          return std::vector<uint8_t>(ranges.begin(), ranges.end());
      - delay: 500ms
      - uart.write: "saveConfig\r\n"
      - delay: 500ms
      - switch.turn_on: mmwave_sensor

  - platform: template
    name: Maintain Sensitivity          #Value range: 0 ~ 9   Default Maintain sensitivity: 7 
    id: Maintain_Sensitivity
    entity_category: config
    min_value: 0
    max_value: 9
    initial_value: 7
    optimistic: true
    step: 1
    restore_value: true
    mode: slider
    set_action:
      - switch.turn_off: mmwave_sensor
      - delay: 500ms
      - uart.write: !lambda 
          std::string sensitivitys = "setSensitivity " + str_sprintf("%.0f",id(Maintain_Sensitivity).state) + " " + str_sprintf("%.0f",id(Trigger_Sensitivity).state) + "\r\n";
          return std::vector<uint8_t>(sensitivitys.begin(), sensitivitys.end());
      - delay: 500ms
      - uart.write: "saveConfig\r\n"
      - delay: 500ms
      - switch.turn_on: mmwave_sensor

  - platform: template
    name: Trigger Sensitivity           #Value range: 0 ~ 9   Default Trigger sensitivity: 5
    id: Trigger_Sensitivity
    entity_category: config
    min_value: 0
    max_value: 9
    initial_value: 5
    optimistic: true
    step: 1
    restore_value: true
    mode: slider
    set_action:
      - switch.turn_off: mmwave_sensor
      - delay: 500ms
      - uart.write: !lambda 
          std::string sensitivityss = "setSensitivity " + str_sprintf("%.0f",id(Maintain_Sensitivity).state) + " " + str_sprintf("%.0f",id(Trigger_Sensitivity).state) + "\r\n";
          return std::vector<uint8_t>(sensitivityss.begin(), sensitivityss.end());
      - delay: 500ms
      - uart.write: "saveConfig\r\n"
      - delay: 500ms
      - switch.turn_on: mmwave_sensor

  - platform: template
    name: Detection Delay      #Confirmation delay      Value range: 0 ~ 100  default 0.050 seconds.
    id: Detection_Delay
    entity_category: config
    min_value: 0.05
    max_value: 60
    initial_value: 0.05
    optimistic: true
    step: 0.05
    mode: box
    restore_value: true
    unit_of_measurement: seconds
    set_action:
      - switch.turn_off: mmwave_sensor
      - delay: 500ms
      - uart.write: !lambda |-
          std::string detections = "setLatency " + str_sprintf("%.1f",id(Detection_Delay).state) + " " + str_sprintf("%.0f",id(Fading_Time).state) + "\r\n";
          return std::vector<uint8_t>(detections.begin(),detections.end());
      - delay: 500ms
      - uart.write: "saveConfig\r\n"
      - delay: 500ms
      - switch.turn_on: mmwave_sensor

  - platform: template
    name: Fading Time           #Fade-out delay        Value range: 0.5 ~ 1500, default 15 seconds.
    id: Fading_Time
    entity_category: config
    min_value: 0.5
    max_value: 300
    initial_value: 15
    optimistic: true
    step: 0.5
    restore_value: true
    unit_of_measurement: seconds
    mode: auto
    set_action:
      - switch.turn_off: mmwave_sensor
      - delay: 500ms
      - uart.write: !lambda |-
          std::string fadings = "setLatency " + str_sprintf("%.1f",id(Detection_Delay).state) + " " + str_sprintf("%.0f",id(Fading_Time).state) + "\r\n";
          return std::vector<uint8_t>(fadings.begin(), fadings.end());
      - delay: 500ms
      - uart.write: "saveConfig\r\n"
      - delay: 500ms
      - switch.turn_on: mmwave_sensor

  - platform: template  
    name: Blockade Time                  #Configure block time        Value range: 1 ~ 255, default 1 seconds.
    id: Blockade_Time
    entity_category: config
    min_value: 1
    max_value: 255
    initial_value: 1
    optimistic: true
    step: 1
    restore_value: true
    unit_of_measurement: seconds
    mode: box
    set_action:
      - switch.turn_off: mmwave_sensor
      - delay: 500ms
      - uart.write: !lambda 
          std::string blockades = "setInhibit " + str_sprintf("%.0f",x) + "\r\n";
          return std::vector<uint8_t>(blockades.begin(), blockades.end());
      - delay: 500ms
      - uart.write: "saveConfig\r\n"
      - delay: 500ms
      - switch.turn_on: mmwave_sensor

button:
  - platform: factory_reset
    name: Restart with Factory Default Settings
    id: Reset
    entity_category: config 
    internal: true
  - platform: template
    name: "Reset device"
    id: "factory_reset_device"
    entity_category: config
    internal: true
    on_press:
      - switch.turn_off: mmwave_sensor
      - delay: 500ms
      - uart.write: "resetCfg\r\n"
      - delay: 1s
      - switch.turn_on: mmwave_sensor
      - button.press: Reset
  - platform: restart
    name: Restart_esp
    id: restart_esp
    entity_category: config 
    internal: true
  - platform: template
    name: "Restart_mmWave"
    id: "restart_mmwave"
    entity_category: config
    internal: true
    on_press:
      - uart.write: "resetSystem\r\n"

  - platform: template
    name: Restart device
    entity_category: config
    on_press:
      - button.press: restart_mmwave
      - delay: 1s
      - button.press: restart_esp

text_sensor:
  - platform: wifi_info
    ip_address:
      name: "IP Address"
    ssid:
      name: "Connected SSID"
      disabled_by_default: true
    mac_address:
      name: "Mac Address"
      disabled_by_default: true
     
time:
  - platform: sntp
    id: my_time
1 Like

Thank you @sparkydave for the info and for including your example config. In my prior reply I wrote:

So to be clear, in order to edit & apply the updates to my PS01, I need to go to ESPHome Web UI, click “EDIT” for the PS01 device I want to edit, replace the yaml (and include my api encryption key, as well as WiFi settings). Then, I click the “INSTALL” option on that same screen where I enter the yaml. Is that correct?

Appreciate your assistance with this, as I’ve never updated a yaml config for a ESPhome device (and I couldn’t find documentation on it for this device). Thank you.

Yep, that’s the correct process. Make sure your device name stays the same with the new config code.

Will do! Thank you for the information. After I’ve had a chance to try this I’ll update the thread. :+1:

OK, so I followed the steps on one of my PS01s and I have the same issue: Upon restart the blue light on the front just blinks for minutes. I did the power cycle (unplug PS01, wait 10 seconds, plug back in) 10 minutes ago and it’s still got a blinking blue light on the front and all sensors for this PS01 device show up as “Unavailable” in my Home Assistant dashboard. :laughing:

So my home network is using DHCP to assign IP addresses. I did not set up an IP reservation for this device in my DHCP server… is that necessary? I noticed the IP it had before doesn’t respond to pings, but looking at the IP assignments in my router app shows that the sensor still has the same IP assigned… looks like it is not even coming onto the network.

To summarize, these are the steps I followed.

  • In ESPHome Web UI, clicked “EDIT” for the PS01 device I want to edit, replace the yaml (and include my api encryption key, as well as WiFi settings).
  • Then, I click the “INSTALL” option on that same screen where I enter the yaml
  • An error was returned that “HOSTNAME can only be 24 characters max” so I cancelled this, then renamed the HOSTNAME to something shorter (16 characters). That had to compile and update the program to the device. That worked OK.
  • Then I went to ESPHome Web UI, clicked “EDIT” for the PS01 device I want to edit, replaced the yaml (and included my api encryption key, as well as WiFi settings) and clicked “INSTALL” on the device to update. This time no errors, it asked how to install the update.
  • I installed the update wirelessly/OTA. ESPHome compiled the code and uploaded it to the device.
  • The upload was successful (“INFO OTA successful” and “Successfully uploaded program”).
  • I tested the sensor by walking in front of it and mmWave, PIR and Occupancy as well as Light worked as expected.
  • Next I wanted to do a power cycle test to see if it comes back online fast. I unplugged the PS01, waited 10 seconds, and plugged it back in.
  • Now I am in the same spot I was before with the prior firmware update… the device doesn’t seem to be reconnecting to Home Assistant.

As I finish this update it’s been 20 minutes and the blue light on front of the device is still flashing. Does anyone have any ideas what I could try next? Both PS01 devices show the same behavior so I don’t think it’s a single flaky device. When I first got the devices they were joined to Home Assistant but not adopted by ESPHome. In that state I could not update firmware on the devices, but they were able to recover quickly from a power cycle (<1 minute). Now they never seem to connect unless I restart Home Assistant or reboot the Home Assistant server, which is a big annoyance. Thanks for any tips.

It’s definitely best to assign fixed IP addresses to your devices, either via assignments in the router or on the device itself.

1 Like

One other detail I left out above @sparkydave: After the update was finished I went back into ESPHome Web UI, adopted the newly-installed device and deleted the old device (the old name, recall I had to rename it to update the yaml). When I adopted the device I clicked “skip” on install as I did not want to overwrite anything I had just installed. Just including that in case it is important… thanks.

Hi @sparkydave & everyone else reading this, shortly before writing this I noticed the PS01 sensor came back online… 28 minutes after I plugged it back in!!! I wish I knew why it took so long to come back online. Nearly 30 minutes to return to a usable state is way too long. I am going to leave the other PS01 on the “Athom firmware/yaml” so I could compare behavior between the two.

OK, I created DHCP IP reservations for these two PS01 devices in the router. Now they will always have the same IP addresses. I am not sure what else I could do with these to try to fix them. It should not take nearly 30 minutes to recover from a power cycle. Anyone have any suggestions? Thanks!

Yeah, that’s definitely not normal. Mine come back online within seconds.

OK @sparkydave, I think creating IP allocations via DHCP did the trick. I did two power cycle tests with both devices. Unplugged both, waited 20 seconds, plugged back in. Both were back online, pingable and working again in about 54 seconds.

That’s much better than nearly 30 minutes for the last test of the PS01 I updated the YAML on. Based on this I don’t think the YAML/Athom firmware was the cause, but perhaps the fact I wasn’t reserving IP addresses for these Athom devices in my router’s DHCP table.

I will try a few other tests over the upcoming days, but I’m hoping this DHCP IP allocation trick fixed it. Thank you for the suggestion! And I appreciate the help in explaining how to update YAML/compile code for ESPHome devices. :grinning:

It is worth reading the following section on

My node keeps reconnecting randomly

Most of the issues are solved by setting fixed IP and turning on “Use ping for status”. You can find this in the ESPHome add-on as below

My nodes reconnect after a reboot within a few seconds

1 Like

Thank you @JulianDH ! I made the change in the config to use ping for checking status.

Then I restarted esphome… I did a power cycle of the two devices and one came back in about 25 seconds and another in 15 seconds. So that is definitely better than before, when it was almost a minute.

If I can keep the restart time down to 1 minute or less after a power cycle, I’m very satisfied, since the only time these will probably go offline is during a power outage (which is rare). Thanks again for the helpful info. :wink: