I constantly forget to take showers due to depression. I know I’m not the only one 😂 summer is early here in Texas and I don’t want to be the stinky dude
Uses the humidity readings of my bathroom to determine whether I was in the shower:
- A running 1 hour average of the bathroom humidity is measured.
- If the current humidity is 8% above the average, it is triggered as “wet”.
- Then it marks down the last time, and then converts that to “days & hours since” last shower.
I have a badge at the top of my main dashboard that will let me know how long it’s been. It’s already been useful. If I see anything over 2 days I know it’s past time for a shower
I got a false positive from washing my hands when it was set to trigger by 5% increases, so I changed it to 8%.
Happy to share my code if anyone wants to do the same!
Edit: code in a comment below!


Would you be able to share your code? I have the same problem possibly due to undiagnosed ADHD instead. I’ve been basically guilt tripping myself (or a parent has) to motivate myself to shower my whole life. Thanks for posting this, it seems like a way more fun way where I can be nerdy about it and still be a functional human being.
Here is my Automation:
alias: Update Last Shower Time description: "" triggers: - entity_id: binary_sensor.showering from: "on" to: "off" trigger: state actions: - data: datetime: "{{ now() }}" action: input_datetime.set_datetime target: entity_id: input_datetime.last_showerYou need to create a ‘DateTime’ helper called “Last Shower” This is where the last shower time will be stored (and can be changed)
You need a ‘Statistics’ Helper too. Call it “Average Bathroom Humidity” and base it on whatever humidity sensor you have. Make it “average linear” then set Max Age to 1 hour. (leave other options default)
Make these template sensors too:
Template Binary Sensor called “Showering”:
{{ (states('sensor.bathroom_sensor_humidity')|float - states('sensor.average_bathroom_humidity')|float) > 9 }}Template Sensor called “Time Since Last Shower”:
% set diff = now() - as_datetime(states('input_datetime.last_shower')).astimezone() %} {% set days = diff.days %} {% set hours = (diff.seconds // 3600) %} {% if days > 0 %} {{ days }} day{{ 's' if days > 1 }} {{ hours }} hour{{ 's' if hours != 1 }} {% else %} {{ hours }} hour{{ 's' if hours != 1 }} {% endif %}Let me know if you hit any snags!
I just got tested myself so I might be in the same boat! Waiting to get the results