Tem(H)u β€” a compact standalone ambient display

Hi everyone! πŸ‘‹

I'd like to share a small DIY project I've been working on: Tem(H)u β€” a compact standalone ambient sensor display showing temperature, humidity and the current time on a beautiful round Waveshare AMOLED screen, powered by ESPHome.


What is it?

Tem(H)u (Temperature + Humidity) combines a Waveshare ESP32-S3 1.75" round AMOLED display with an SHT31 temperature & humidity sensor. It sits anywhere in your home and tells you at a glance whether the air is comfortable β€” no phone, no dashboard required.

At the heart of the display are two counter-rotating arcs. Their color shifts gradually through WHO and ASHRAE Standard 55 health thresholds: a cool blue when values are outside the comfort zone (too cold / too dry), drifting through mint-green in the ideal range, into warm amber and coral as conditions become uncomfortable.

This is not a data display. It is an ambient one.

Automatic display & swipe

Tem(H)u automatically cycles through all three pages β€” no interaction needed. Just place it on your desk and it quietly rotates between temperature, humidity and clock. The page switches every 15 seconds, triggered at the moment the arcs pass the 12 o'clock position for a seamless, natural transition. You can also swipe manually at any time to jump directly to the page you want.

  • 🌑️ Temperature page β€” large value + color arc + 24h trend graph
  • πŸ’§ Humidity page β€” large value + color arc + 24h trend graph
  • πŸ• Clock page β€” current time, date, and today's min/max for temperature & humidity

Photos

Clock page β€” time, date and today's min/max at a glance:

Humidity page β€” coral/red arc signals elevated humidity (above the ASHRAE 65 % comfort threshold):

Temperature page β€” mint-green arc indicates the optimal comfort range (18–22 Β°C per WHO/ASHRAE), with 24h trend graph:


Features

  • πŸ”„ Automatic page cycling β€” rotates through all 3 pages on its own, The page switches every 15 seconds, triggered at the moment the arcs pass the 12 o'clock position for a seamless, natural transition. You can also swipe manually at any time to jump directly to the page you want.
  • πŸ“Š Live readings β€” temperature, humidity & clock always up to date
  • 🎨 Color-coded arc ring β€” smooth color transitions based on WHO & ASHRAE Standard 55 thresholds:
    • 🌑️ Temperature: blue (<16 Β°C) β†’ mint-green (18–22 Β°C, optimal) β†’ amber (22–26 Β°C) β†’ lavender (>26 Β°C) β€” warning activates below 16 Β°C or above 26 Β°C
    • πŸ’§ Humidity: blue (<30 %, too dry) β†’ mint-green (40–60 %, optimal) β†’ amber (>60 %) β†’ coral (>70 %, mold risk) β€” warning activates below 30 % or above 65 %
  • πŸ“ˆ 24h history graph β€” 96 data points Γ— 15 min, auto-scaling Y-axis
  • 🌐 Full web interface β€” all settings configurable at `http://temhu-macro.local`, no app needed
  • πŸ• 45 timezones β€” including DST, fully configurable
  • πŸ“ Calibration offsets β€” temperature & humidity correction built in
  • πŸ“‘ Home Assistant integration β€” optional, via MQTT auto-discovery (no YAML needed, entities appear automatically)
  • πŸ”§ Static IP support β€” with automatic gateway derivation

Hardware

ComponentDetails
Display + MCUWaveshare ESP32-S3 Touch AMOLED 1.75"
SensorSHT31 (IΒ²C, Β±0.2 Β°C / Β±2 % RH)
CaseCustom 3D-printed (available on MakerWorld)
PowerUSB-C 5V

Getting started β€” no YAML, no coding

  1. Wire the SHT31 sensor to the 8-pin header on the back of the display
  2. Flash the pre-built factory firmware via web.esphome.io (Chrome/Edge + USB)
  3. Connect to Wi-Fi using the Captive Portal
  4. Open `http://temhu-macro.local` to configure everything in the browser

No ESPHome add-on, no YAML, no compiling required β€” just flash and go.


Home Assistant integration (optional)

Tem(H)u supports mqtt to integrate with Home Assistant:

  • MQTT auto-discovery β€” enter your broker IP, port and credentials in the web interface at `http://temhu-macro.local`. Tem(H)u publishes all sensor values and sends Home Assistant discovery messages automatically. No YAML, no manual entity setup needed.

Published sensors: temperature, humidity, temperature min/max today, humidity min/max today, ESP chip temperature, Wi-Fi signal strength, uptime.


Links

The full wiring diagram, flash instructions, and all configuration options are documented on GitHub. The 3D case files for the housing and stand are on MakerWorld.

Happy to answer any questions! If you adapt it for different sensors or add features, feel free to fork it on GitHub. 😊

Hi everyone! πŸ‘‹

A new firmware update is available for Tem(H)u Macro β€” v2.1.0.
This release adds three new features and fixes three bugs around timezone handling.


🌍 Language Selection [C5]

The date and weekday shown on the clock page now support four languages. Switch via C5. Language in the web interface at http://temhu-macro.local.

  • πŸ‡©πŸ‡ͺ Deutsch (default)  β†’  Freitag, 18. Juli 2026
  • πŸ‡¬πŸ‡§ English  β†’  Friday, July 18, 2026
  • πŸ‡«πŸ‡· FranΓ§ais  β†’  vendredi, 18 juillet 2026
  • πŸ‡¨πŸ‡Ί EspaΓ±ol  β†’  viernes, 18 de julio de 2026

The web interface itself always stays in English. The setting is saved in Flash and survives reboots.


πŸ’ Dual Ring Mode [A6]

The two decorative arcs can now show two different values at the same time.
Enable via A6. Ring: Dual Mode (outer=Hum, inner=Temp) in the web interface.

ModeOuter ringInner ring
OFF (default)Both rings share the same colour β€” driven by the currently visible page
ONHumidity colourTemperature colour

When Dual Ring Mode is on, the active page metric shows at full brightness and the other at 75% β€” so you always know which page you're on while still seeing both values at a glance. On the clock page both rings always share the same colour, regardless of this setting.


🌐 Auto Timezone β€” IP-based [C6]

Tem(H)u now detects its timezone automatically β€” no manual configuration needed.
It looks up the public IP address of your WiFi and determines the local timezone from that.

  • Uses ip-api.com β€” free, no account or API key required
  • Runs once on startup and refreshes every 6 hours silently in the background
  • Also updates the C3 Timezone dropdown so you can always see what's active
  • Enabled by default β€” can be disabled via C6. Auto Timezone (IP-based)
Where you areWhat Tem(H)u detects
Home in GermanyEurope/Berlin β€” CET/CEST switched automatically
Travelling to JapanAsia/Tokyo β€” picked up after next WiFi connect
Visiting CubaAmerica/Havana β€” CST/CDT switched automatically
No internetLast saved timezone is used from Flash
If your router uses a VPN, the detected country will be the VPN's exit country β€” this is expected behaviour.

πŸ› Bug Fixes

All three fixes are related to timezone handling.

1. Timezone change had no effect on the displayed time
After selecting a different timezone in the web UI, the display kept showing the old time. Power-cycling helped temporarily but the wrong time returned after the next NTP sync. Root cause: setenv("TZ", ...) + tzset() + localtime() silently fail on this ESP-IDF build β€” localtime() always returned UTC regardless of the TZ variable. Fix: replaced the entire timezone conversion chain with utcnow() + manual offset arithmetic + gmtime_r(), which works correctly on this platform.

2. Timezone setting lost after reboot
The selected timezone was forgotten after every power cycle and had to be re-entered manually. Fix: added five NVS-backed globals (standard offset, DST offset, DST start month, DST end month, hemisphere flag) that persist across reboots. The timezone is automatically re-applied from Flash on every boot.

3. Summer / Winter time not switched automatically
DST was never applied β€” the clock stayed on standard time all year round. Fix: automatic DST detection using the stored start and end months. The correct UTC offset is applied every second with no user action required. Southern hemisphere timezones (Australia, New Zealand, Argentina) use inverted switching logic.

Note: the DST transition is month-accurate. In transition weeks (early March, late October) the switch may be a few days off. With Auto Timezone enabled and internet access this corrects itself within 6 hours.

All settings at a glance

CodeSetting
A2Auto-Dim Display
A6Ring: Dual Mode (outer=Hum, inner=Temp) πŸ†•
C1Show Time and Date
C2Time Format (12h AM/PM)
C3Timezone (45 presets)
C4Calibration offsets (Temp / Humidity)
C5Language πŸ†•
C6Auto Timezone (IP-based) πŸ†•
E6MQTT Auto-Discovery

How to update

Via USB β€” flash the factory binary at web.esphome.io (Chrome/Edge, no drivers needed).


Links


Happy to answer any questions! 😊