A complete smart weather station project built around the Shelly WS90, integrated with Home Assistant via BTHome Bluetooth proxy, enriched with custom sensor templates, a polished Lovelace dashboard, and a real-time SenseCAP Indicator D1 touchscreen display powered by ESPHome.
This project turns a Shelly WS90 outdoor weather station into a fully integrated smart home weather system. All data is collected via Bluetooth (BTHome protocol), processed through custom Home Assistant sensor templates, displayed on a beautiful Lovelace dashboard, and mirrored on a dedicated 4-inch touchscreen display placed indoors.
Key features:
- Real-time weather data from Shelly WS90 via BTHome
- Custom sensor templates: Beaufort scale, wind direction (16 cardinal points), heat index, wind chill, UV category, solar irradiance estimation
- Daily, monthly and yearly rain accumulation via utility meters
- Polished Lovelace dashboard optimized for mobile
- SenseCAP Indicator D1 touchscreen display with LVGL interface
- Bluetooth proxy built into the SenseCAP for extended BLE range
- Boot screen with spinner animation
- Automatic display on/off via time-based automation
| Component | Description |
|---|---|
| Shelly WS90 | Outdoor solar-powered weather station |
| SenseCAP Indicator D1 | 4-inch 480x480 touchscreen display (ESP32-S3 + RP2040) |
| ESP32 Bluetooth Proxy | Any ESP32 running ESPHome as BLE proxy (or use SenseCAP) |
| Home Assistant server | Raspberry Pi, NUC, or any HA-compatible hardware |
Shelly WS90 (outdoor)
β
β Bluetooth (BTHome)
βΌ
ESP32 Bluetooth Proxy βββββββββββββββββββββββββββββββββββ
β β
β WiFi β
βΌ β
Home Assistant β
βββ BTHome Integration β
βββ Custom Sensor Templates (templates.yaml) β
βββ Utility Meters (utility_meter.yaml) β
βββ Lovelace Dashboard β
βββ ESPHome Integration β
β β
β WiFi (API) β
βΌ β
SenseCAP Indicator D1 ββββββββββββββββββββββββββββββββ
βββ LVGL Display (weather data)
βββ Bluetooth Proxy (active)
βββ FT5X06 Touchscreen
βββ README.md
βββ .gitignore
βββ secrets.yaml.example
βββ esphome/
β βββ sensecap-indicator.yaml # SenseCAP ESPHome configuration
βββ homeassistant/
βββ configuration.yaml.example # configuration.yaml additions
βββ templates.yaml # Custom sensor templates
βββ utility_meter.yaml # Rain accumulation meters
βββ logbook_exclude.yaml # Logbook exclude list
βββ dashboard_meteo.yaml # Lovelace dashboard
- Home Assistant with BTHome integration enabled
- Shelly WS90 paired via BTHome
- At least one ESP32 running as Bluetooth proxy
Add to configuration.yaml:
template: !include templates.yaml
utility_meter: !include utility_meter.yaml
logbook:
exclude:
entities: !include logbook_exclude.yamlThe templates.yaml file creates these derived sensors from raw WS90 data:
| Sensor | Description |
|---|---|
sensor.vento_beaufort |
Wind speed on Beaufort scale (0-12) |
sensor.direzione_vento_testo |
Wind direction as text (N, NNE, NE...) |
sensor.velocita_vento_km_h |
Wind speed converted from m/s to km/h |
sensor.raffica_vento_km_h |
Wind gust converted from m/s to km/h |
sensor.temperatura_percepita |
Heat Index when T β₯ 27Β°C (Rothfusz formula) |
sensor.temperatura_wind_chill |
Wind Chill when T β€ 10Β°C (Canadian formula) |
sensor.comfort_termico |
Thermal comfort (Gelido β Afoso) |
sensor.pressione_tendenza |
Pressure with stability category attribute |
sensor.irraggiamento_solare |
Solar irradiance estimated in W/mΒ² from lux |
sensor.categoria_uv |
UV category (Basso β Estremo) per WHO scale |
sensor.condizione_meteo |
General weather condition with dynamic icon |
sensor.stato_batteria_ws90 |
Battery status with dynamic icon |
The utility_meter.yaml creates:
| Sensor | Reset |
|---|---|
sensor.pioggia_giornaliera |
Daily at midnight |
sensor.pioggia_mensile |
Monthly on 1st |
sensor.pioggia_annuale |
Yearly on Jan 1st |
The dashboard is organized in sections:
- Weather condition β prominent card with dynamic icon
- Temperature β current, perceived, wind chill + 48h graph
- Humidity & Pressure β dew point, comfort + graphs
- Wind β speed, gust, Beaufort, direction (vertical layout)
- Rain β current, daily, monthly, yearly + graph
- Solar & UV β lux, W/mΒ², UV index, UV category + separate graphs
- System β battery, voltage, BT signal
Required HACS cards:
mushroom(v5.1.1+)mini-graph-card
The SenseCAP Indicator D1 runs a custom ESPHome firmware that:
- Connects to Home Assistant via native API
- Displays real-time weather data using LVGL graphics
- Acts as an active Bluetooth proxy for extended WS90 range
- Shows a boot screen with spinner animation while connecting
- Turns on/off automatically via HA time-based automation
- Toggles display manually via the physical button
st7701sdisplay driver (480x480 RGB)ft5x06touchscreen controllerlvglfor UI renderingbluetooth_proxyfor BLE forwardingpca9554GPIO expander
βββββββββββββββββββββββββββββββββββββββ β 14:08 29/03/2026 β β Time & Date βββββββββββββββββββββββββββββββββββββββ€ β OUTDOOR TEMPERATURE β β 19.2Β° β β Large temperature (72pt font) β Confortevole β β Comfort level β Parzialmente nuvoloso β β Weather condition βββββββββββββββββββββββββββββββββββββββ€ β HUMIDITY PRESSURE RAIN TODAY UV β β 21% 1001hPa 0.0mm 2.0β βββββββββββββββββββββββββββββββββββββββ€ β Weather Station β Milan, Italy β βββββββββββββββββββββββββββββββββββββββ
- Clone this repository
- Copy
homeassistant/templates.yaml,utility_meter.yamlandlogbook_exclude.yamlto your HA config directory - Add to
configuration.yaml(seeconfiguration.yaml.example) - Restart Home Assistant
- Import the Lovelace dashboard via YAML editor
- Open ESPHome in Home Assistant
- Create a new device named
sensecap-indicator - Copy the content of
esphome/sensecap-indicator.yaml - Copy
secrets.yaml.exampletosecrets.yamland fill in your values - Flash via USB first time, then OTA for updates
- Add the device to Home Assistant when discovered
Create two automations in HA for automatic display control:
- Display ON: Trigger at 06:00 β
light.turn_onβlight.backlight - Display OFF: Trigger at 22:00 β
light.turn_offβlight.backlight
Copy secrets.yaml.example to secrets.yaml and fill in your values:
wifi_ssid: "YourWiFiSSID"
wifi_password: "YourWiFiPassword"
ap_password: "YourFallbackAPPassword"
api_key: "YourESPHomeAPIKey"
ota_password: "YourOTAPassword"
web_username: "admin"
web_password: "YourWebServerPassword"The WS90 transmits these raw sensors via BTHome:
- Temperature, Humidity, Dew point
- Atmospheric pressure
- Wind speed (m/s), Wind gust (m/s), Wind direction (degrees)
- Precipitation (mm)
- Illuminance (lux), UV index
- Battery voltage
All raw data is enriched by sensor templates before being displayed.
- ESPHome β firmware framework
- Home Assistant β smart home platform
- Mushroom Cards β Lovelace cards
- Mini Graph Card β graph cards
- Shelly β WS90 weather station
MIT License β feel free to use, modify and share!

